ouyangcuihuar 2022-09-20 19:03 采纳率: 0%
浏览 37

request爬取时经常被封禁如何解决

最近学习python爬虫,在用requests爬取非正版小说网站时遇到问题,恳请各位解惑。我的目的是爬取一部小说,方法是先获取目录页的链接,然后依次访问并爬取文本,其中先后出现两种问题:

  1. 爬虫运行初期较为顺利,一定次数(10-40次)后频繁出现“max retries exceed with url”错误,估计是被服务器封锁IP,即便使用高匿IP也无法避免。一旦发生,更换IP也无法访问,只能等待解封。起初尝试关闭connection和增加等待时间,无果,后通过增加重连次数的方式,程序基本得以运行,但问题没有得到解决。
  2. 在规避上述问题后,新问题又产生了。在爬取40余次后,返回代码就变为403,无法获取内容,同上,更换IP也无法避免。
def get_html(url):
    proxies = {
        'https': '106.15.107.36:3128'
    }  # 免费高匿ip
    headers = {
        'User-Agent': random.random(agent-list),  # 随机user-agent
        'Referer': lambda x: re.search(
        "^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9-+]{0,61}[a-zA-Z0-9])?.+)+[a-zA-Z]{2,6}(/)", url).group(),  # 正则表达式获取referer
        'DNT': "1",
        'Accept': 'text/novel_html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,'
                  'application/signed-exchange;v=b3;q=0.9',
        'Connection': 'close',  # 关闭链接
        'Accept-Language': 'zh-CN,zh;q=0.9,en-CN;q=0.8,en;q=0.7',
        'Accept-Encoding': 'gzip, deflate, br',
    }

    i = 0
    while i < 3:  # retry三次
        try:
            response = requests.get(url, headers=headers, proxies=proxies, timeout=5)  # 传递完整参数
            response.encoding = response.apparent_encoding
            response.keep_alive = False  # 再次关闭链接
        except requests.exceptions.RequestException as e:
            i += 1
            print(e)
            time.sleep(5)
        else:
            text = unicodedata.normalize('NFKC', response.text)  # 格式化,避免/xa0等占位字符
            html = pyquery.PyQuery(text)
            return html

部分代码如上,爬取小说目录和章节都是调用这个函数。为解决上述两种问题,我参阅了大量类似代码,都没有找到明确结论。我想非正版小说网站通常不会具备如此强大的反爬机制,然而我向request传递了完整的headers、proxies和render都不能完整爬取,而其他示例中往往只传递user-agent就能完成。

期望能有同志解答其中的逻辑关系,如不吝赐教,本人感激不尽。

  • 写回答

1条回答 默认 最新

  • 爱音斯坦牛 全栈领域优质创作者 2022-09-20 19:22
    关注

    构建ip代理池和user-agent池,然后每次请求用time.sleep间隔一哈,然后试试

    评论

报告相同问题?

问题事件

  • 修改了问题 9月21日
  • 修改了问题 9月21日
  • 修改了问题 9月20日
  • 修改了问题 9月20日
  • 展开全部

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)