Scrapy中如何向Spider传入参数的方法实现


Posted in Python onSeptember 28, 2020

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

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

https://tieba.baidu.com/f?kw=放置奇兵&ie=utf-8&pn=250

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

方式一

通过 scrapy crawl 命令的 -a 参数向 spider 传递参数。

# -*- coding: utf-8 -*-
import scrapy

class TiebaSpider(scrapy.Spider):
  name = 'tieba' # 贴吧爬虫
  allowed_domains = ['tieba.baidu.com'] # 允许爬取的范围
  start_urls = [] # 爬虫起始地址

  # 命令格式: scrapy crawl tieba -a tiebaName=放置奇兵 -a pn=250
  def __init__(self, tiebaName=None, pn=None, *args, **kwargs):
    print('< 贴吧名称 >: ' + tiebaName)
    super(eval(self.__class__.__name__), self).__init__(*args, **kwargs)
    self.start_urls = ['https://tieba.baidu.com/f?kw=%s&ie=utf-8&pn=%s' % (tiebaName,pn)]

  def parse(self, response):
    print(response.request.url) # 结果:https://tieba.baidu.com/f?kw=%E6%94%BE%E7%BD%AE%E5%A5%87%E5%85%B5&ie=utf-8&pn=250

方式二

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

Scrapy中如何向Spider传入参数的方法实现

settings.py

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

# 指定 Scrapy 命令存放目录
COMMANDS_MODULE = 'baidu_tieba.commands'

run.py

在指定的命令存放目录中创建命令文件,在这里我们创建的命令文件为 run.py ,将来执行的命令格式为:
scrapy run [ -option option_value]

import scrapy.commands.crawl as crawl
from scrapy.exceptions import UsageError
from scrapy.commands import ScrapyCommand


class Command(crawl.Command):

  def add_options(self, parser):
    # 为命令添加选项
    ScrapyCommand.add_options(self, parser)
    parser.add_option("-k", "--keyword", type="str", dest="keyword", default="",
             help="set the tieba's name you want to crawl")
    parser.add_option("-p", "--pageNum", type="int", action="store", dest="pageNum", default=0,
             help="set the page number you want to crawl")

  def process_options(self, args, opts):
    # 处理从命令行中传入的选项参数
    ScrapyCommand.process_options(self, args, opts)
    if opts.keyword:
      tiebaName = opts.keyword.strip()
      if tiebaName != '':
        self.settings.set('TIEBA_NAME', tiebaName, priority='cmdline')
    else:
      raise UsageError("U must specify the tieba's name to crawl,use -kw TIEBA_NAME!")
    self.settings.set('PAGE_NUM', opts.pageNum, priority='cmdline')

  def run(self, args, opts):
    # 启动爬虫
    self.crawler_process.crawl('tieba')
    self.crawler_process.start()

pipelines.py

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

# -*- coding: utf-8 -*-
import json

class BaiduTiebaPipeline(object):

  @classmethod
  def from_settings(cls, settings):
    return cls(settings)

  def __init__(self, settings):
    self.settings = settings

  def open_spider(self, spider):
    # 开启爬虫
    spider.start_urls = [
      'https://tieba.baidu.com/f?kw=%s&ie=utf-8&pn=%s' % (self.settings['TIEBA_NAME'], self.settings['PAGE_NUM'])]

  def close_spider(self, spider):
    # 关闭爬虫
    pass

  def process_item(self, item, spider):
    # 将帖子内容保存到文件
    with open('tieba.txt', 'a', encoding='utf-8') as f:
      json.dump(dict(item), f, ensure_ascii=False, indent=2)
    return item

设置完成后,别忘了在settings.py中启用BaiduTiebaPipeline。 

ITEM_PIPELINES = {
  'baidu_tieba.pipelines.BaiduTiebaPipeline': 50,
}

启动示例

大功告成,参照如下命令格式启动贴吧爬虫。 

scrapy run -k 放置奇兵 -p 250

Scrapy中如何向Spider传入参数的方法实现

参考文章:

https://blog.csdn.net/c0411034/article/details/81750028 

https://blog.csdn.net/qq_24760381/article/details/80361400 

https://blog.csdn.net/qq_38282706/article/details/80991196 

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

Python 相关文章推荐
Python栈类实例分析
Jun 15 Python
Python函数的周期性执行实现方法
Aug 13 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
python如何去除字符串中不想要的字符
Jul 05 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
Python 分享10个PyCharm技巧
Jul 13 Python
Python3视频转字符动画的实例代码
Aug 29 Python
Python安装OpenCV的示例代码
Mar 05 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 #Python
小结Python的反射机制
Sep 28 #Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 #Python
scrapy结合selenium解析动态页面的实现
Sep 28 #Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 #Python
python 常见的反爬虫策略
Sep 27 #Python
python 5个实用的技巧
Sep 27 #Python
You might like
php 不同编码下的字符串长度区分
2009/09/26 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
Vue渲染函数详解
2017/09/15 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
Python连接数据库学习之DB-API详解
2017/02/07 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
python颜色随机生成器的实例代码
2020/01/10 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
Python学习笔记之装饰器
2020/08/06 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
JAVA高级程序员面试题
2013/09/06 面试题
校园活动策划书范文
2014/01/10 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
新教师个人工作总结
2015/02/06 职场文书
金陵十三钗观后感
2015/06/04 职场文书