Python爬虫豆瓣电影评论使用代理还是被403了怎么办?
代理 IP 理论上是从网站申请的高匿代理,写的爬虫程序是判断某个 IP 被封了后换一个代理 IP 继续爬。
response=requests.get(url,proxies=proxy).text
但是之后发现爬久了之后返回的 response 是 403 的页面,不用代理 IP 也是 403,难道是发现了我自己主机的 IP 吗?(代理 IP 是可用的)
Python爬虫豆瓣电影评论使用代理还是被403了怎么办?
发现了你的行为是爬虫然后直接封你的代理 ip 而已,现在很多网站都有根据日志进行行为分析的能力,绝大部分人的写的爬虫行为都太机械,操作时间固定严格精确,稍微分析一下就明白操作者不是人类。
遇到403错误,即使用了代理,通常是因为网站的反爬机制识别了你的请求是爬虫。豆瓣的反爬比较严格,光换IP不够,还得把请求伪装得更像真人浏览器。
关键点在于请求头(User-Agent、Referer等)和请求频率。这里给你一个能跑的代码示例,重点加了随机User-Agent和必要的请求头,并设了随机延迟来模拟真人操作。记得把your_proxy换成可用的代理地址。
import requests
import time
import random
from fake_useragent import UserAgent
def fetch_douban_comments(movie_id, proxy=None, max_retries=3):
"""
抓取豆瓣电影短评
:param movie_id: 电影ID,如 '1292052' (《肖申克的救赎》)
:param proxy: 代理服务器,格式如 'http://127.0.0.1:8080'
:param max_retries: 最大重试次数
"""
ua = UserAgent()
base_url = f'https://movie.douban.com/subject/{movie_id}/comments'
headers = {
'User-Agent': ua.random,
'Referer': f'https://movie.douban.com/subject/{movie_id}/',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
}
proxies = {'http': proxy, 'https': proxy} if proxy else None
for attempt in range(max_retries):
try:
# 随机延迟1-3秒,避免请求过快
time.sleep(random.uniform(1, 3))
resp = requests.get(
base_url,
headers=headers,
proxies=proxies,
timeout=10
)
resp.raise_for_status() # 检查HTTP错误
# 如果成功,返回页面内容
print(f"成功获取页面,状态码: {resp.status_code}")
return resp.text
except requests.exceptions.RequestException as e:
print(f"尝试 {attempt + 1} 失败: {e}")
if attempt == max_retries - 1:
print("达到最大重试次数,放弃请求。")
return None
# 失败后等待更长时间再重试
time.sleep(random.uniform(2, 5))
# 使用示例
if __name__ == '__main__':
# 替换为你想爬的电影ID和可用的代理
movie_id = '1292052'
proxy_url = 'http://your_proxy:port' # 例如 'http://127.0.0.1:7890'
html_content = fetch_douban_comments(movie_id, proxy=proxy_url)
if html_content:
# 这里可以接上你的解析代码
print("获取到HTML内容,长度:", len(html_content))
要点解释:
- 随机User-Agent:使用
fake_useragent库每次生成不同的浏览器标识。 - 完整请求头:补全
Referer、Accept等字段,让请求更像浏览器发出的。 - 请求延迟:在请求间加入随机等待时间(1-3秒),避免触发频率限制。
- 错误重试:遇到网络错误或403时,等待更长时间(2-5秒)后重试,最多3次。
如果还不行,可以试试:
- 换质量更高的代理(住宅代理、数据中心代理可能被识别)。
- 检查代理本身是否可用且未被豆瓣封禁。
- 考虑使用
requests.Session()保持会话,并管理cookies。
总结: 核心是请求头+频率控制,代理只是基础。
豆瓣一定很气,明明有接口,还是这么多人爬
哈哈哈,干脆下次 403 页面直接提示用 api 好了
但是我的代理 IP 换了也还是被封了,是可以认为使用的代理 IP 没有访问过豆瓣的网页的情况下也被 403 了
接口似乎访问速率有限制吧
豆瓣好可怜,好多学爬虫的新手都拿豆瓣做练手对象
我是学数据库原理做课设想采集点数据 orz 要求百万条数据左右(本来打算生成),觉得既然如此就采集点真正有意义的数据好玩些–
user agent 都不加 –
明白了,确实没加 user agent。这里面会暴露出自己用 python 请求网站的信息。应该这里和原因有很大关系,谢谢。但是奇怪的是,如果是按照这个原因来防止爬虫的话,为啥不在开始的时候就 403 呢?而是在我爬取了大概 20 分钟后,对我所有的 ip 进行 403
达到了豆瓣的规则的 limit 了吧 这种属于最基本的 一行代码的事 实时的 有的网站有很多高级的玩法 什么 beacon 啊 javascript 执行啊 路径历史判断啊 到最后只好开一个 selenium 完全拟人操作
几秒换一个代理,限制抓取频率
接口没有直接抓取那么全吧
豆瓣确实有接口,但是使用要求比较高,个人开发者现在是不开放的
90%以上的爬虫 demo 都是豆瓣
还有煎蛋妹子图
还有知乎(斜眼笑)
好孩子不会爬妹子图
知乎属于进阶爬虫

