使用Python爬虫会遇到的问题和解决方法(包含案例)

一、HTTP错误(如403 Forbidden)

问题描述:
当使用requests库发起请求时,可能会遇到HTTP 403 Forbidden错误,这通常意味着服务器理解了请求,但是拒绝执行它。

解决方法:
1.设置headers,模拟浏览器请求。
2.使用代理IP。
3.增加cookies
4.降低请求频率,避免被服务器识别为爬虫。

案例:

import requests
import time,random 

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

proxies={'https':'202.123.77.88:7777'}   
cookies=''
url = 'http://example.com' # 替换为实际的目标网站

try:
    response = requests.get(url, headers=headers,proxies=proxies,cookies=cookies)
    response.raise_for_status() # 如果响应状态码不是200,则抛出HTTPError异常
    print(response.text)
except requests.exceptions.HTTPError as errh:
    print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
    print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
    print("OOps: Something Else", err)

降低请求频率,是因为真实用户的访问并不会很频繁,因此我们使用随机时间来模拟核心代码如下:
for i in range(5):  
    response = requests.get("https://example.com";;,headers=headers,proxies=proxies) 
    time.sleep(random.uniform(1.5,3.4))  

 

二、反爬虫机制(如验证码、动态加载数据)

问题描述:
许多网站会采用反爬虫机制,如显示验证码、动态加载数据等,以防止爬虫爬取数据。

解决方法:
使用Selenium或Pyppeteer模拟浏览器操作,处理验证码。
对于动态加载的数据,可以使用Selenium等待数据加载完成后再进行抓取。

案例(Selenium处理动态加载数据):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome() # 需要先安装ChromeDriver
driver.get('http://example.com') # 替换为实际的目标网站

# 等待某个元素加载完成
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "myDynamicElement")))

# 接下来可以获取该元素的数据或进行其他操作
print(element.text)

driver.quit() # 关闭浏览器

以上Selenium代码可以参考之前博文的案例
验证码的话,可以使用

简单图片验证码解决方法:
使用Pyppeteer截图:
await page.screenshot({'path': "test.png", "clip": {"x": 300, "y": 10, "width": 1320, "height": dimensions['height']}}) 
然后发给通义千问等一些识别图形的gpt

 

三、网络延迟或不稳定

问题描述:
由于网络原因,可能会导致爬虫在抓取数据时发生延迟或连接中断。

解决方法:
使用重试机制,当发生异常时自动重试。
增加超时时间,避免因为网络延迟导致请求超时。

案例(使用retrying库实现重试机制):

import requests
from retrying import retry

@retry(stop_max_attempt_number=3, wait_fixed=1000) # 最多重试3次,每次间隔1秒
def fetch_data(url):
    response = requests.get(url)
    response.raise_for_status()
    return response.text

url = 'http://example.com' # 替换为实际的目标网站
data = fetch_data(url)
print(data)

以上就是使用Python爬虫时可能会遇到的问题和解决方法,希望对你有所帮助!

如果大家还有其他的爬虫伪装方式,欢迎在评论区留言交流!请勿用于非法用途!

Python爬虫案例中,抓取狐友(即搜狐社交网络中的动态、用户信息等)通常涉及到使用像`requests`库来发送HTTP请求,`BeautifulSoup`或`lxml`库来解析HTML内容,以及可能用到`pandas`进行数据清洗和存储。以下是一个简单的狐友爬虫案例概述: 1. **导入所需库**: 首先,你需要安装`requests`, `beautifulsoup4`和`lxml`(如果还未安装): ```bash pip install requests beautifulsoup4 lxml ``` 2. **发送请求**: 使用`requests.get()`获取狐友页面的HTML内容,比如抓取某个用户的动态列表页: ```python import requests url = "https://t.sohu.com/u/用户ID动态列表页" response = requests.get(url) ``` 3. **解析HTML**: 使用`BeautifulSoup`解析HTML,找到包含动态信息的部分,提取出标题、内容、时间等字段: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'lxml') post_elements = soup.find_all('div', class_='post-item') # 假设动态列表元素是div并带有特定类名 ``` 4. **数据处理**: 遍历解析后的元素,提取数据并存储到`pandas` DataFrame或字典中: ```python data = [] for post in post_elements: title = post.find('a', class_='title').text content = post.find('div', class_='content').text timestamp = post.find('span', class_='time').text data.append({'title': title, 'content': content, 'timestamp': timestamp}) df = pd.DataFrame(data) ``` 5. **保存数据**: 将处理后的数据保存为CSV或JSON文件: ```python df.to_csv('狐友动态.csv', index=False) ``` 6. **注意**: - 爬虫可能遇到反爬机制,如验证码、IP限制等,可能需要设置代理、间隔时间、模拟浏览器行为等。 - 确保遵守网站的robots.txt协议和使用条款,不要对服务器造成过大压力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

svygh123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值