programing

Python 3 웹 스크래핑의 HTTP 오류 403 문제

muds 2023. 6. 15. 22:08
반응형

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

반응형