[PYTHON] 파이썬 3 웹 스크래핑에서 HTTP 오류 403
PYTHON파이썬 3 웹 스크래핑에서 HTTP 오류 403
연습을 위해 웹 사이트를 스크랩하려고했지만 HTTP 오류 403 (계속 봇이라고 생각합니까?)을 계속 사용하고 있습니까?
여기 내 코드가 있습니다 :
#import requests
import urllib.request
from bs4 import BeautifulSoup
#from urllib import urlopen
import re
webpage = urllib.request.urlopen('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1').read
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')
row_array = re.findall(findrows, webpage)
links = re.finall(findlink, webpate)
print(len(row_array))
iterator = []
내가 얻는 오류 :
File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
return opener.open(url, data, timeout)
File "C:\Python33\lib\urllib\request.py", line 479, in open
response = meth(req, response)
File "C:\Python33\lib\urllib\request.py", line 591, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Python33\lib\urllib\request.py", line 517, in error
return self._call_chain(*args)
File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
result = func(*args)
File "C:\Python33\lib\urllib\request.py", line 599, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
해결법
-
==============================
1.아마도 mod_security 또는 알려진 스파이더 / 봇 사용자 에이전트를 차단하는 유사한 서버 보안 기능 때문일 수 있습니다 (urllib는 python urllib / 3.3.0과 같은 것을 사용하므로 쉽게 감지됩니다). 다음을 사용하여 알려진 브라우저 사용자 에이전트를 설정해보십시오.
아마도 mod_security 또는 알려진 스파이더 / 봇 사용자 에이전트를 차단하는 유사한 서버 보안 기능 때문일 수 있습니다 (urllib는 python urllib / 3.3.0과 같은 것을 사용하므로 쉽게 감지됩니다). 다음을 사용하여 알려진 브라우저 사용자 에이전트를 설정해보십시오.
from urllib.request import Request, urlopen req = Request('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1', headers={'User-Agent': 'Mozilla/5.0'}) webpage = urlopen(req).read()
이것은 나를 위해 작동합니다.
그건 그렇고, 코드에서 urlopen 라인의 .read 뒤에 ()를 놓치고 있지만, 오타라고 생각합니다.
TIP : 이것은 운동이기 때문에 다른 제한없는 사이트를 선택하십시오. 어쩌면 그들은 어떤 이유로 든 urllib을 차단하고있을 것입니다 ...
-
==============================
2.확실히 그것은 사용자 에이전트에 기반한 urllib의 사용으로 인해 차단됩니다. OfferUp을 통해 이와 똑같은 일이 일어나고 있습니다. 사용자 에이전트를 Mozilla로 대체하는 AppURLopener라는 새 클래스를 만들 수 있습니다.
확실히 그것은 사용자 에이전트에 기반한 urllib의 사용으로 인해 차단됩니다. OfferUp을 통해 이와 똑같은 일이 일어나고 있습니다. 사용자 에이전트를 Mozilla로 대체하는 AppURLopener라는 새 클래스를 만들 수 있습니다.
import urllib.request class AppURLopener(urllib.request.FancyURLopener): version = "Mozilla/5.0" opener = AppURLopener() response = opener.open('http://httpbin.org/user-agent')
출처
-
==============================
3."이것은 아마도 mod_security 또는 알려진 유사한 서버 보안 기능 때문일 것입니다.
"이것은 아마도 mod_security 또는 알려진 유사한 서버 보안 기능 때문일 것입니다.
사용자 에이전트 (urllib는 python urllib / 3.3.0과 같은 것을 사용합니다. 쉽게 감지됩니다) "- Stefano Sanfilippo
from urllib.request import Request, urlopen url="https://stackoverflow.com/search?q=html+error+403" req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) web_byte = urlopen(req).read() webpage = web_byte.decode('utf-8')
web_byte는 서버에서 반환 한 바이트 객체이며 웹 페이지에있는 콘텐츠 유형은 대부분 utf-8입니다. 따라서 decode 메소드를 사용하여 web_byte를 디코딩해야합니다.
PyCharm을 사용하여 웹 사이트에서 스크랩을 시도하는 동안 문제가 완전히 해결되었습니다.
P.S -> 나는 파이썬 3.4를 사용한다.
-
==============================
4.페이지가 브라우저에서 작동하고 파이썬 프로그램 내에서 호출 할 때가 아니기 때문에 브라우저가 아닌 컨텐츠를 요청한다는 사실을 URL을 제공하는 웹 앱이 인식하는 것 같습니다.
페이지가 브라우저에서 작동하고 파이썬 프로그램 내에서 호출 할 때가 아니기 때문에 브라우저가 아닌 컨텐츠를 요청한다는 사실을 URL을 제공하는 웹 앱이 인식하는 것 같습니다.
데모:
curl --dump-header r.txt http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1 ... <HTML><HEAD> <TITLE>Access Denied</TITLE> </HEAD><BODY> <H1>Access Denied</H1> You don't have permission to access ... </HTML>
r.txt의 내용에는 상태 표시 줄이 있습니다.
HTTP/1.1 403 Forbidden
웹 클라이언트를 위장하는 'User-Agent'헤더 게시를 시도하십시오.
참고 :이 페이지에는 구문 분석하려는 테이블을 만드는 Ajax 호출이 포함되어 있습니다. 페이지의 자바 스크립트 로직을 확인하거나 브라우저 디버거 (예 : Firebug / Net 탭)를 사용하여 테이블 콘텐츠를 가져 오기 위해 어떤 URL을 호출해야하는지 확인해야합니다.
from https://stackoverflow.com/questions/16627227/http-error-403-in-python-3-web-scraping by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 하위 프로세스 통신 방법을 사용할 때 종료 코드를 얻는 방법은 무엇입니까? (0) | 2018.10.10 |
---|---|
[PYTHON] cx_freeze를 사용할 때 다른 파일을 어떻게 묶을 수 있습니까? (0) | 2018.10.10 |
[PYTHON] 어떻게 파이썬 3으로 INI 파일을 읽고 쓰는가? (0) | 2018.10.10 |
[PYTHON] 새로운 LIST에 두 개의 LIST 값 합계를 더한다. (0) | 2018.10.10 |
[PYTHON] 평면 목록에 중복 된 항목이 있는지 어떻게 확인합니까? (0) | 2018.10.10 |