很多新手写爬虫时,只写了URL就发请求,结果 status 200 却拿不到数据。问题往往出在请求头上。本文介绍 User-Agent、Referer 等常用请求头的作用及配置方法,帮助新手提升爬虫的友好度。
当你用浏览器访问一个网站时,浏览器会自动发送一些附加信息,比如“我是什么浏览器”“我从哪个页面跳转过来”“我接受什么格式的数据”。这些信息组合起来就叫请求头(Request Headers)。
如果用 Python 的 requests 库直接发请求,默认的请求头很短,网站一看就知道不是正常浏览器在访问,于是要么拒绝返回数据,要么返回一个验证码页面。
告诉网站“你是什么浏览器”。默认的 Python 请求头里有 python-requests/版本号,一看就是自动化脚本。
常见浏览器UA示例:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0代码写法:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
resp = requests.get('https://example.com', headers=headers)告诉网站“你从哪个页面跳转过来的”。很多网站会检查这个值,如果不是从它的内部页面跳转的,可能会拒绝响应。
示例: 你要爬取某个详情页,可以先访问一次它的首页,然后把首页地址作为Referer。
headers['Referer'] = 'https://www.example.com/'告诉网站“你接受哪种语言”。如果你总是用 zh-CN 访问一个美国网站,对方可能会返回英文版,或者认为你行为异常。
推荐写法:
headers['Accept-Language'] = 'en-US,en;q=0.9'import requests
url = 'https://httpbin.org/headers'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.google.com/',
'Accept-Language': 'en-US,en;q=0.9',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
resp = requests.get(url, headers=headers)
print(resp.status_code)
print(resp.text)Referer 大小写敏感,一般首字母大写。请求头是爬虫和网站之间的“第一印象”。正确的请求头不能保证你百分之百拿不到验证码,但能显著降低被直接拒绝的概率。
对于新手来说,先学会设置 User-Agent、Referer、Accept-Language 这三个,已经能解决大部分基础问题。后续遇到更严格的防护时,再学习使用 Session 保持登录态、添加 Cookie 等进阶操作。
本文仅作技术交流,请遵守目标网站的访问规则,合理控制请求频率。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。