programing

Python의`urllib2` : Wikipedia 페이지를`urlopen` 할 때 403 오류가 발생하는 이유는 무엇입니까?

shortcode 2021. 1. 17. 11:17
반응형

Python의`urllib2` : Wikipedia 페이지를`urlopen` 할 때 403 오류가 발생하는 이유는 무엇입니까?


urlopenWikipedia에서 특정 페이지로 이동할 때 이상한 버그가 있습니다. 이것은 페이지입니다 :

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 코드가 반환됩니다.

참조 URL : https://stackoverflow.com/questions/3336549/pythons-urllib2-why-do-i-get-error-403-when-i-urlopen-a-wikipedia-page

반응형