Python使用scrapy采集数据时为每个请求随机分配user-agent的方法

yizhihongxing

Python使用scrapy采集数据时,为了防止被网站识别为爬虫而被封禁,需要经常更换请求头中的user-agent字段,使得数据请求看起来像是来自真实的浏览器。本文将介绍如何使用scrapy实现为每个请求随机分配user-agent的方法。

前置知识

在了解方法之前,需要掌握基础的scrapy知识,包括scrapy的基本用法、pipeline的作用、Scrapy对Asynchronous requests的支持等等。

具体步骤

  1. 在settings.py中,设置随机user-agent的中间件和Headers,如下:
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400
}

# 启用fake user agent
FAKEUSERAGENT_PROVIDERS = [
    'scrapy_fake_useragent.providers.FakeUserAgentProvider',
    'scrapy_fake_useragent.providers.FakerProvider',
    'scrapy_fake_useragent.providers.FixedUserAgentProvider',
    'scrapy_fake_useragent.providers.ProxyAwareUserAgentProvider',
]

FAKEUSERAGENT_FALLBACK = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'

  1. 安装第三方库fake_useragent

bash
pip install fake_useragent

  1. 创建自定义插件,获取随机user-agent

```python
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
from fake_useragent import UserAgent

class RandomUserAgentMiddleware(UserAgentMiddleware):
def init(self, user_agent=''):
self.user_agent = user_agent

   def process_request(self, request, spider):
       ua = UserAgent(verify_ssl=False).random
       request.headers.setdefault('User-Agent', ua)

```

  1. 将自定义插件添加到pipelines.py中

```python
class RandomUserAgentPipeline(object):
def init(self):
self.ua = UserAgent(verify_ssl=False)

   def process_request(self, request, spider):
       request.headers.setdefault('User-Agent', self.ua.random)

```

  1. 在settings.py中启用随机user-agent

```python
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'myproject.middlewares.RandomUserAgentMiddleware': 400,
}

ITEM_PIPELINES = {
'myproject.pipelines.RandomUserAgentPipeline': 300,
}
```

示例说明

下面是两个示例,展示了如何在实际情况中使用随机user-agent获取数据:

示例一

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        urls = [
            "http://example.com/page1",
            "http://example.com/page2",
            "http://example.com/page3",
        ]

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # 获取网页内容
        page = response.url.split("/")[-2]
        filename = f'page-{page}.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file {filename}')

在这个示例中,为了使用随机user-agent,我们只需要在settings.py中启用RandomUserAgentMiddleware和RandomUserAgentPipeline,即可使每个请求的headers中都包含一个随机的user-agent字段。

示例二

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.loader import ItemLoader
from myproject.items import Product

class MySpider(CrawlSpider):
    name = 'myspider'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (Rule(LinkExtractor(allow=('music\.aspx', )), callback='parse_page'),)

    def parse_page(self, response):
        l = ItemLoader(item=Product(), response=response)
        l.add_xpath('name', '//div[@class="product_name"]/text()')
        l.add_xpath('price', '//div[@class="product_price"]/text()')
        yield l.load_item()

在这个示例中,我们可以将随机user-agent添加到RandomUserAgentPipeline,使得爬虫可以随机使用不同的user-agent获取网站上的商品信息,进而进行数据分析和处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python使用scrapy采集数据时为每个请求随机分配user-agent的方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python +Selenium解决图片验证码登录或注册问题(推荐)

    Python+Selenium结合使用可以帮助我们在自动化测试、爬虫等场景中解决图片验证码登录或注册问题。下面是Python+Selenium解决图片验证码登录或注册的完整攻略: 准备工作 在使用Python+Selenium结合使用之前,我们需要安装好以下工具: Python3:可以从Python官网下载安装包并安装。 Selenium WebDriver…

    python 2023年5月18日
    00
  • Python实现各种邮件发送

    下面我将为你详细讲解Python实现各种邮件发送的完整实例教程。 准备工作 在开始之前,你需要先安装smtplib和email模块。如果你使用的是Python 2.x版本,你还需要安装email.MIME模块。你可以通过pip进行安装: pip install smtplib pip install email pip install email.MIME …

    python 2023年5月13日
    00
  • Python实现机器学习算法的分类

    下面是关于“Python实现机器学习算法的分类”的完整攻略。 1. 机器学习算法分类 机器学算法可以分为监督学习、无监督学习和半监督学习三类。 1.1 监督学习 监督学习是指从标记数据中学习预测模型的过程。在监督学习中,我们需要提供带有标的训练数据,然后使用这些数据训练模型,最后使用模型对新数据进行预测。常用的监督学习算法括决策树、支持向量机、朴素贝叶斯、逻…

    python 2023年5月13日
    00
  • Python中Selenium库使用教程详解

    Python中Selenium库使用教程详解 Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作,例如点击、输入、提交等。本文将详细介绍如何在Python中使用Selenium库,包括安装、配置、基本用法和示例。 安装Selenium库 在使用Selenium之前,需要先安装Selenium库。可以使用pip命令来安装Selenium库: p…

    python 2023年5月15日
    00
  • python实现多人聊天服务器以及客户端

    1. 搭建多人聊天服务器 要搭建多人聊天服务器,我们需要使用Socket模块。下面是服务器端的Python代码示例: import socket # 创建TCP/IP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定到指定端口 server_address = (‘localho…

    python 2023年5月19日
    00
  • Python map及filter函数使用方法解析

    Python map及filter函数使用方法解析 map函数 map函数是Python内置函数之一,它可以对一个序列中的每个元素应用一个函数,返回一个新的序列。map函数的语法如下: map(function, iterable, …) 其中,function是一个函数,iterable是一个序列,可以是列表、元组、集合等。 以下是map函数的使用方法…

    python 2023年5月15日
    00
  • 如何解决centos7中python-pip模块不存在?

    下面是如何解决CentOS7中Python-pip模块不存在的完整攻略: 问题描述 当在CentOS7上安装了Python之后,使用pip命令会报错: -bash: pip: command not found 解决方案 步骤1:安装EPEL源 首先,我们需要安装EPEL源。EPEL (Extra Packages for Enterprise Linux)…

    python 2023年5月14日
    00
  • 对Python 中矩阵或者数组相减的法则详解

    对Python 中矩阵或者数组相减的法则 矩阵或数组相减是数学中的基本操作,Python中也提供了对应的功能。本攻略将详细讲解该功能的使用方法和注意事项。 基本用法 在Python中,我们可以使用NumPy库来进行矩阵或数组相关的操作。使用NumPy库中的np.array()方法可以创建一个数组。示例代码如下: import numpy as np a = …

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部