为了从url获得JSON响应,我正在使用Cloduscraper库。问题是,在得到正确的输出之前,我必须重试同样的请求2-3次。第一个响应有一个403 HTTP状态代码。
这是我的代码:
import json
from time import sleep
import cloudscraper
url = "https://www.endpoint.com/api/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0",
"Accept": "*/*",
"Content-Type": "application/json"
}
json_response = 0
while json_response == 0:
try:
scraper = cloudscraper.create_scraper()
r = scraper.get(url, headers=headers)
json_response = json.loads(r.text)
except:
print(r.status_code)
sleep(2)
return json_response
我能做些什么来优化我的代码并防止403个响应?
发布于 2022-01-21 10:13:43
您可以使用真正的浏览器来防止bot检测的某些部分,下面是使用playwright
的示例
import json
from playwright.sync_api import sync_playwright
API_URL = 'https://www.soraredata.com/api/players/info/29301348132354218386476497174231278066977835432352170109275714645119105189666'
with sync_playwright() as p:
# Webkit is fastest to start and hardest to detect
browser = p.webkit.launch(headless=True)
page = browser.new_page()
page.goto(API_URL)
# Use evaluate instead of `content` not to import bs4 or lxml
html = page.evaluate('document.querySelector("pre").innerText')
try:
data = json.loads(html)
except:
# Still might fail sometimes
data = None
print(data)
发布于 2022-01-18 10:59:56
HTTP 403 Forbidden
响应状态代码指示服务器理解请求,但拒绝授权请求。
如果您没有授权,我建议首先检查您发送请求的url是否需要任何类型的权限来授权请求。
然而,在第二次或第三次试验中,您确实会得到一个响应,所发生的情况是,一些服务器在返回答案之前需要几秒钟的时间,因此它们要求浏览器在提交响应之前等待大约5秒。
我建议添加一个延迟,它可以作为参数传递给create_scraper():
scraper = cloudscraper.create_scraper(delay=10)
如果它是成功的,那么减少延迟,直到它不能再减少。
https://stackoverflow.com/questions/70633736
复制相似问题