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
이은아때것문입다니일마 일 것입니다.mod_security
스파이더에이전트를 기능( 는알봇스용자/또단기사에를보능서안/차버유일사한부는려파진하이이트전더▁which봇▁or▁security기▁()urllib
을사합다니 같은 것을 합니다.python urllib/3.3.0
쉽게 감지됨).다음을 사용하여 알려진 브라우저 사용자 에이전트를 설정해 보십시오.
from urllib.request import Request, urlopen
req = Request(
url='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()
이것은 나에게 효과가 있습니다.
그나저나, 당신의 코드에서 당신은 누락되었습니다.()
나고끝 .read
에 시대에urlopen
라인, 하지만 오타인 것 같아요.
팁: 이것은 연습이므로 제한이 없는 다른 사이트를 선택하십시오.아마도 그들이 막고 있을 것입니다.urllib
어떤 이유에서인지...
확실히 사용자 에이전트에 기반한 URLIB 사용으로 인해 차단됩니다.이와 같은 현상이 OfferUp에서 저에게도 일어나고 있습니다.앱이라는 새 클래스를 만들 수 있습니다.Mozilla를 사용하여 사용자 에이전트를 재정의하는 URL 열기기입니다.
import urllib.request
class AppURLopener(urllib.request.FancyURLopener):
version = "Mozilla/5.0"
opener = AppURLopener()
response = opener.open('http://httpbin.org/user-agent')
"이것은 아마도 mod_security 또는 알려진 것을 차단하는 유사한 서버 보안 기능 때문일 것입니다.
거미/봇
사용자 에이전트(urllib는 python urllib/3.3.0과 같은 것을 사용하며, 쉽게 감지됩니다.)" - 이미 Stefano Sanfilio가 언급했듯이
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입니다.따라서 디코딩 방법을 사용하여 web_byte를 디코딩해야 합니다.
이것은 제가 PyCharm을 사용하여 웹사이트에서 스크랩을 시도하는 동안 완전한 문제를 해결합니다.
추신 -> 저는 파이썬 3.4를 사용합니다.
이전 답변을 바탕으로 Python 3.7에서 시간 초과를 10으로 늘림으로써 효과가 있었습니다.
from urllib.request import Request, urlopen
req = Request('Url_Link', headers={'User-Agent': 'XYZ/3.0'})
webpage = urlopen(req, timeout=10).read()
print(webpage)
요청 헤더에 쿠키를 추가하는 작업이 수행되었습니다.
from urllib.request import Request, urlopen
# Function to get the page content
def get_page_content(url, head):
"""
Function to get the page content
"""
req = Request(url, headers=head)
return urlopen(req)
url = 'https://example.com'
head = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive',
'refere': 'https://example.com',
'cookie': """your cookie value ( you can get that from your web page) """
}
data = get_page_content(url, head).read()
print(data)
사용자 에이전트를 Mozilla로 위장한 것에 대해 죄책감을 느낀다면(Stefano의 상위 답변에 있는 코멘트), 비urlib User-Agent에서도 작동할 수 있습니다.이것은 제가 참조하는 사이트에 적용되었습니다.
req = urlrequest.Request(link, headers={'User-Agent': 'XYZ/3.0'})
urlrequest.urlopen(req, timeout=10).read()
제 응용 프로그램은 제가 기사에서 참조하는 특정 링크를 스크랩하여 타당성을 테스트하는 것입니다.일반 스크레이퍼가 아닙니다.
페이지는 python 프로그램 내에서 호출할 때가 아니라 브라우저에서 작동하기 때문에 해당 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 호출이 포함되어 있습니다.페이지의 Javascript 로직을 확인하거나 단순히 브라우저 디버거(예: Firebug / Net 탭)를 사용하여 테이블의 내용을 가져오기 위해 어떤 URL을 호출해야 하는지 확인해야 합니다.
다음과 같이 urllib의 build_filename을 사용할 수 있습니다.
opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'), ('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8'), ('Accept-Encoding','gzip, deflate, br'),\
('Accept-Language','en-US,en;q=0.5' ), ("Connection", "keep-alive"), ("Upgrade-Insecure-Requests",'1')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(url, "test.xlsx")
두 가지 방법으로 시도할 수 있습니다.자세한 내용은 이 링크에 있습니다.
바이파이프
pip 설치 --업그레이드 인증서
작동하지 않으면 Mac용 Python 3.*에 번들로 제공되는 Cerificates. 명령을 실행해 보십시오. (Python 설치 위치로 이동하여 파일을 두 번 클릭하십시오.)
open /Applications/Python\ 3.*/Install\ Certificates.명령어
저는 이 같은 문제에 부딪혔고 위의 답변을 사용하여 해결할 수 없었습니다.결국 requests.get()을 사용하고 read() 대신 결과의 .text를 사용하여 문제를 해결했습니다.
from requests import get
req = get(link)
result = req.text
저는 이것으로 잠시 머리를 뽑았는데 답이 꽤 간단해졌습니다.응답 텍스트를 확인한 결과 "URL 서명 만료" 메시지가 표시되었습니다. 이 메시지는 응답 텍스트를 확인하지 않으면 일반적으로 볼 수 없습니다.
즉, 일부 URL은 일반적으로 보안 목적으로 만료됩니다.URL을 다시 가져와서 스크립트의 URL을 업데이트합니다.삭제하려는 콘텐츠에 대한 새 URL이 없으면 안타깝게도 삭제할 수 없습니다.
개발자 도구를 열고 네트워크 탭을 엽니다. 스크랩할 항목 중에서 선택하면 확장 세부 정보에 사용자 에이전트가 포함되어 거기에 추가됩니다.
언급URL : https://stackoverflow.com/questions/16627227/problem-http-error-403-in-python-3-web-scraping
'programing' 카테고리의 다른 글
인식할 수 없는 특성 'targetFramework'입니다.속성 이름은 대소문자를 구분합니다. (0) | 2023.06.15 |
---|---|
NgFor가 Angular2의 파이프로 데이터를 업데이트하지 않습니다. (0) | 2023.06.15 |
현재 컨텍스트에 이름이 없습니다. (0) | 2023.06.15 |
매트랩 코더 대 핸드 코딩? (0) | 2023.06.15 |
파이썬에서 파일 경로에서 폴더 경로를 추출하려면 어떻게 해야 합니까? (0) | 2023.06.15 |