文章主题

怎样在一个scrapy框架中运行多个爬虫项目?

实现总过程
  1. 首先创建scrapy项目:scrapy startproject ScrapyProjects
  2. 创建具体的spider:
    scrapy genspider spider_lianjia lianjia.com (网站1)
    scrapy genspider spider_book yousuu.com (网站2)
  3. 项目基本配置:
    settings:
BOT_NAME = 'ScrapyProjects'SPIDER_MODULES = ['ScrapyProjects.spiders']
NEWSPIDER_MODULE = 'ScrapyProjects.spiders'# Obey robots.txt rules
ROBOTSTXT_OBEY = False# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 0
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False# Override the default request headers:DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',}# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
SPIDER_MIDDLEWARES = {'ScrapyProjects.middlewares.ScrapyprojectsSpiderMiddleware': 543,
}# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {'ScrapyProjects.middlewares.ScrapyprojectsDownloaderMiddleware': 543,}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'ScrapyProjects.pipelines.LianJiaPipeline': 200,'ScrapyProjects.pipelines.BookPipeline': 300,
}

pipelines:

from itemadapter import ItemAdapterimport jsonclass LianJiaPipeline:sum = []def process_item(self, item, spider):LianJiaPipeline.sum.append(dict(item))return itemdef close_spider(self,spider):with open('./data/lianjia.json','w',encoding='utf-8')as fp:fp.write(json.dumps({'data':LianJiaPipeline.sum},ensure_ascii=False))class BookPipeline:sum = []def process_item(self, item, spider):BookPipeline.sum.append(dict(item))return itemdef close_spider(self, spider):with open('./data/book.json', 'w', encoding='utf-8')as fp:fp.write(json.dumps({'data': BookPipeline.sum}, ensure_ascii=False))

middleware:保持自己项目原有的代码,不要改变

items:

import scrapyclass LianJiaItem(scrapy.Item):title = scrapy.Field()class BookItem(scrapy.Item):book_name = scrapy.Field()

具体的spider:
spider_book.py

import scrapy
from ..items import BookItemclass SpiderBookSpider(scrapy.Spider):name = 'spider_book'allowed_domains = ['yoususu.com']custom_settings = {'ITEM_PIPELINES': {'ScrapyProjects.pipelines.BookPipeline': 300},}def start_requests(self):for i in range(1,11):url = 'https://www.yousuu.com/bookstore/?channel&classId&tag&countWord&status&update&sort&page={}'.format(i)yield scrapy.Request(url=url,callback=self.parse_data)def parse_data(self, response):items = BookItem()ele_lists = response.xpath('//div[@class="common-card-layout StoreBooks"]/div/div')for ele in ele_lists:book_name = ele.xpath('.//a[@class="book-name"]/text()').extract_first()print(book_name)items['book_name'] = book_nameyield items

spider_lianjia.py

import scrapy
import requests
import json
import re
import math
import requests
from ..items import LianJiaItem
# from lxml import etree
class SpiderLianjiaSpider(scrapy.Spider):custom_settings = {'ITEM_PIPELINES': {'ScrapyProjects.pipelines.LianJiaPipeline': 300},}name = 'spider_lianjia'allowed_domains = ['*']def start_requests(self):for i in range(1,10):url = "https://hz.fang.lianjia.com/loupan/pg{}/".format(i)data = 'hello world'yield scrapy.Request(url=url, callback=self.parse_lists,meta={'d':data})def parse_lists(self,response):'''不同spider对应不同user_agent'''items = LianJiaItem()ele_lists = response.xpath('//ul[@class="resblock-list-wrapper"]/li')for ele in ele_lists:title = ele.xpath('./a/@title').extract_first()items['title'] = titleyield items

在settings同级目录创建两个文件夹:data(存放爬取的数据,个人实现的方式)和mycmd(重写底层run方法)

mycmd目录下有init和mycrawl脚本:

mycrawl.py:from scrapy.commands import BaseRunSpiderCommand
from scrapy.exceptions import UsageErrorclass Command(BaseRunSpiderCommand):requires_project = Truedef syntax(self):return "[options] <spider>"def short_desc(self):return "Run a spider"def run(self, args, opts):# 获取爬虫列表spd_loader_list = self.crawler_process.spider_loader.list()# 遍历各爬虫for spname in spd_loader_list or args:self.crawler_process.crawl(spname, **opts.spargs)print("此时启动的爬虫:" + spname)self.crawler_process.start()# def run(self, args, opts):#     if len(args) < 1:#         raise UsageError()#     elif len(args) > 1:#         raise UsageError("running 'scrapy crawl' with more than one spider is no longer supported")#     spname = args[0]##     crawl_defer = self.crawler_process.crawl(spname, **opts.spargs)##     if getattr(crawl_defer, 'result', None) is not None and issubclass(crawl_defer.result.type, Exception):#         self.exitcode = 1#     else:#         self.crawler_process.start()##         if (#             self.crawler_process.bootstrap_failed#             or hasattr(self.crawler_process, 'has_exception') and self.crawler_process.has_exception#         ):#             self.exitcode = 1

settings里加:COMMANDS_MODULE = ‘ScrapyProjects.mycmd’
所有的都OK啦:
最后运行scrapy mycrawl

问题记录

settings —>ITEM_PIPELINES = {
‘ScrapyProjects.pipelines.LianJiaPipeline’: 200,
‘ScrapyProjects.pipelines.BookPipeline’: 300,
}

会出现两个项目pipelines区分不开的问题

解决方法

在各自的spider中,再次声明一下就可以了:
custom_settings = {
‘ITEM_PIPELINES’: {‘Lianjia.pipelines.LianjiaPipeline’: 300},
}

致上: 该方法绝对真实有效,所有没有成功的,我们可以交流。。。

利用scrapy工具,实现一键获取多个项目数据的功能相关推荐

  1. 使用采集工具,轻松获取目标受众的数据,让您的市场营销更加精准

    [数据采集神器]使用采集工具,轻松获取目标受众的数据,让您的市场营销更加精准! 在当前这个信息化社会中,数据已经成为了企业发展和市场营销的必要手段.企业需要通过数据来了解市场的需求,了解自己产品的竞争 ...

  2. 利用脚手架工具搭建一个新的react项目

    利用脚手架工具搭建一个新的react项目 一,工程架构 1.使用的是create-react-app脚手架工具搭建的工程架构 npm install create-react-app -g全局安装 c ...

  3. python爬取路况信息查询_如何一键获取高德交通态势数据

    发送原创文章至admin@caup.net,可申请注册邀请码 您需要 登录 才可以下载或查看,没有帐号?注册方式 x W56N8WNYzvv0Yeow.jpg (86.04 KB, 下载次数: 25) ...

  4. 利用scrapy框架爬取动态加载的数据

    在爬取有些网站的是后,数据不一定全部是可视化界面的,当我们拖动滚动条时才会加载其他的数据,如果我们也想爬取这部分数据,就需要使用selenium模块,在scrapy里可以结合该模块修改返回对象 一.编 ...

  5. 利用PRM-DUL工具恢复oracle dbf文件中的数据

    在使用oracle过程中如果一直没有有效的逻辑或物理RMAN备份则可能出现数据库损坏或丢失文件而没有任何备份可用的情况,例如丢失了CONTROL.CTL控制文件和SPFILE/PFILE参数文件的同时 ...

  6. 利用单片机实现天气服务器获取指定位置天气数据

    大家好,今天主要和大家聊一聊,如何利用单片机从心知天气服务器上获取到指定位置的天气数据,咱们先来了解一下心知天气吧!​ 目录 第一:天气数据API 第二.通信原理图以及数据解析 第三.天气数据返回结果 ...

  7. 【黑科技】爬虫也可以一键获取 [加载更多] 数据,无编码学爬虫之三。

    今天是持续写作的第 18 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇博客将带你解决网页加载更多按钮点击的问题,学习之后,你只需点点鼠标,数据就可以快速存储到本地. 此类教 ...

  8. 利用AUL工具恢复oracle dbf文件中的数据

    本文参考:http://liumanghao.blog.163.com/blog/static/85408220077243382811/,在原文基础作部分改动. 问题:最近重做系统,忘记备份orac ...

  9. 利用Peakscanner软件对测序仪获取的分子标记数据进行初步识别

    题目有点绕口,意思到了就行.由于课题研究需要,需要用SSR.AFLP等分子标记对生物群体进行群体遗传学研究,荧光标记引物后利用测序仪(我的数据来自ABI3730xl DNA Analyzer)进行毛细 ...

  10. 可转债数据一览表集思录_EXCEL一键获取可转债所有实时数据

    在本文的底部,各位读者可以获取对应的EXCEL模板. 偶尔使用集思录数据做可转债投资,但一些关键数据需要注册会员才可以使用,而且分析时经常需要导入到EXCEL中计算更多的个性指标. 因此,我用EXCE ...

最新文章

  1. 含有计算机专业词的告别文案,那些超级适合告别的文案,充满了对过往的怀念和遗憾...
  2. CSS盒子模型之CSS3可伸缩框属性(Flexible Box)
  3. BufferedReader 和BufferedWriter
  4. 如何基于netty实现mq 编程思路
  5. java读取excel数据保存到数据库中_java读取excel的内容(可保存到数据库中)
  6. Angular应用里的@Input和@Output注解使用方法介绍
  7. 三菱q系列plc连接电脑步骤_三菱Q系列PLC与三菱变频器的CC-link通讯技术(我的学习笔记)...
  8. 【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器
  9. 440. 字典序的第K小数字
  10. 写给程序员的裁员防身指南
  11. Centos为什么比不过Ubuntu和Debian?
  12. Exchange 2010 OWA 无法使用关键字搜索
  13. 基于逻辑回归的标准评分卡实现
  14. java计数器生成流水号_CODESOFT打印流水号
  15. 手心输入法 -无广告不骚扰
  16. excel 多行 取消隐藏_取消隐藏Excel行和列的问题
  17. python人名独特性统计_荐第六章:组合数据类型练习[人名独特性统计]学习思考...
  18. 2017.3.5阿凡python简单爬虫尝试,奉献源码
  19. 2023-2028年中国燕麦奶行业市场预测与投资规划分析报告
  20. Java 多线程的应用场景

热门文章

  1. matlab如何算排列组合数,MATLAB 排列组合问题
  2. kali 切换图形界面_kali切换桌面环境
  3. 计算机无法访问网络位置,共享不能访问网络位置的解决方法
  4. matlab求一个矩阵的逆矩阵的命令,如何用MATLAB求逆矩阵
  5. SecureCRT免费版下载
  6. python numpy 函数_Python 入门教程:关于 numpy 窗函数 Blackman
  7. mp3转换html5,五个免费在线mp3音频音乐编辑转换网站,实用的音频编辑软件
  8. 英语流利说 第39天
  9. 转:“有活吗?我们什么都干!”稻盛和夫这样带企业穿越萧条
  10. 什么是NIC(网络接口卡)?