爬虫Python报403或data为空问题

本文详细介绍了如何在B站爬取数据时,正确使用cookie获取upstat信息,包括设置合适的User-Agent、Host和Cookie,以及遇到403错误的处理方法,提供了一个成功的请求示例和数据返回结果。

在爬取B站数据时,部分API是需要cookie才能获取数据的,没有携带则结果可能是code:403或

{"code":0,"message":"0","ttl":1,"data":{}}

比如upstat,需要将标头中的cookie放在爬虫中。

headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
headers['Host'] = 'api.bilibili.com'
headers['Cookie'] = "xxxxxxxxxxxx"
response = requests.get(api_path, stream=True, headers=headers)

结果正常

{'code': 0, 'message': '0', 'ttl': 1, 'data': {'archive': {'view': 270657}, 'article': {'view': 0}, 'likes': 45846}}

### 解决 Python 爬虫访问百度文库时出现的 403 Forbidden 错误 当尝试使用 Python 爬虫抓取百度文库的数据并遇到 `403 Forbidden` 错误时,这通常意味着服务器识别到请求并非来自真实的浏览器环境,而是自动化工具发出的请求。为了克服这一挑战,可以采取多种策略来模拟更自然的请求行为。 #### 使用自定义 Headers 和 User-Agent 字段 许多网会通过检查 HTTP 请求头中的特定字段(如 `User-Agent`)来判断请求源是否合法。因此,在发送请求前设置合适的头部信息能够有效减少被阻止的可能性[^1]: ```python import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } url = "https://wenku.baidu.com/view/example.html" response = requests.get(url=url, headers=headers) print(f"Status Code: {response.status_code}") if response.status_code == 200: print("Request successful!") else: print("Failed to access the page.") ``` #### 处理 SSL 警告与验证问题 有时目标点可能会引发 SSL 验证失败的问题,可以通过禁用这些警告以及忽略证书校验的方式来绕过这类障碍。不过需要注意的是这样做存在安全隐患,仅适用于测试目的[^3]: ```python from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) response = requests.get('https://example.wenku.baidu.com/', verify=False) ``` #### 实施延时机制防止频繁请求触发反爬措施 为了避免因短时间内发起过多请求而触犯某些网设定的安全阈值,可以在每次请求之间加入随机等待时间间隔,从而降低被检测的风险: ```python import time import random for i in range(5): # 假设要获取五个不同的文档 url = f"https://wenku.baidu.com/document/{i}" try: resp = requests.get(url=url, headers=headers) if resp.status_code != 200: raise Exception("Unable to fetch document") # Process data here... sleep_time = round(random.uniform(1, 3), 2) print(f"Sleeping for {sleep_time} seconds before next request...") time.sleep(sleep_time) except Exception as e: print(e) ``` #### 利用代理池规避 IP 封禁风险 如果发现即使调整了上述参数仍然无法解决问题,则可能是由于IP地址被列入黑名单所致。此时可考虑借助第三方提供的动态代理服务构建自己的代理池来进行轮询切换,以此达到隐藏真实身份的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值