Python爬虫爬取数据报错

报错:

Error fetching the URL: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))

报错原因:

  • 目标服务器限制

    • 目标网站可能已经检测到你的请求来自自动化工具(如爬虫、脚本等)而拒绝了连接。这种情况常见于防爬虫机制较强的网站,服务器会主动切断与不符合正常浏览器请求模式的连接。
  • IP 被封禁

    • 如果你多次尝试请求相同的服务器或频繁访问某些页面,服务器可能会认为你是一个爬虫或恶意访问者,从而临时封禁你的 IP 地址。
  • 网络问题

    • 可能是由于网络不稳定、连接超时或者防火墙问题导致连接被重置。
  • 代理问题

    • 如果你使用了代理,可能代理服务器遇到了问题,导致无法成功连接到目标网站。

解决方法:

1、配置响应头模拟浏览器访问:
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }

 

2. 使用代理

你可以尝试通过代理服务器发送请求,以避免 IP 被封禁。你可以选择使用免费的或付费的代理服务。

proxies = {
    'http': 'http://your_proxy_ip:port',
    'https': 'https://your_proxy_ip:port'
}

response = requests.get(url, headers=headers, proxies=proxies)
3. 增加请求间隔时间

如果你频繁发送请求,目标网站可能会认为你是一个爬虫。你可以通过设置请求间隔来避免被封锁。

import time
time.sleep(1)  # 等待 1 秒钟再发送下一个请求
4. 重试机制

实现一个简单的重试机制,尝试多次连接,间隔一定时间后再试。

ConnectionResetError(10054) 错误一般与目标网站的防火墙或防爬虫措施有关,或者与网络配置和代理设置有关。通过模拟浏览器请求、使用代理、降低请求频率和加入重试机制等方式,你可以增加请求成功的概率。如果问题持续存在,可能需要更换 IP 或联系网站管理员。 

Python爬虫超出分页却没有报错,可能存在以下原因及相应解决办法: ### 原因 - **请求逻辑问题**:爬虫在发送请求时,没有正确判断分页的边界。例如,分页参数可能是通过递增数字生成的,当超出实际分页范围时,服务器依然返回正常响应(如返回空数据但状态码为200),导致爬虫无法感知分页已超出。 - **服务器响应问题**:服务器在处理超出分页的请求时,没有返回错误状态码,而是返回了正常的HTTP状态码(如200),只是响应内容为空或者包含特定的提示信息,但爬虫没有对这些内容进行有效判断。 - **解析逻辑问题**:爬虫在解析响应内容时,没有正确识别分页结束的标志。例如,实际分页结束后页面会出现特定的提示信息,但爬虫没有对该信息进行解析和判断。 ### 解决办法 - **添加分页边界判断**:在发送请求前,先获取实际的分页总数,通过爬取分页导航栏中的信息或者从接口返回的数据中提取分页总数。然后在循环发送请求时,当达到分页总数后停止请求。示例代码如下: ```python import requests from bs4 import BeautifulSoup # 假设获取到的分页总数为total_pages total_pages = 10 for page in range(1, total_pages + 1): url = f'https://example.com?page={page}' response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') # 处理页面内容 pass ``` - **检查响应内容**:在获取到服务器响应后,检查响应内容是否为空或者包含特定的提示信息。如果是,则认为已经超出分页范围,停止后续请求。示例代码如下: ```python import requests page = 1 while True: url = f'https://example.com?page={page}' response = requests.get(url) if response.status_code == 200: if not response.text.strip(): # 检查响应内容是否为空 break # 处理页面内容 page += 1 else: break ``` - **设置请求超时时间**:为请求设置合理的超时时间,避免因服务器响应过慢而导致爬虫长时间等待。示例代码如下: ```python import requests try: response = requests.get('https://example.com', timeout=5) # 处理响应 except requests.exceptions.Timeout: print('请求超时') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值