zoukankan      html  css  js  c++  java
  • Scrapy 增加随机请求头 user_agent

    原文:

    1. 为什么要增加随机请求头:更好地伪装浏览器,防止被 Ban。

    2. 如何在每次请求时,更换不同的 user_agent,Scrapy 使用 Middleware 即可

      Spider 中间件 (Middleware) 下载器中间件是介入到 Scrapy 的 spider 处理机制的钩子框架,可以添加代码来处理发送给 Spiders 的 response 及 spider 产生的 item 和 request。

      官网说明在这里:Spider Middleware

    添加 middleware 的步骤:
    1)创建一个中间件 (RandomAgentMiddleware)
    设置请求时使用随机 user_agent

    2) 在 settings.py 中配置,激活中间件。
    网上文章基本上转的都是下面这段代码:

    1. 这段代码中的疑问:
      1)自己写的 Middleware 放在哪个目录下
      2)settings.py 中的 MIDDLEWARES 的路径是如何定

      1)
      自己编写的中间件放在 items.py 和 settings.py 的同一级目录。

      2)
      settings.py 中的 MIDDLEWARES 的路径,应该是:

      yourproject.middlewares(文件名).middleware类

      如果你的中间件的类名和文件名都使用了 RandomUserAgentMiddleware,那这个路径应该写成:

      xiaozhu.RandomUserAgentMiddleware.RandomUserAgentMiddleware

      这一点,大家可以比较引入自己写的 pipelines,只不过 Scrapy 框架本身为我们创建了一个 pipelines.py

      3) 在 middleware 中间件中导入 settings 中的 USER_AGENT_LIST
      我使用的是 mac,因为 settings.py 与 RandomUserAgentMiddleware 在同一级目录

      from settings import USER_AGENT_LIST

    Scrapy 增加随机 user_agent 的完整代码:

    from settings import USER_AGENT_LIST
    
    import random
    from scrapy import log
    
    class RandomUserAgentMiddleware(object):
        def process_request(self, request, spider):
            ua  = random.choice(USER_AGENT_LIST)
            if ua:
                request.headers.setdefault('User-Agent', ua)

    settings.py 中:

    USER_AGENT_LIST=[
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    ]
    DOWNLOADER_MIDDLEWARES = {
        'xiaozhu.user_agent_middleware.RandomUserAgentMiddleware': 400,
        'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
    }

    代码 Github: https://github.com/ppy2790/xiaozhu




  • 相关阅读:
    今天遇到的i++问题之记录
    JS实现表单输入Enter键转换焦点框
    点击不同链接,显示同一个页面下的不同页面
    jQuery获取属性之自己遇到的问题
    数据结构2 二叉树的高度和宽度
    Android 实现两个list分别出现(在某一时刻只出现一个控件)
    <转>Android开发使输入框点击弹出日期选择对话框的方法
    Java 图片转字节流 实现 图片->字节流(字符串)->图片
    Android 动态添加Spinner(.java文件内实现) 实现 改变spinner 内文字属性
    Android 动态添加线性布局(.java文件内) 实现控件按比例分割空间
  • 原文地址:https://www.cnblogs.com/dahu-daqing/p/7580719.html
Copyright © 2011-2022 走看看