Python의`urllib2` : Wikipedia 페이지를`urlopen` 할 때 403 오류가 발생하는 이유는 무엇입니까?
urlopen
Wikipedia에서 특정 페이지로 이동할 때 이상한 버그가 있습니다. 이것은 페이지입니다 :
http://en.wikipedia.org/wiki/OpenCola_ (음료)
이것은 쉘 세션입니다.
>>> f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
Traceback (most recent call last):
File "C:\Program Files\Wing IDE 4.0\src\debug\tserver\_sandbox.py", line 1, in <module>
# Used internally for debug sandbox under external interpreter
File "c:\Python26\Lib\urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "c:\Python26\Lib\urllib2.py", line 397, in open
response = meth(req, response)
File "c:\Python26\Lib\urllib2.py", line 510, in http_response
'http', request, response, code, msg, hdrs)
File "c:\Python26\Lib\urllib2.py", line 435, in error
return self._call_chain(*args)
File "c:\Python26\Lib\urllib2.py", line 369, in _call_chain
result = func(*args)
File "c:\Python26\Lib\urllib2.py", line 518, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
이것은 다른 대륙에있는 두 개의 다른 시스템에서 나에게 일어났습니다. 왜 이런 일이 일어나는지 아는 사람이 있습니까?
Wikipedias 입장은 다음과 같습니다.
데이터 검색 : 승인 된 봇 작업과 직접 관련이없는 용도로 대량 콘텐츠를 검색하는 데 봇을 사용할 수 없습니다. 여기에는 다른 웹 사이트에서 동적으로 페이지를로드하는 것이 포함되며, 이로 인해 웹 사이트가 차단되고 영구적으로 액세스가 거부 될 수 있습니다. 대량 콘텐츠를 다운로드하거나 프로젝트를 미러링하려면 자체 데이터베이스 사본을 다운로드하거나 호스팅하십시오.
이것이 파이썬이 차단 된 이유입니다. 데이터 덤프 를 다운로드 해야 합니다 .
어쨌든 Python 2에서 다음과 같은 페이지를 읽을 수 있습니다.
req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})
con = urllib2.urlopen( req )
print con.read()
또는 Python 3에서 :
import urllib
req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"})
con = urllib.request.urlopen( req )
print con.read()
이를 디버깅하려면 해당 예외를 트랩해야합니다.
try:
f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
except urllib2.HTTPError, e:
print e.fp.read()
결과 메시지를 인쇄 할 때 다음이 포함됩니다.
"영어
현재 서버에 기술적 인 문제가 있습니다. 이는 일시적 일 수 있으며 곧 수정 될 예정입니다. 몇 분 후에 다시 시도하십시오. "
종종 웹 사이트는 인식 된 사용자 에이전트가 액세스하고 있는지 확인하여 액세스를 필터링합니다. Wikipedia는 스크립트를 봇으로 취급하고 거부합니다. 브라우저로 스푸핑을 시도하십시오. 다음 링크는 방법을 보여주는 기사로 연결됩니다.
http://wolfprojects.altervista.org/changeua.php
일부 웹 사이트는 urllib가 보내는 헤더를 읽어 서버의 '불필요한'사용을 방지하기 위해 스크립트의 액세스를 차단합니다. 나는 왜 위키피디아가 이것을하는지 상상할 수 없지만 헤더를 스푸핑 해 보셨습니까?
Jochen Ritzel이 언급했듯이 Wikipedia는 봇을 차단합니다.
그러나 봇은 PHP API를 사용하는 경우 차단되지 않습니다. "love"라는 제목의 Wikipedia 페이지를 얻으려면 :
http://en.wikipedia.org/w/api.php?format=json&action=query&titles=love&prop=revisions&rvprop=content
필요한 사이트에서 차단하지 않는 php를 사용하여이 문제를 해결했습니다.
다음과 같이 액세스 할 수 있습니다.
path='http://phillippowers.com/redirects/get.php?
file=http://website_you_need_to_load.com'
req = urllib2.Request(path)
response = urllib2.urlopen(req)
vdata = response.read()
그러면 html 코드가 반환됩니다.
'programing' 카테고리의 다른 글
복사하지 않고 C ++ std :: vector와 C 배열 간 변환 (0) | 2021.01.17 |
---|---|
C # 캐스트 전체 어레이? (0) | 2021.01.17 |
체크 박스가있는 Android ListView 및 모든 클릭 가능 (0) | 2021.01.17 |
ggplot2 scale_brewer의 역순 (0) | 2021.01.17 |
UIViewController에 포함 된 UITableView에서 정적 셀을 시각적으로 만들고 사용하는 방법 (0) | 2021.01.17 |