用户可能不太清楚如何获取和集成代理IP到爬虫中。我需要提到两种方式:免费代理和付费代理,并给出示例代码。同时,要提醒用户免费代理可能不稳定,生产环境建议用付费服务。代理的格式通常是http和https,需要在requests库中正确设置proxies参数。
防止反爬的策略,除了代理IP之外,还需要设置User-Agent,可能还需要Referer、Accept-Language等请求头。随机User-Agent的使用可以增加轮换,减少被识别的风险。此外,请求频率的控制也很重要,比如使用time.sleep()来降低请求速度,避免触发反爬机制。
以下是一个使用Python编写的热点事件爬虫示例,包含代理IP和反爬策略。代码以新浪新闻热点榜为例,请根据实际需求修改目标URL和解析逻辑:
import requests
import random
import time
from bs4 import BeautifulSoup
import csv
from fake_useragent import UserAgent
# 配置参数
TARGET_URL = "https://news.sina.com.cn/hotnews/" # 新浪热点新闻页面
PROXY_POOL = [ # 代理IP列表(需自行替换有效代理)
{"http": "http://123.456.789.0:8080", "https": "http://123.456.789.0:8080"},
{"http": "http://111.222.333.444:8888", "https": "http://111.222.333.444:8888"},
]
REQUEST_DELAY = 3 # 请求间隔(秒)
MAX_RETRY = 3 # 最大重试次数
class HotNewsCrawler:
def __init__(self):
self.ua = UserAgent()
self.session = requests.Session()
def get_random_headers(self):
"""生成随机请求头"""
return {
'User-Agent': self.ua.random,
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Referer': 'https://news.sina.com.cn/'
}
def get_with_proxy(self, url, proxy=None):
"""使用代理发送请求"""
try:
headers = self.get_random_headers()
response = self.session.get(
url,
headers=headers,
proxies=proxy,
timeout=10,
verify=False # 简单示例关闭SSL验证(生产环境不建议)
)
response.raise_for_status()
if response.status_code == 200:
return response.text
except Exception as e:
print(f"请求失败: {str(e)}")
return None
def parse_news(self, html):
"""解析新闻页面(示例解析逻辑,需根据实际页面结构调整)"""
soup = BeautifulSoup(html, 'lxml')
news_list = []
# 示例选择器(以新浪新闻结构为例)
for item in soup.select('.news-item'):
title = item.select_one('h2 a').text.strip()
link = item.select_one('a')['href']
news_list.append({"title": title, "link": link})
return news_list
def crawl(self):
"""执行爬取任务"""
retry_count = 0
proxy = random.choice(PROXY_POOL) if PROXY_POOL else None
while retry_count < MAX_RETRY:
html = self.get_with_proxy(TARGET_URL, proxy)
if html:
return self.parse_news(html)
retry_count += 1
print(f"第{retry_count}次重试...")
time.sleep(REQUEST_DELAY * 2) # 重试时延长等待
print("达到最大重试次数,爬取失败")
return []
def save_to_csv(self, data, filename='hot_news.csv'):
"""保存结果到CSV"""
with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'link'])
writer.writeheader()
writer.writerows(data)
if __name__ == "__main__":
crawler = HotNewsCrawler()
# 控制请求频率
time.sleep(REQUEST_DELAY + random.uniform(0, 1))
# 执行爬取
news_data = crawler.crawl()
if news_data:
crawler.save_to_csv(news_data)
print(f"成功抓取{len(news_data)}条热点新闻")
else:
print("未获取到数据")
关键功能说明:
-
代理IP池:
- 使用
PROXY_POOL存储代理IP(需替换为有效代理) - 支持http/https协议代理
- 每次请求随机选择代理IP
- 使用
-
反爬策略:
- 随机User-Agent(使用fake_useragent库)
- 请求间隔控制(REQUEST_DELAY)
- 自动重试机制(MAX_RETRY)
- 随机请求延迟(time.sleep + random)
-
异常处理:
- 自动处理网络请求异常
- 自动重试失败请求
- 验证HTTP状态码
使用说明:
- 安装依赖:
pip install requests beautifulsoup4 fake-useragent csv
2. 代理IP获取建议:
* 免费代理:从公开代理网站抓取(需验证有效性)
* 付费服务:Luminati、Oxylabs等专业代理服务
* 自建代理:使用代理池项目(如ProxyPool)
3. 注意事项:
* 根据目标网站实际结构调整解析逻辑(使用浏览器开发者工具分析页面结构)
* 遵守目标网站robots.txt协议
* 添加更详细的异常日志记录
* 生产环境建议添加以下功能:
* IP有效性验证
* 动态代理池维护
* 分布式爬虫架构
* 验证码处理机制
代码优化建议:
- 增加代理有效性检测:
def check_proxy(proxy):
try:
test_url = "http://httpbin.org/ip"
response = requests.get(test_url, proxies=proxy, timeout=5)
return True if response.status_code == 200 else False
except:
return False
2. 添加分布式支持:
* 使用Redis维护代理池
* 使用Scrapy框架实现
* 添加任务队列系统
3. 增强反爬策略:
* 模拟浏览器行为(使用Selenium/Puppeteer)
* 处理Cookie/Session
* 随机鼠标移动轨迹
* 页面渲染等待时间
请根据实际需求调整代码,并确保遵守相关法律法规和网站的服务条款。