我有一个在 AWS 上运行的应用程序,它向页面发出请求以使用 requests
提取元标记。我发现该页面允许 curl 请求,但不允许来自 requests
库的请求。
作品:
curl https://www.seattletimes.com/nation-world/mount-st-helens-which-erupted-41-years-ago-starts-reopening-after-covid-closures/
永远挂起:
imports requests
requests.get('https://www.seattletimes.com/nation-world/mount-st-helens-which-erupted-41-years-ago-starts-reopening-after-covid-closures/')
这里的 curl 和 requests 有什么区别?我应该生成一个 curl 进程来提出我的请求吗?
答案 0 :(得分:2)
以下任一代理确实有效。还可以使用 user_agent 模块(位于 pypi here 上)生成随机且有效的网络用户代理。
import requests
agent = (
"Mozilla/5.0 (X11; Linux x86_64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/85.0.4183.102 Safari/537.36"
)
# or can use
# agent = "curl/7.61.1"
url = ("https://www.seattletimes.com/nation-world/"
"mount-st-helens-which-erupted-41-years-ago-starts-reopening-after-covid-closures/")
r = requests.get(url, headers={'user-agent': agent})
或者,使用 user_agent 模块:
import requests
from user_agent import generate_user_agent
agent = generate_user_agent()
url = ("https://www.seattletimes.com/nation-world/"
"mount-st-helens-which-erupted-41-years-ago-starts-reopening-after-covid-closures/")
r = requests.get(url, headers={'user-agent': agent})
进一步解释一下,requests 设置了一个默认的用户代理 here,西雅图时间正在阻止这个用户代理。但是,使用 python-requests 可以轻松更改请求中的标头参数,如上所示。
举例说明默认参数:
r = requests.get('https://google.com/')
print(r.request.headers)
>>> {'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
对比更新后的头参数
agent = "curl/7.61.1"
r = requests.get('https://google.com/', headers={'user-agent': agent})
print(r.request.headers)
>>>{'user-agent': 'curl/7.61.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}