Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >scrapy分布式浅谈+京东示例

scrapy分布式浅谈+京东示例

作者头像
xbhog
发布于 2020-12-10 02:46:14
发布于 2020-12-10 02:46:14
63900
代码可运行
举报
文章被收录于专栏:开发技能乱炖开发技能乱炖
运行总次数:0
代码可运行

scrapy分布式浅谈+京东示例:

学习目标:

  1. 分布式概念与使用场景
  2. 浅谈去重
  3. 浅谈断点续爬
  4. 分布式爬虫编写流程
  5. 基于scrapy_redis的分布式爬虫(阳关院务与京东图书案例)

环境准备:

  1. 下载redis-cli(客户端)以及redis-server(服务端)
  2. 安装Another Redis Desktop Manager可视化工具
  3. 链接:https://pan.baidu.com/s/1rl8IUY7Lq54aePT54LnAkQ 提取码:1234
  4. scrapy-redis源码:git clone https://github.com/rolando/scrapy-redis.git

分布式概念与使用场景:

  1. 分布式听起来很高大上,但是它只是提高爬虫功能与运行效率的一个环节,
  2. 当你的数据是海量的时候,或者老板叫你在短时间内获得大量的数据,这时候才是分布式出场的时候,然而当你使用分布式的时候,难点不在于怎么部署以及编写代码;
  3. 爬虫的速度越快,所造成对方的服务器负担越重,这时候反爬才是你所真正考虑以及应对的。
  4. 概念:需要搭建一个分布式机群,然后再机群的每一台电脑中执行同一组程序,让对某一个网站的数据进行联合分布爬取

浅谈去重:

  1. 好处:能够减少服务器的压力以及保证数据的准确性;
  2. 每核心次请求的时候,先判断这个请求是否在已经爬取的队列当中,存在舍去,不存在爬取;
  3. 采用scrapy-redis中的set集合做的去重(可做持久化存储)。

浅谈断点续爬:

  1. 如果运行爬虫down掉了,在下一次启动的时候可以接入上次end的位置继续。
  2. 断点续爬就是将数据队列 集合以及任务队列实现本地持久化存储

分布式爬虫编写流程:

阳光院务平台scrapy-redis-Crawlspider:

编写Spider:基本代码很好理解就没写注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scrapy
from sunsite.items import SunsiteItem

class SunproSpider(scrapy.Spider):
    name = 'sunpro'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['http://wz.sun0769.com/political/index/politicsNewest?id=1&page=1']

    def parse(self, response):
        li_list = response.xpath("/html/body/div[2]/div[3]/ul[2]//li")
        for li in li_list:
            item = SunsiteItem()
            item['title'] = li.xpath("./span[3]/a/text()").extract_first()
            status= li.xpath("./span[2]/text()").extract_first().split('\n                        ')[1]

            item['status'] = status.split("\n                    ")[0]
            # print(item)
            yield item

编写CrawlSpider:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunsite.items import SunsiteItem
from scrapy_redis.spiders import RedisCrawlSpider

class SunprocrawlSpider(RedisCrawlSpider):
    name = 'Sunprocrawl'
    # allowed_domains = ['www.xxx.com']
    # start_urls = ['http://wz.sun0769.com/political/index/politicsNewest?id=1&page=1']
    redis_key = 'sunurl'
    rules = (
        Rule(LinkExtractor(allow=r'id=1&page=\d+'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        li_list = response.xpath("/html/body/div[2]/div[3]/ul[2]//li")
        for li in li_list:
            item = SunsiteItem()
            item['title'] = li.xpath("./span[3]/a/text()").extract_first()
            status = li.xpath("./span[2]/text()").extract_first().split('\n                        ')[1]

            item['status'] = status.split("\n                    ")[0]
            # print(item)
            yield item

item编写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scrapy


class SunsiteItem(scrapy.Item):
    title = scrapy.Field()
    status = scrapy.Field()

京东图书scrapy-redis:

JDSpider:(基础代码在Github中)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
#该spider在基础spider上进行分布式修改
import scrapy
from JDspider.items import JdspiderItem
import json
#-----1导入分布式爬虫类
from scrapy_redis.spiders import RedisSpider

class JdproSpider(RedisSpider): #----2继承RedisSpider类方法
    name = 'JDpro'
    # start_urls = ['https://book.jd.com/booksort.html']
    # ----4 设置redis-key
    redis_key = 'tranurl'

    # ----5 设置__init__
    def __init__(self, *args, **kwargs):
        domain = kwargs.pop('domain', '')
        self.allowed_domains = list(filter(None, domain.split(',')))
        super(JdproSpider, self).__init__(*args, **kwargs)

    def parse(self, response):
        #获取图书大分类中的列表
        big_node_list = response.xpath("//div[@class='mc']//dt/a")

        # 【:1】切片,先获取一类数据测试
        # for big_node in big_node_list[:1]:
        for big_node in big_node_list:
            #大分类的名称
            big_category = big_node.xpath("./text()").extract_first()
            #大分类的URL
            big_category_link = response.urljoin(big_node.xpath("./@href").extract_first())
            # print(big_category, big_category_link)
            # 获取所有图书小分类节点列表
            #注意点---获取兄弟节点的xpath语法结构;小分类的整体节点
            small_node_list = big_node.xpath("../following-sibling::dd[1]/em/a")
            #【:1】切片,先获取一类数据测试
            for small_node in small_node_list[:1]:
                temp = {}
                temp['big_category'] = big_category
                temp['big_category_link'] = big_category_link
                #获取小分类的名称
                temp['small_category'] = small_node.xpath("./text()").extract_first()
                #获取小分类的URL
                temp['small_category_link'] = response.urljoin(small_node.xpath("./@href").extract_first())
                # print(temp)
                #注意点,筛选出来的数据持续传输,meta的使用
                yield scrapy.Request(
                    url=temp['small_category_link'],
                    callback= self.parse_book_link,
                    #上面保存的item传递给下一个解析函数
                    meta = {'data':temp}
                )

    #解析详情
    def parse_book_link(self,response):
        temp = response.meta['data']

        #获取到Book的标签
        book_list = response.xpath("//*[@id='J_goodsList']/ul/li/div")
        # print(len(book_list))
        #遍历标签页
        for book in book_list:
            item = JdspiderItem()

            item['big_category'] = temp['big_category']
            item['big_category_link'] = temp['big_category_link']
            item['small_category'] = temp['small_category']
            item['small_category_link'] = temp['small_category_link']
            #书的名字
            item['bookname'] = book.xpath('./div[3]/a/em/text()|./div/div[2]/div[2]/div[3]/a/em/text()').extract_first()
            #书的作者
            item['author'] = book.xpath('./div[4]/span[1]/a/text()|./div/div[2]/div[2]/div[4]/span[1]/span[1]/a/text()').extract_first()
            #书的URL
            item['link'] = response.urljoin(book.xpath('./div[1]/a/@href|./div/div[2]/div[2]/div[1]/a/@href').extract_first())
            # print(item)
            # 获取图书编号,目的拼接图书的Price
            skuid = book.xpath('.//@data-sku').extract_first()
            # skuid = book.xpath('./@data-sku').extract_first()
            # print("skuid:",skuid)
            # 拼接图书价格地址
            pri_url = 'https://p.3.cn/prices/mgets?skuIds=J_' + skuid
            # print(pri_url)

            yield scrapy.Request(url=pri_url, callback=self.parse_price, meta={'meta_1': item})
            #拿到一条数据测试,可以开启
            # break
    def parse_price(self,response):
        #拿到传递过来的item
        item = response.meta['meta_1']
        #解析json页面
        dict_data = json.loads(response.body)
        #解析价钱,传递到item中
        item['price'] = dict_data[0]['p']
        # print(item)
        yield item

程序运行方式:

  1. 打开redis-server.exe
  2. 打开redis-cli.exe
  3. 找到爬虫文件下的spider
  4. scrapy runspider spiderName
  5. 在redis-cli中输入:lpush redis-keyName(spider中定义的redis-key名字) URL(网页的链接)

实现效果:

完整项目代码:

Github:https://github.com/xbhog/scrapyRedis

致谢:如果对您有帮助,希望随手一个star,感谢!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scrapy_Study02
当当网的爬取也是比较容易, 但是这里需要结合scrapy-redis来实现分布式爬取数据
Echo_Wish
2023/11/30
1960
Scrapy_Study02
爬虫 | Python学习之Scrapy-Redis实战京东图书
scrapy-Redis就是结合了分布式数据库redis,重写了scrapy一些比较关键的代码,将scrapy变成一个可以在多个主机上同时运行的分布式爬虫。
猴哥yuri
2019/07/30
4130
Python爬虫之分布式爬虫
搭建分布式机群,让其对一组资源进行分布式联合爬取 提升爬取效率 实现分布式: pip install scrapy-redis scrapy-redis 组件的作用: 给原生的scrapy框架提供可以被共享的管道和调度器 ---- 分布式爬虫 实现步骤: scrapy startproject firstdemo scrapy genspider -t crawl xxx [www.xxx.com](http://www.xxx.com/) 修改当前爬虫文件 导包 : from scrapy_r
shaoshaossm
2022/12/26
4871
Python之scrapy框架
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
鱼找水需要时间
2023/02/16
5210
Python之scrapy框架
scrapy框架
scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider qiubai www.qiushibaike.com)
全栈程序员站长
2022/09/07
1.7K0
scrapy框架
Python爬虫之scrapy框架学习
scrapy安装步骤 pip install wheel 下载twisted : 地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted (选择对应的版本) 安装twisted : pip install aiohttp-3.8.1-cp38-cp38-win_amd64.whl pip install pywin32 pip install scrapy 测试终端输入: scrapy 创建工程 终端输入: scrapy startproject fi
shaoshaossm
2022/12/26
7210
使用scrapy爬取suning
# -*- coding: utf-8 -*- import scrapy from copy import deepcopy class SuSpider(scrapy.Spider):
py3study
2020/01/16
5030
scrapy翻页请求
输入 scrapy crawl movie 后能获取以上信息,证明我们能正常获取数据就没问题了。
花落花相惜
2021/11/26
6.7K0
Scrapy持久化存储
  保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作;
py3study
2020/01/21
7670
Python爬虫之scrapy的入门使用
命令:     sudo apt-get install scrapy 或者:     pip/pip3 install scrapy
海仔
2020/09/28
9880
Python爬虫之scrapy的入门使用
scrapy 爬虫框架学习-1
接着创建项目 scrapy startproject test 爬虫名字 项目创建好了之后创建爬虫app scrapy genspider appname 666cc.cn 第一个是app名字,第二个是需要爬的域名,后面可以更改 *** 接着来写一个爬取小例子 *** class TestSpider(scrapy.Spider): name = ‘test’ allowed_domains = [‘itcast.cn’] start_urls = [‘http://www.itcast.cn/channel/teacher.shtml’]
kirin
2020/05/09
5000
scrapy分布式爬虫scrapy_redis一篇
可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页面的爬取。
周小董
2019/03/25
1.5K0
scrapy分布式爬虫scrapy_redis一篇
python爬虫–scrapy(再探)
— 图片:xpath解析出图片src的属性值。单独的对图片地址发起请求获取图片二进制类型的数据。
全栈程序员站长
2021/04/21
6660
python爬虫–scrapy(再探)
Scrapy从入门到放弃1--开发流程
允许爬取的域名: 为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域不通则被过滤掉。
北山啦
2022/11/27
8970
Scrapy从入门到放弃1--开发流程
Scrapy_Study01
对于以上四步而言,也就是各个组件,它们之间没有直接的联系,全部都由scrapy引擎来连接传递数据。引擎由scrapy框架已经实现,而需要手动实现一般是spider爬虫和pipeline管道,对于复杂的爬虫项目可以手写downloader和spider 的中间件来满足更复杂的业务需求。
Echo_Wish
2023/11/30
3040
Scrapy_Study01
Python爬虫-小测验
(1)读取给定的dangdang.html页面内容,注:编码为gbk(5分) (2)获取页面中所有图书的名称,价格,作者,出版社及图书图片的url地址(20分) (3)将获取的信息保存至文件(excel、csv、json、txt格式均可)(5分) 网页文件dangdang.html文件下载链接: https://pan.baidu.com/s/1awbG5zqOMdnWzXee7TZm6A 密码: 3urs
潇洒坤
2018/09/10
6050
Python爬虫-小测验
爬虫项目#4567电影网scrapy数据爬取moviePro/持久化储存handReqPro
仅用与备忘录 ____movie.py import scrapy from moviePro.items import MovieproItem
全栈程序员站长
2022/09/17
5070
python scrapy爬虫练习(1) 爬取豆瓣电影top250信息
文章目录 一、分析网页 目标URL:https://movie.douban.com/top250?start=0&filter= 每一页有25条电影信息,总共10页。检查网页可以发现,每条电影的详细
叶庭云
2020/09/17
5.1K0
python  scrapy爬虫练习(1)   爬取豆瓣电影top250信息
爬虫学习
安装Anaconda(集成环境), 安装成功后能够提供一种基于浏览器的可视化工具 ---Jupyter.
py3study
2020/01/17
2K0
scrapy全站爬取
需求:爬取站长素材的高清图片的爬取https://sc.chinaz.com/tupian/
用户8447427
2022/08/18
8060
scrapy全站爬取
相关推荐
Scrapy_Study02
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验