如何向scrapy中的spider传递参数的几种方法


Posted in Python onNovember 18, 2020

有时需要根据项目的实际需求向spider传递参数以控制spider的行为,比如说,根据用户提交的url来控制spider爬取的网站。在这种情况下,可以使用两种方法向spider传递参数。

第一种方法,在命令行用crawl控制spider爬取的时候,加上-a选项,例如:

scrapy crawl myspider -a category=electronics

然后在spider里这样写:

import scrapy

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

  def __init__(self, category=None, *args, **kwargs):
    super(MySpider, self).__init__(*args, **kwargs)
    self.start_urls = ['http://www.example.com/categories/%s' % category]
    # ...

也就是在spider的构造函数里加上带入的参数即可。

第二种方法,在用scrapyd控制spider的时候,可以向schedule.json发送-d选项加入参数,同样的,也需要在spider的构造函数里如上写法。例如:

$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

另外,如果需要在scrapy发出的request上加入参数,可以使用request的meta参数,然后就可以相应的在返回的respose对象中获得传入的参数。这在某些情况下相当有用,比如说需要确定这个url是哪个用户请求爬取的,可以先用上面两种方法之一将信息传递给spider,spider就可以把这个信息加入到request中,然后在相应的reponse中就可以将这个信息与从url的页面中获得的信息一起存入数据库。例如:

def parse_page1(self, response):
  item = MyItem()
  item['main_url'] = response.url
  request = scrapy.Request("http://www.example.com/some_page.html",
               callback=self.parse_page2)
  request.meta['item'] = item
  return request

def parse_page2(self, response):
  item = response.meta['item']
  item['other_url'] = response.url
  return item

到此这篇关于如何向scrapy中的spider传递参数的几种方法的文章就介绍到这了,更多相关scrapy spider传递参数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
解决python写的windows服务不能启动的问题
Apr 15 Python
python中Flask框架简单入门实例
Mar 21 Python
python实现堆和索引堆的代码示例
Mar 19 Python
浅析Python装饰器以及装饰器模式
May 28 Python
Python 面试中 8 个必考问题
Nov 16 Python
Python实现DDos攻击实例详解
Feb 02 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
pytorch 中autograd.grad()函数的用法说明
May 12 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 #Python
Python下载的11种姿势(小结)
Nov 18 #Python
Python监听键盘和鼠标事件的示例代码
Nov 18 #Python
Opencv python 图片生成视频的方法示例
Nov 18 #Python
calendar在python3时间中常用函数举例详解
Nov 18 #Python
Python 远程开关机的方法
Nov 18 #Python
python 元组和列表的区别
Dec 30 #Python
You might like
我的论坛源代码(八)
2006/10/09 PHP
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
nodejs读取并去重excel文件
2018/04/22 NodeJs
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python动态加载变量示例分享
2014/02/17 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
python调用支付宝支付接口流程
2019/08/15 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
高中生学习生活的自我评价
2013/11/27 职场文书
运动会100米解说词
2014/01/23 职场文书
大学军训感想
2014/02/12 职场文书
村干部培训班主持词
2014/03/28 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
索尼ICF-5900W收音机测评
2022/04/24 无线电