많은 사이트를 거쳐 구문 분석해야하는 Python 프로젝트가 있습니다.파이썬 요청 라이브러리가 때때로 브라우저가 열 수있는 사이트를 열지 못합니다.
여러 사례를 통해 requests
은 Chrome 및 FF에서 사이트가 제대로 열리지 만 사이트 콘텐츠를 제대로 가져 오지 못하는 것으로 나타났습니다. 예를 들어, 내 코드 : 이후
def get_site_content(site):
try :
content = requests.get(site, allow_redirects = True)
content = content.text
except Exception as e:
if DEBUG :
print type(e)
print e.args
print e
global errors
errors += 1
return ''
soup = BeautifulSoup(content)
# parse, tokenize and filter the content of the site
[...]
return tokenized_content
, 나는 사이트 콘텐츠가 ''
있는지 확인을한다. 그렇다면 오류가 발생했으며 그 사이트를로드하는 데 실패했음을 나타냅니다. 내 로그에서
:
내가 파이썬 쉘에서 동일한 코드를 실행하면
Progress: [=========-] 1.8% Failed to load site : http://www.mocospace.com
[...]
Progress: [=========-] 87.8% Failed to load site : http://www.hotchalk.com
Progress: [=========-] 93.2% Failed to load site : http://Hollywire.com
Progress: [=========-] 93.8% Failed to load site : http://www.Allplaybook.com
그러나 :
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> content = requests.get("http://www.mocospace.com", allow_redirects=True)
>>> content
<Response [200]>
>>> content.text
u'<?xml version="1.0" encoding="utf-8"?>\r\n<!DOCTYPE html PUBLIC [...]
내가 403을받을 경우에, 그것은 여전히 예외가 아니다 - 그것이 있어야한다.
# data is a list of all urls together with their category
for row in data:
content = get_site_content(row['URL'])
if content :
classifier_data.append((content, row['Category']))
else :
print "Failed to load site : %s" % row['URL']
이 동작은 아마도 무엇을 발생할 수 있습니다 : 예외가 get_site_content()
가 ''
을 반환 제기 된 경우
>>> content = requests.get("http://www.hotchalk.com", allow_redirects=True)
>>> content
<Response [403]>
>>> content.text
u'<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor="white">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'
가 로딩이 실패 말할 로그의 유일한 방법은? 이 C면, 포인터 및 정의되지 않은 동작이 관련된 뭔가 찾고있을 줄 알았는데 아무것도 비슷한 여기에 발생할 수 찾을 수없는 것.
편집 :
는 robotparser 모듈을 사용하여, 나는 one of the above sites'robots.txt
파일을 검사 시도 User-agent: *
가 맨 위에 설정되어 있다고 지적했다. 그렇지 않으면 색인 페이지에 액세스 할 수없는 항목이 표시되지 않으므로 다른 이유로 인해 발생할 수 있습니까? 파이썬 쉘에서
: 서버가 응답을 보낼 때 기본적으로
>>> import robotparser
>>> rp = robotparser.RobotFileParser()
>>> rp = robotparser.RobotFileParser()
>>> rp.set_url("http://www.mocospace.com/robots.txt")
>>> rp.read()
>>> rp.can_fetch("*", "http://www.mocospace.com")
True
사이트는 요청의 내용에 따라 행동을 자유롭게 변경할 수 있으며, 종종 그렇게합니다. 브라우저가'requests'와 다른 헤더 집합을 보냅니다. 일반적인 범인은'User-Agent' 헤더이지만'Referrer'와'Accept'와 같은 다른 헤더도 꽤 자주 포함됩니다. 이것은'requests' *의 버그가 아닙니다. –
아, 위키 백과 항목에 대한 요청에서 내가 그런 것을 실제로 발견했다고 언급하는 것을 잊었습니다. 이 경우,'(..., headers = 'User-Agent': 'SomeAgent 1.0')'필드를 추가적으로 제공해야합니까, 아니면 헤더에서 예상되는 다른 모든 필드도 포함해야합니까? – user991710
'headers' 매개 변수는 사전입니다. 당신은'headers = { 'User-Agent': 'SomeAgent 1.0'}'을 시도 할 수 있지만 원치 않는 로봇 스파이더를 시도하고 제거하기 위해 사용자 에이전트를 필터링하는 사이트를 고려해야합니다. 'robots.txt' 사이트를 읽고 요청한 정책을 존중하십시오. –