在爬虫开发中,使用随机请求头(User-Agent)可以有效避免被网站反爬机制识别。fake-useragent是一个常用的Python库,可以生成各种浏览器的随机User-Agent。

安装fake-useragent

bash

pip install fake-useragent

基础封装函数

下面是一个封装好的随机User-Agent生成器,包含异常处理和自动更新功能:

python

from fake_useragent import UserAgent
from functools import lru_cache
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class RandomUserAgent:
    def __init__(self):
        self.ua = UserAgent()
        self._fallback_agents = [
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0'
        ]
    
    @lru_cache(maxsize=32)  # 缓存最近生成的32个User-Agent
    def get_random(self, browser_type=None):
        """
        获取随机User-Agent
        :param browser_type: 可选参数,指定浏览器类型
                           (chrome, firefox, safari, edge等)
        :return: 随机User-Agent字符串
        """
        try:
            if browser_type:
                return getattr(self.ua, browser_type)
            return self.ua.random
        except Exception as e:
            logger.warning(f"获取随机User-Agent失败: {e}, 使用备用User-Agent")
            import random
            return random.choice(self._fallback_agents)
    
    def get_headers(self, browser_type=None, **kwargs):
        """
        获取包含随机User-Agent的请求头
        :param browser_type: 可选,指定浏览器类型
        :param kwargs: 可以添加其他请求头字段
        :return: 包含随机User-Agent的请求头字典
        """
        headers = {
            'User-Agent': self.get_random(browser_type),
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'en-US,en;q=0.5',
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
        }
        headers.update(kwargs)
        return headers

# 创建全局实例
random_ua = RandomUserAgent()

# 快捷调用方式
def get_random_ua(browser_type=None):
    """快捷获取随机User-Agent"""
    return random_ua.get_random(browser_type)

def get_random_headers(browser_type=None, **kwargs):
    """快捷获取包含随机User-Agent的请求头"""
    return random_ua.get_headers(browser_type, **kwargs)

使用示例

基本使用

python

# 获取随机User-Agent字符串
print(get_random_ua())  # 随机浏览器
print(get_random_ua('chrome'))  # 仅Chrome浏览器
print(get_random_ua('firefox'))  # 仅Firefox浏览器

# 获取完整请求头
headers = get_random_headers()
print(headers)

# 自定义添加其他头信息
custom_headers = get_random_headers(
    referer='https://www.google.com/',
    cookie='some_cookie_value'
)
print(custom_headers)

在requests中使用

python

import requests

url = 'https://httpbin.org/user-agent'
headers = get_random_headers()

response = requests.get(url, headers=headers)
print(response.json())  # 查看返回的User-Agent

高级配置

1. 禁用缓存

默认情况下,fake-useragent会缓存下载的User-Agent数据。如果需要禁用:

python

ua = UserAgent(cache=False)

2. 自定义数据文件路径

python

ua = UserAgent(path='/path/to/custom/fake_useragent.json')

3. 使用特定版本浏览器

python

# 获取特定版本的Chrome User-Agent
from fake_useragent import FakeUserAgent
ua = FakeUserAgent(browsers=['chrome'], os='windows', min_percentage=1.3)
print(ua.chrome)

注意事项

  1. 网络连接问题:首次使用会下载User-Agent数据库,确保网络畅通

  2. 更新数据库:定期更新数据库获取最新的User-Agent

    python

    from fake_useragent import UserAgent
    ua = UserAgent()
    ua.update()
  3. 备用方案:如fake-useragent不可用,代码中已包含备用User-Agent列表

  4. 合理使用:不要过于频繁地更换User-Agent,这本身可能被识别为爬虫行为

这个封装提供了简单易用的接口,同时具备良好的健壮性和可扩展性,适合大多数爬虫项目的需求。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐