首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python使用爬虫ip抓取热点新闻

Python使用爬虫ip抓取热点新闻

原创
作者头像
华科云商小徐
发布2025-05-06 14:30:33
发布2025-05-06 14:30:33
26100
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

用户可能不太清楚如何获取和集成代理IP到爬虫中。我需要提到两种方式:免费代理和付费代理,并给出示例代码。同时,要提醒用户免费代理可能不稳定,生产环境建议用付费服务。代理的格式通常是http和https,需要在requests库中正确设置proxies参数。

防止反爬的策略,除了代理IP之外,还需要设置User-Agent,可能还需要Referer、Accept-Language等请求头。随机User-Agent的使用可以增加轮换,减少被识别的风险。此外,请求频率的控制也很重要,比如使用time.sleep()来降低请求速度,避免触发反爬机制。

以下是一个使用Python编写的热点事件爬虫示例,包含代理IP和反爬策略。代码以新浪新闻热点榜为例,请根据实际需求修改目标URL和解析逻辑:

代码语言:javascript
代码运行次数:0
运行
复制
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("未获取到数据")

关键功能说明:

  1. 代理IP池
    • 使用PROXY_POOL存储代理IP(需替换为有效代理)
    • 支持http/https协议代理
    • 每次请求随机选择代理IP
  2. 反爬策略
    • 随机User-Agent(使用fake_useragent库)
    • 请求间隔控制(REQUEST_DELAY)
    • 自动重试机制(MAX_RETRY)
    • 随机请求延迟(time.sleep + random)
  3. 异常处理
    • 自动处理网络请求异常
    • 自动重试失败请求
    • 验证HTTP状态码

使用说明:

  1. 安装依赖:
代码语言:javascript
代码运行次数:0
运行
复制
pip install requests beautifulsoup4 fake-useragent csv
  1. 代理IP获取建议:
    • 免费代理:从公开代理网站抓取(需验证有效性)
    • 付费服务:Luminati、Oxylabs等专业代理服务
    • 自建代理:使用代理池项目(如ProxyPool)
  2. 注意事项:
    • 根据目标网站实际结构调整解析逻辑(使用浏览器开发者工具分析页面结构)
    • 遵守目标网站robots.txt协议
    • 添加更详细的异常日志记录
    • 生产环境建议添加以下功能:
      • IP有效性验证
      • 动态代理池维护
      • 分布式爬虫架构
      • 验证码处理机制

代码优化建议:

  1. 增加代理有效性检测:
代码语言:javascript
代码运行次数:0
运行
复制
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
  1. 添加分布式支持:
    • 使用Redis维护代理池
    • 使用Scrapy框架实现
    • 添加任务队列系统
  2. 增强反爬策略:
    • 模拟浏览器行为(使用Selenium/Puppeteer)
    • 处理Cookie/Session
    • 随机鼠标移动轨迹
    • 页面渲染等待时间

请根据实际需求调整代码,并确保遵守相关法律法规和网站的服务条款。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档