爬去当当书籍信息

多台机器同时爬取,共用一个redis记录 scrapy_redis

带爬取的request对象储存在redis中,每台机器读取request对象并删除记录,经行爬取。实现分布式爬虫

import scrapy
from scrapy_redis.spiders import RedisSpider
from copy import deepcopy class DangdangSpider(RedisSpider):
name = 'dangdang'
allowed_domains = ['dangdang.com']
# 开始爬虫,会从redis的key中读取start_url.
redis_key = "dangdang" # lpush dangdang 'http://book.dangdang.com/' def parse(self, response):
# 大分类
div_list = response.xpath("//div[@class='con flq_body']/div")[:-4]
print(len(div_list), 'duoshao')
for div in div_list:
item = {}
item['b_cate'] = div.xpath("./dl/dt//text()").extract()
item['b_cate'] = [i.strip() for i in item['b_cate'] if len(i.strip())>0] # 过滤掉空字符
print('b_cate:', item['b_cate'])
# 中间分类
if item['b_cate'] == ['创意文具']:
print(item['b_cate'], "pass......")
item['m_cate'] = None
item['s_cate_url'] = div.xpath("./dl/dt/a/@ddt-src").extract_first()
print('s_cate_url:', item['m_cate'])
# yield scrapy.Request(
# item['s_cate_url'],
# callback=self.parse_special,
# meta={'item': deepcopy(item)}
# )
else:
dl_list = div.xpath(".//dl[@class='inner_dl']")
for dl in dl_list:
item['m_cate'] = dl.xpath("./dt//text()").extract()
item['m_cate'] = [i.strip() for i in item['m_cate'] if len(i.strip())>0]
# 小分类
dd_list = dl.xpath("./dd")
for dd in dd_list:
item['s_cate'] = dd.xpath("./a/@title").extract_first()
item['s_cate_url'] = dd.xpath("./a/@ddt-src").extract_first()
# 小分类的所有书籍
if item['s_cate_url'] is not None:
yield scrapy.Request(
item['s_cate_url'],
callback=self.parse_books,
meta={'item': deepcopy(item)}
) def parse_special(self, response):
''' 文具信息 '''
pass def parse_books(self, response):
item = response.meta['item']
# 当前小分类的书籍
li_list = response.xpath("//ul[@class='list_aa ']/li")
if li_list is not None:
for li in li_list:
try:
item['book_price'] = li.xpath(".//span[@class='num']/text()").extract_first() + \
li.xpath(".//span[@class='tail']/text()").extract_first()
except:
item['book_price'] = 'Unknown'
item['book_url'] = li.xpath("./a/@href").extract_first()
if item['book_url'] is not None:
yield scrapy.Request(
item['book_url'],
callback=self.parse_book_detail,
meta={'item': deepcopy(item)}
) def parse_book_detail(self, response):
item = response.meta['item']
item['book_name'] = response.xpath("//div[@class='name_info']/h1/img/text()").extract_first()
item['book_desc'] = response.xpath("//span[@class='head_title_name']/text()").extract_first()
# 这一本书籍的详细信息
span_list = response.xpath("//div[@class='messbox_info']/span")
item['book_author'] = span_list.xpath("./span[1]/a/text()").extract() # 可能多个作者
item['publisher'] = span_list.xpath("./span[2]/a/text()").extract_first()
item['pub_date'] = span_list.xpath("./span[3]/text()").extract_first()
print(item)
# yield item

scrapy 分布式爬虫- RedisSpider的更多相关文章

  1. 第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

    第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点 1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题

  2. scrapy分布式爬虫scrapy_redis二篇

    =============================================================== Scrapy-Redis分布式爬虫框架 ================ ...

  3. scrapy分布式爬虫scrapy_redis一篇

    分布式爬虫原理 首先我们来看一下scrapy的单机架构:     可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页 ...

  4. Scrapy分布式爬虫,分布式队列和布隆过滤器,一分钟搞定?

    使用Scrapy开发一个分布式爬虫?你知道最快的方法是什么吗?一分钟真的能 开发好或者修改出 一个分布式爬虫吗? 话不多说,先让我们看看怎么实践,再详细聊聊细节~ 快速上手 Step 0: 首先安装 ...

  5. 三十五 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

    1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题

  6. Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章

    二.伯乐在线爬取所有文章 1. 初始化文件目录 基础环境 python 3.6.5 JetBrains PyCharm 2018.1 mysql+navicat 为了便于日后的部署:我们开发使用了虚拟 ...

  7. Centos7__Scrapy + Scrapy_redis 用Docker 实现分布式爬虫

    原理:其实就是用到redis的优点及特性,好处自己查--- 1,scrapy 分布式爬虫配置: settings.py BOT_NAME = 'first' SPIDER_MODULES = ['fi ...

  8. Scrapy框架之基于RedisSpider实现的分布式爬虫

    需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬 ...

  9. 爬虫--Scrapy-基于RedisSpider实现的分布式爬虫

    爬取网易新闻 需求:爬取的是基于文字的新闻数据(国内,国际,军事,航空) 先编写基于scrapycrawl 先创建工程 scrapy startproject 58Pro cd 58Pro 新建一个爬 ...

随机推荐

  1. NIO堆外内存与零拷贝

    重点: 1.0拷贝需要系统支持. 普通内存模型: java线程内存 --> 操作系统内存 --> 硬盘 直接内存模型: java --> 操作系统内存 --> 硬盘 两者对比, ...

  2. Make Square CodeForces - 1028H (dp)

    大意: 若一个序列存在两个数的积为完全平方数, 则为好序列. 给定序列$a$, 每次询问求子区间$[l,r]$最少修改多少次可以成为好序列, 每次修改可以任选素数$p$, 任选一个数乘或除$p$. $ ...

  3. 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )

    原文:在论坛中出现的比较难的sql问题:33(递归 连续日期问题 ) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...

  4. Asp.Net Mvc Area二级域名

    参考:https://blog.maartenballiauw.be/post/2009/05/20/aspnet-mvc-domain-routing.html 参考:https://www.cnb ...

  5. 快开宝PDA开单器出入库扫码:让批发零售变得更简单

    快开宝PDA开单器出现前 批发商户是这样开单和管理的 ★员工痛苦:需要记客户.价格.库存等等,应对报错价.错漏单.盘错货等各种状况. ★老板麻烦:每天要守店.对单.核账,经常因错漏单.库存乱.积压货. ...

  6. log4net SmtpAppender 踩坑总结

    错误集合: System.Net.Mail.SmtpException: 命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first ! System.Net.Ma ...

  7. Python Web 程序使用 uWSGI 部署

    Python Web 程序使用 uWSGI 部署 WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway ...

  8. iOS开发微信支付的介绍与实现

    1.前期准备 1) 到微信开放平台注册账号 需要登录邮箱验证 填写您的商户信息 2) 进入管理中心 --- 移动应用 --- 创建移动应用 --- 根据页面完善应用资料 3) 审核过后,通过应用详情页 ...

  9. CentOS7安装CDH 第十三章:CDH资源池配置

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  10. TLS1.3对CIP的影响(对密码套件的解释)

    1.术语定义的即使(算法)Definition of terms (optional) Cipher Suite  :通信数据保护规范,对TLS指定对端身份验证,关键技术机制,后续数据加密和数据验证机 ...