어떻게 웹 페이지를 캡처할 때 막힐 기회를 줄일 수 있습니까
28542 단어 webscrapingpythontutorialruby
User-Agent
네트워크 탭 먼저 보기
가장 은밀한 옆길 시스템을 만들기 전에 dev tools 아래의 네트워크 옵션을 보십시오. 직접 API/서버를 통해 추출에 필요한 데이터를 호출할 수 있는지 확인하십시오.이렇게 하면 너는 일을 복잡하게 할 필요가 없다.
참고: API 호출도 보호됩니다.예를 들어 가드보와 월마트는 적당한
headers
없이 API 요청을 막았다.확인하려면
Dev Tools -> Network -> Fetch/XHR
으로 이동하십시오.왼쪽에서 서버에서 서버로 보내거나 보내는 요청을 볼 수 있습니다. 그 중 하나를 클릭하면 오른쪽에서 '미리 보기' 옵션의 응답을 볼 수 있습니다.요청 중 일부가 원하는 데이터를 포함하고 있다면, 그것을 누르고 오른쪽에 있는 헤더스 옵션 카드로 이동해서 URL을 복사해서 Python
requests.get()
또는 Ruby HTTParty.get()
으로 요청을 보내십시오.지체하다
지연은 때때로 작용하지만, 이것은 용례에 달려 있고, 당신이 그것을 사용해야 하는지의 여부에 달려 있다.
파이썬에서는 내장된
time.sleep
메서드를 사용할 수 있습니다.from time import sleep
sleep(0.05) # 50 milliseconds of sleep
sleep(0.5) # half a second of sleep
sleep(3) # 3 seconds of sleep
루비에서 sleep
메서드를 사용하는 것도 같은 프로세스입니다.# Called without an argument, sleep() will sleep forever
sleep(0.5) # half a second
sleep(4.minutes)
# or longer..
sleep(2.hours)
sleep(3.days)
사용자 에이전트
이것은 가장 기본적인 것이다. 보통 대부분의 사이트에서 이 정도면 충분하지만,
user-agent
은 당신의 요청이 거절당하거나 막히지 않을 것이라고 보장할 수 없다.기본 해석에서 로봇이나 브라우저가 가짜
user-agent
문자열을 보내서 자신이 다른 클라이언트임을 발표할 때 user-agent
은'진실'사용자 방문, 즉 user-agent
spoofing을 충당해야 한다.요청이 막힐 수 있는 이유는 예를 들어 Python
requests
라이브러리에서 기본 user-agent
은 python-requests
이고 사이트는 로봇임을 이해한다. 만약에 대량의 요청을 보내면 사이트가 과부하되지 않도록 요청을 막을 수 있다.User-agent
syntax은 다음과 같이 보입니다.User-Agent: <product> / <product-version> <comment>
검사 what's your user-agent
.Python
requests
라이브러리에서 user-agent
을 headers
으로 요청 dict()
에 전달할 수 있습니다. 다음과 같습니다.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
# add request headers to request
requests.get("YOUR_URL", headers=headers)
Ruby( HTTPary
gem 포함)의 절차는 동일합니다.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
# add request headers to request
HTTParty.get("YOUR_URL", headers:headers)
사용자 에이전트의 코드와 응답 예시가 있습니까?
다음 예제에서는 Python 및
requests
라이브러리를 사용합니다.이 문제는 Stack OverFlow에서 흔히 볼 수 있습니다.구글 검색에서 데이터를 얻어
user-agent
과 user-agent
을 요청 헤더에 전달하도록 하겠습니다.아래의 예는 주식 가격을 얻으려고 시도할 것이다.요청 헤더에
AttributeError
을 전달하지 않고 보내기import requests, lxml
from bs4 import BeautifulSoup
params = {
"q": "Nasdaq composite",
"hl": "en",
}
soup = BeautifulSoup(requests.get('https://www.google.com/search', params=params).text, 'lxml')
print(soup.select_one('[jsname=vWLAgc]').text)
먼저 응답에는 HTML과 선택기가 다르기 때문에 및 print
이 표시됩니다.print(soup.select_one('[jsname=vWLAgc]').text)
AttributeError: 'NoneType' object has no attribute 'text'
그 다음에 soup
에서 requests.get()
대상이나 응답을 가져오려고 하면 <script>
으로 표시된 HTML이거나 오류가 있는 HTML을 볼 수 있습니다.user-agent
에 요청:import requests, lxml
from bs4 import BeautifulSoup
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
params = {
"q": "Nasdaq composite",
"hl": "en",
}
soup = BeautifulSoup(requests.get('https://www.google.com/search', headers=headers, params=params).text, 'lxml')
print(soup.select_one('[jsname=vWLAgc]').text)
# 15,363.52
사용자 에이전트 교체
만약 당신이 한 사이트에 대해 대량의 웹 캡처 요청을 하려고 한다면, 가장 좋은 것은 서로 다른 HTTP 헤더를 보내서 모든 요청이 랜덤으로 보이고, 그것이 서로 다른 컴퓨터/다른 브라우저로 보일 수 있도록 하는 것이다.
절차:
list()
또는 txt
파일에 넣습니다.list()
을 사용하여 random.choice()
에서 무작위로 문자열을 선택하도록 한다.import requests, random
user_agent_list = [
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
]
for _ in user_agent_list:
#Pick a random user agent
user_agent = random.choice(user_agent_list)
#Set the headers
headers = {'User-Agent': user_agent}
requests.get('URL', headers=headers)
Scraphero에서 how to fake and rotate User Agents using Python에 대해 자세히 알아보십시오.부제목
때로는
user-agent
만으로는 부족할 때도 있다.너는 추가 제목을 전달할 수 있다.예를 들면 다음과 같습니다.Accept :
Accept: <MIME_type>/<MIME_subtype>; Accept: <MIME_type>/*; Accept: */*
Accept-Language :
Accept-Language: <language>; Accept-Language: *
Content-Type :
Content-Type: text/html; img/png
또한 인증 데이터를 전송해야 하는 경우
requests.Session()
을 사용할 수 있습니다.session = requests.Session()
session.auth = ('user', 'pass')
session.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
session.get('https://httpbin.org/headers', headers={'x-test2': 'true'})
또는 cookies를 보내야 하는 경우:session = requests.Session()
response = session.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(response .text)
# '{"cookies": {"from-my": "browser"}}'
response = session.get('https://httpbin.org/cookies')
print(response.text)
# '{"cookies": {}}'
DevTools -> Network -> Click on the URL -> Headers
에서 모든 요청/응답 제목을 볼 수 있습니다.Insomnia(URL->copy as cURL(Bash)을 마우스 오른쪽 단추로 클릭하면 보내는 HTTP 요청 헤더를 보고 동적으로 처리할 수 있습니다.
또한 코드를 생성할 수도 있습니다(항상 완벽하지는 않습니다).
순차적 제목
특수한 경우, 제목을 질서정연하게 제공하기를 원할 수도 있습니다.
이 점을 하려면 너는 이렇게 할 수 있다.
from collections import OrderedDict
import requests
session = requests.Session()
session.headers = OrderedDict([
('Connection', 'keep-alive'),
('Accept-Encoding', 'gzip,deflate'),
('Origin', 'example.com'),
('User-Agent', 'Mozilla/5.0 ...'),
])
# other code ...
custom_headers = OrderedDict([('One', '1'), ('Two', '2')])
req = requests.get('https://httpbin.org/get', headers=custom_headers)
prep = session.prepare_request(req)
print(*prep.headers.items(), sep='\n')
# prints:
'''
('Connection', 'keep-alive')
('Accept-Encoding', 'gzip,deflate')
('Origin', 'example.com')
('User-Agent', 'Mozilla/5.0 ...')
('One', '1')
('Two', '2')
'''
코드는 jfs에서 Stack OverFlow 응답에서 추출됩니다.그의 답안을 읽고 더 많은 정보를 얻으십시오. (주의: 이것은 러시아어로 쓴 것입니다.)Requests Header Ordering에 대해 자세히 알아보십시오.IP 속도 제한
IP 속도 제한의 작동 방식은 API 속도 제한과 유사하지만 일반적으로 해당 항목에 대한 공개 정보는 없습니다.
이것은 기본적인 보안 시스템으로 같은 IP에서 들어오는 요청을 금지하거나 막을 수 있다.즉, 일반 사용자는 동일한 도메인에 대해 몇 초 이내에 100개의 요청을 보내지 않으므로 연결이 위험/예외/의심으로 계속 표시되므로 X시간당 몇 개의 요청을 안전하게 수행할 수 있는지 확인할 수 없습니다.
먼저 HTML을 로컬에 저장하고 필요한 모든 내용을 테스트한 다음 사이트에 실제 요청을 시작합니다.
대리점
때때로 요청 헤더를 전달하는 것은 부족하다.이 때 프록시와 요청 헤더를 결합해서 사용할 수 있습니다.
일단 왜 대리예요?
proxies
을 요청에 전달합니다(user-agent
과 동일).proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
requests.get('http://example.org', proxies=proxies)
이렇게 HTTParty
to add proxies을 사용하거나 아래에 표시된 코드 세그먼트에 비슷한 코드를 사용합니다.http_proxy = {
http_proxyaddr: "PROXY_ADDRESS",
http_proxyport: "PROXY_PORT"
}
HTTParty.get("YOUR_URL", http_proxy:http_proxy)
또는 HTTPrb
to add proxies:HTTP.via("proxy-hostname.local", 8080)
.get("http://example.com/resource")
HTTP.via("proxy-hostname.local", 8080, "username", "password")
.get("http://example.com/resource")
과도하게 사용되지 않은 에이전트
간단히 말하자면 가능하면 과도하게 사용하는 에이전트를 사용하지 마십시오. 왜냐하면:
list()
에 저장하거나 .txt
파일에 저장하면 메모리를 절약하고 결과를 요청할 때 교체할 수 있습니다. 만약 결과가 당신이 원하는 것이 아니라면 다른 종류의 에이전트로 이동할 수 있습니다.다른 types of proxies에 대한 정보와 그 중 어떤 것이 가장 적합한지 알아보세요.
화이트리스트에 오르다
Get whitelisted (화이트리스트 가져오기) 는 웹 사이트에 IP 주소를 추가하여 목록을 허용하는 것을 가리킨다. 이 목록은 기본적으로 모든 내용이 거부될 때 허용되는 내용 목록이다.
화이트리스트가 되는 방식의 하나는 수집된 데이터에 따라 정기적으로 유용한 일을 할 수 있다는 것이다. 이것은 약간의 견해를 가져올 수 있다.
SerpApi를 사용한 검색 엔진 처리
구글, 필응, 야후 등 검색엔진을 처리하고 있다면, 이 모든 문제를 피하기 위해 SerpApi을 사용할 수 있다.이것은 무료 유료 API다.
가장 큰 차이점은 인증 부분을 제외하고는 모든 일이 최종 사용자를 위해 이루어졌기 때문에 고려할 필요도, 유지할 필요도, 확장할 방법도 없다는 것이다.
링크
User-Agent • Request Headers • Response Headers • List of HTTP Headers • Types of proxies • Python Requests • Ruby HTTParty • API
오트로
질문이나 조언이 있으면 언제든지 댓글 부분이나 트위터를 통해 댓글을 남겨주세요.
너의
디미트리와 SerpApi팀의 다른 사람들.
Reference
이 문제에 관하여(어떻게 웹 페이지를 캡처할 때 막힐 기회를 줄일 수 있습니까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dmitryzub/how-to-reduce-chance-being-blocked-while-web-scraping-search-engines-1o46텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)