ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

爬虫被目标网站拒绝?来看看scrapy的请求头设置!

2022-02-01 23:35:30  阅读:434  来源: 互联网

标签:请求 settings 爬虫 Agent scrapy User 537.36


  内容简介

  使用scrapy写爬虫的时候,会莫名其妙的被目标网站拒绝,很大部分是浏览器请求头的原因。

  现在一起来看看scrapy的请求头,并探究设置方式

  工具准备开发环境python2.7 + scrapy 1.1.2测试请求头网站:httpbin/get?show_env=1json在线解析:json/浏览器请求头大全: useragentstring/默认请求头

  命令行执行,新建爬虫

  scrapy startproject myspider

  cd myspider

  scrapy genspider scrapy_spider httpbin

  我们通过对 httpbin/get?show_env=1 的请求,查看本次请求的浏览器信息,可以打开看一看是否是自己的浏览器信息

  改写生成的scrapy_spider.py文件

  import scrapy

  class ScrapySpider(scrapy.Spider):

  name="scrapy_spider"

  allowed_domains=["httpbin"]

  start_urls=(

  # 请求的链接

  "httpbin/get?show_env=1",

  )

  def parse(self, response):

  # 打印出相应结果

  print response.text

  if __name__=='__main__':

  from scrapy import cmdline

  cmdline.execute("scrapy crawl scrapy_spider".split())

  如果是你正好使用mac本,正好使用pycharm可以按快捷键启动爬虫

  shift + control + r

  当然,如果是windows那就右键启动吧

  将返回的文本复制到 json/ 格式化成便于查看的json格式,下面操作亦然,不再赘述。

  {

  "args":{

  "show_env":"1"

  },

  "headers":{

  "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",

  "Accept-Encoding":"gzip,deflate",

  "Accept-Language":"en",

  "Connect-Time":"1",

  "Connection":"close",

  "Host":"httpbin",

  "Total-Route-Time":"0",

  "User-Agent":"Scrapy/1.1.2 (+scrapy)",

  "Via":"1.1 vegur",

  "X-Forwarded-For":"39.155.188.22",

  "X-Forwarded-Port":"443",

  "X-Forwarded-Proto":"https",

  "X-Request-Id":"9dcf91a6-0bed-4d9e-b2bd-b7c88b832d81",

  "X-Request-Start":"1529654403617"

  },

  "origin":"39.155.188.22",

  "url":"httpbin/get?show_env=1"

  }

  看到了吧,默认的请求头是

  "User-Agent":"Scrapy/1.1.2 (+scrapy)"

  修改请求头

  既然这样的话,那我们修改下请求头,达到伪造的效果

  打开下面的链接,选一个自己喜欢的请求头

  useragentstring/pages/useragentstring.php?name=Chrome

  这里使用chrome浏览器请求头

  方式一:全局设置

  此方式设置后,覆盖掉scrapy默认的请求头,全局生效,即所有爬虫都可以享受

  settings.py文件中找到如下代码

  # Crawl responsibly by identifying yourself (and your website) on the user-agent

  # USER_AGENT='myspider (+yourdomain)'

  解除注释,修改为自己的请求头

  # Crawl responsibly by identifying yourself (and your website) on the user-agent

  USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

  运行爬虫,验证效果

  "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

  方式二:爬虫设置

  此方式设置后,单个爬虫生效,此爬虫的所有连接都享受

  class ScrapySpider(scrapy.Spider):

  name="scrapy_spider"

  allowed_domains=["httpbin"]

  # 新添加的代码

  custom_settings={

  "USER_AGENT": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

  }

  # -----------

  start_urls=(

  "httpbin/get?show_env=1",

  )

  再次访问,发现我们的请求头已经成功更换

  "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

  方式三:链接设置

  此方法对单个链接生效, 只是此次请求的这个链接享受

  在Request方法中设置headers参数

  import scrapy

  # 请求头

  USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

  class ScrapySpider(scrapy.Spider):

  name="scrapy_spider"

  allowed_domains=["httpbin"]

  start_urls=(

  "httpbin/get?show_env=1",

  )

  # 新加的代码

  def start_requests(self):

  for url in self.start_urls:

  yield scrapy.Request(url, headers={"User-Agent": USER_AGENT})

  # ------------

  def parse(self, response):

  print response.text

  测试效果

  "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

  方法四:中间件设置

  此方法可以从整个项目中去修改请求头的设置规则,变化多端,不同的写法,可以配置出不同的设置方式,下面是一个比较简单的示例

  私信小编007即可获取数十套PDF的获取方式哦!

  我们参考scrapy默认处理请求头的中间件

  from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

  编写中间件

  # middlewares.py

  class RandomUserAgentMiddleware(object):

  def process_request(self, request, spider):

  request.headers['User-Agent']="" # 绝对设置,其他设置都不生效

  我们可以从下面找到默认设置

  from scrapy.settings import default_settings

  找到项目中对请求头起作用的中间件

  'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,

  在settings.py 或者custom_settings替换原有的中间件

  "DOWNLOADER_MIDDLEWARES": {

  'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,

  "myspider.middlewares.RandomUserAgentMiddleware": 400,

  }

  这样可以从全局,或者局部替换掉请求头规则

  作用优先级

  如果作如下设置

  # settings.py

  USER_AGENT="settings"

  # scrapy_spider.py

  custom_settings={

  "USER_AGENT": "custom_settings",

  }

  headers={"User-Agent": "header"}

  运行效果为:

  "User-Agent":"header"

  注释掉headers

  "User-Agent":"custom_settings"

  注释掉custom_settings

  "User-Agent":"custom_settings"

  注释掉settings

  "User-Agent":"Scrapy/1.1.2 (+scrapy)"

  可见优先级为:

  headers > custom_settings > settings.py > Scrapy默认

  注意

  注意User-Agent参数的写法

  headers={"User-Agent": USER_AGENT})

  如果写错了,很可能发生奇怪的事情

  headers={"User_Agent": USER_AGENT}

  请求头中多了Scrapy…

  "User-Agent":"Scrapy/1.1.2 (+scrapy),Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

  其实,很好区分:

  User-Agent: 浏览器请求头参数,html代码中经常用-

  USER_AGENT: python变量

  建议:

  每次写浏览器参数,如果怕写错就打开自己的浏览器,随便测试一个页面,从里边复制

  总结

  设置方式作用效果Scrapy默认所用爬虫所有请求settings.py / USER_AGENT=""所用爬虫所有请求custom_settings={"USER_AGENT": "",}单个爬虫所有请求headers={"User-Agent": ""}单个请求中间件方式downloadermiddleware视编写规则而定

  表格从上至下,优先级逐渐增加,中间件除外,一般掌握三种方式就够用了:

  settings.pycustom_settingsheaders

  作为从入门到实战的我,踩过不少坑,此文做了简单的总结,也分享了几个比较实用的网站。希望此文的分享能给大家提供一个少走弯路的捷径,那么此文的价值也就体现了。

标签:请求,settings,爬虫,Agent,scrapy,User,537.36
来源: https://www.cnblogs.com/ebuybay/p/15859905.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有