Python爬虫豆瓣电影评论使用代理还是被403了怎么办?

代理 IP 理论上是从网站申请的高匿代理,写的爬虫程序是判断某个 IP 被封了后换一个代理 IP 继续爬。

response=requests.get(url,proxies=proxy).text

但是之后发现爬久了之后返回的 response 是 403 的页面,不用代理 IP 也是 403,难道是发现了我自己主机的 IP 吗?(代理 IP 是可用的)


Python爬虫豆瓣电影评论使用代理还是被403了怎么办?
17 回复

发现了你的行为是爬虫然后直接封你的代理 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))

要点解释:

  1. 随机User-Agent:使用fake_useragent库每次生成不同的浏览器标识。
  2. 完整请求头:补全RefererAccept等字段,让请求更像浏览器发出的。
  3. 请求延迟:在请求间加入随机等待时间(1-3秒),避免触发频率限制。
  4. 错误重试:遇到网络错误或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 都是豆瓣

还有煎蛋妹子图

还有知乎(斜眼笑)

好孩子不会爬妹子图

知乎属于进阶爬虫

回到顶部