Scrapy中如何实现向蜘蛛传入参数

  介绍

今天就跟大家聊聊有关Scrapy中如何实现向蜘蛛传入参数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

在使用Scrapy爬取数据时,有时会碰到需要根据传递给蜘蛛的参数来决定爬取哪些Url或者爬取哪些页的情况。

例如,百度贴吧的放置奇兵吧的地址如下,其中千瓦参数用来指定贴吧名称,pn参数用来对帖子进行翻页。

<代码> https://tieba.baidu.com/f& # 63; <强>千瓦=放置奇兵,ie=utf-8& <强> pn =250

如果我们希望通过参数传递的方式将贴吧名称和页数等参数传给蜘蛛来控制我们要爬取哪一个贴吧,爬取哪些页。遇到这种情况,有以下两种方法向蜘蛛传递参数。

<强>通过Scrapy爬命令的——参数向蜘蛛传递参数。

 # - * -编码:utf - 8 - *
  进口scrapy
  
  类TiebaSpider (scrapy.Spider):
  name=& # 39;贴吧# 39;#贴吧爬虫
  allowed_domains=[& # 39; tieba.baidu.com& # 39;] #允许爬取的范围
  start_urls=[] #爬虫起始地址
  
  #命令格式:scrapy爬贴吧——tiebaName=放置奇兵——pn=250
  def __init__(自我,tiebaName=None, pn=None, * args, * * kwargs):
  打印(& # 39;& lt;贴吧名称祝辞:& # 39;+ tiebaName)
  超级(eval (self.__class__.__name__),自我)。__init__ (* args, * * kwargs)
  自我。start_urls=[& # 39; https://tieba.baidu.com/f& # 63千瓦=% s& ie=utf-8& pn=% & # 39;% (tiebaName pn)]
  
  def解析(自我,反应):
  打印(response.request.url) #结果:https://tieba.baidu.com/f& # 63;千瓦=% E6 % 94% 87% % E7%BD % AE % E5%A5 % e5 % 85% b5& ie=utf-8& pn=250 

仿照scrapy的爬行命令的源代码,重新自定义一个专用命令。

 scrapy中如何实现向蜘蛛传入参数

<强> settings.py

首先,需要在设置。py文件中增加如下配置来指定自定义scrapy命令的存放目录。

 #指定Scrapy命令存放目录
  COMMANDS_MODULE=& # 39; baidu_tieba.commands& # 39; 

<强> run.py

在指定的命令存放目录中创建命令文件,在这里我们创建的命令文件为运行。py将来执行的命令格式为:
<代码> scrapy运行[选项option_value]

进口scrapy.commands.crawl爬行
  从scrapy。异常进口UsageError
  从scrapy.commands进口ScrapyCommand
  
  
  类命令(crawl.Command):
  
  def add_options(自我,解析器):
  #为命令添加选项
  ScrapyCommand。add_options(自我,解析器)
  parser.add_option (“-k",“——keyword",类型=皊tr", dest=発eyword",默认=啊?
  帮助=吧柚锰? 39;你想crawl"名称;)
  parser.add_option (“-p",“——pageNum",类型=癷nt", action=皊tore", dest=皃ageNum",默认=0,
  帮助=吧柚靡陈肽阆隿rawl",)
  
  def process_options(自我、参数选择):
  #处理从命令行中传入的选项参数
  ScrapyCommand。process_options(自我、参数选择)
  如果opts.keyword:
  tiebaName=opts.keyword.strip ()
  如果tiebaName !=& # 39; & # 39;:
  self.settings.set (& # 39; TIEBA_NAME& # 39;, tiebaName,优先级=& # 39;cmdline& # 39;)
  其他:
  提高UsageError (“U必须指定贴吧# 39;姓名爬行,用千瓦TIEBA_NAME !“)
  self.settings.set (& # 39; PAGE_NUM& # 39;,选择。pageNum、优先级=& # 39;cmdline& # 39;)
  
  def运行(自我、参数选择):
  #启动爬虫
  self.crawler_process.crawl(& # 39;贴吧# 39;)
  self.crawler_process.start () 

<强> pipelines.py

在BaiduTiebaPipeline的open_spider()方法中利用运行命令传入的参数对TiebaSpider进行初始化,在这里示例设置了一下start_urls。

 # - * -编码:utf - 8 - *
  进口json
  
  类BaiduTiebaPipeline(对象):
  
  @classmethod
  def from_settings (cls、设置):
  返回cls(设置)
  
  def __init__(自我,设置):
  自我。设置=设置
  
  def open_spider(自我,蜘蛛):
  #开启爬虫
  蜘蛛。start_urls=[
  & # 39;https://tieba.baidu.com/f& # 63千瓦=% s& ie=utf-8& pn=% & # 39;% (self.settings [& # 39; TIEBA_NAME& # 39;], self.settings [& # 39; PAGE_NUM& # 39;)))
  
  def close_spider(自我,蜘蛛):
  #关闭爬虫
  通过
  
  def process_item(自我,物品,蜘蛛):
  #将帖子内容保存到文件
  张开(& # 39;tieba.txt& # 39;, & # 39;一个# 39;,编码=& # 39;utf - 8 # 39;) f:
  json.dump (dict(项),f, ensure_ascii=False,缩进=2)
  返回项目

Scrapy中如何实现向蜘蛛传入参数