Python爬取知乎回答信息碰到:Max retries exceeded with URL

本文介绍了解决知乎爬虫中遇到的问题的方法,特别是如何处理翻页和异步加载数据的情况。通过使用循环加sleep的方式,结合代理IP,可以有效避免被知乎服务器拒绝访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那天我在爬取知乎图片的时候碰到了这个问题。

开始我以为程序逻辑出错了,折腾了很久,知乎现在要爬取回答下面所有信息的话,就得翻页了,而获取翻页以及更多的信息就得考虑异步加载。

然后在浏览器里面找到了下一页的url


其中,next就是下一页的url,previous就是上一页的url,total:518是问题下回答的总数。

估计知乎对这些url的访问做了限制,虽然我弄了代理,但还是碰到了这个问题。

解决办法如下:

在requests库获取html时,如果碰到访问不成功,则用try-except加上循环继续访问,并用sleep控制访问频率

html = ""
    while html == "":      #因为请求可能被知乎拒绝,采用循环+sleep的方式重复发送,但保持频率不太高
        try:
            proxies = get_random_ip(ipList)
            print("这次试用ip:{}".format(proxies))
            r = requests.request("GET", url, headers=headers, params=querystring, proxies=proxies)
            r.encoding = 'utf-8'
            html = r.text
            return html
        except:
            print("Connection refused by the server..")
            print("Let me sleep for 5 seconds")
            print("ZZzzzz...")
            sleep(5)
            print("Was a nice sleep, now let me continue...")
            continue

问题到这里应该就解决了。

参考:Max retries exceed with URL (需要翻墙)

### 使用Python编写爬虫程序抓取乎网站的回答数据 为了使用Python编写能够抓取乎网站回答内容的爬虫,需遵循一系列特定的技术步骤和技术栈选择。技术栈通常包括`requests`来发送HTTP请求,利用布隆过滤器(Bloom Filter)处理重复检测问题,采用XPath解析HTML文档结构,并考虑反爬虫策略以及使用MySQL数据保存收集到的数据[^4]。 #### 准备工作 安装必要的Python包是第一步操作: ```bash pip install requests lxml mysql-connector-python bloom-filter murmurhash3 ``` 这些工具分别负责不同的功能:`requests`用于发起网络请求;`lxml`提供高效的XML/HTML解析能力;`mysql-connector-python`允许连接并操作MySQL数据;而`bloom-filter`和`murmurhash3`则有助于提高效率与准确性。 #### 编写基础代码框架 构建一个简单的爬虫脚本如下所示: ```python import requests from lxml import etree import mysql.connector from bloom_filter import BloomFilter import mmh3 # MurmurHash3 implementation def fetch_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', } response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: raise Exception(f"Failed to load page {url}") def parse_html(html_content): tree = etree.HTML(html_content) answers = [] for item in tree.xpath('//div[@class="AnswerItem"]'): author = ''.join(item.xpath('.//a[@class="author-link"]/text()')) content = ''.join(item.xpath('.//span[@class="content"]/text()')).strip() answer_data = {'author': author, 'content': content} answers.append(answer_data) return answers # 数据配置信息 db_config = { "host": "localhost", "user": "root", "password": "", "database": "zhihu" } conn = mysql.connector.connect(**db_config) cursor = conn.cursor() seen_urls_bf = BloomFilter(max_elements=1e7, error_rate=0.1) def save_to_db(data_list): insert_query = """ INSERT INTO answers (author, content) VALUES (%s, %s); """ cursor.executemany(insert_query, [(d['author'], d['content']) for d in data_list]) conn.commit() if __name__ == "__main__": start_url = "https://www.zhihu.com/question/some_question_id" try: html = fetch_page(start_url) parsed_answers = parse_html(html) filtered_new_items = [ item for item in parsed_answers if not any(mmh3.hash(key.encode('utf8')) in seen_urls_bf for key in item.values()) ] for new_item in filtered_new_items: for value in new_item.values(): hash_value = mmh3.hash(value.encode('utf8')) seen_urls_bf.add(hash_value) save_to_db(filtered_new_items) except Exception as e: print(e) finally: cursor.close() conn.close() ``` 这段代码展示了如何从指定URL加载页面、提取所需的信息片段、去重并将最终结果存入关系型数据中。 请注意,在实际应用此段代码前应当仔细阅读目标站点的服务条款和服务协议,确保活动合法合规,尊重他人的识产权和个人隐私权[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值