最新Python爬虫学习之Scrapy-Redis实战京东图书_scrapy 京东推荐书籍,2024年最新字节跳动春招面试几轮

(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

scrapy-redis流程图

redis的使用

参考前文写的redis交互使用:Python | Python学习之Redis交互详解

scrapy-redis example-project

scrapy-redis的源码中提供了scrapy-redis的示例项目,我们下载下来学习一下。

https://github.com/rmax/scrapy-redis/tree/master/example-project

example-project中有三个demo,分别是dmoz,myspider_redis,以及mycrawler_redis

本次主要是对dmoz这个demo进行学习和实战练习。

dmoz spider文件解析

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class DmozSpider(CrawlSpider):
    """Follow categories and extract links."""
    name = 'dmoz'
    allowed_domains = ['dmoztools.net']
    start_urls = ['http://dmoztools.net/']

    rules = [
        Rule(LinkExtractor(
            restrict_css=('.top-cat', '.sub-cat', '.cat-item')
        ), callback='parse_directory', follow=True),
    ]

    def parse_directory(self, response):
        for div in response.css('.title-and-desc'):
            yield {
                'name': div.css('.site-title::text').extract_first(),
                'description': div.css('.site-descr::text').extract_first().strip(),
                'link': div.css('a::attr(href)').extract_first(),
            }

可以看到,dmoz项目和我们平时创建的scrapy项目并没有太大的区别,之所以能够实现持久化爬虫主要的不同之处在setting中设置了去重类和scheduler队列。

dmoz setting文件解析

上面提到的setting中设置了去重类和scheduler队列的操作主要就是在setting文件中添加下面这些代码。

# 去重类--指定哪个去重方法给request对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 队列--指定scheduler队列,调度器内存的是待爬取链接和已爬取对象指纹。
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 队列内容是否持久化保存--为False的时候,关闭redis的时候清空redis
SCHEDULER_PERSIST = True
REDIS_URL="redis://127.0.0.1:6379"

dmoz redis 数据库存取项

我们运行一下这个示例项目,并打开redis数据库,查看爬取到的结果。redis数据库中出现以下三个键,分别是:

dmoz request: 待爬取项

(先把爬取对象序列化存入数据库,再反序列化成爬取对,Scheduler队列,存放的待请求的request对象,获取的过程是pop操作,即获取一个会去除一个)

dmoz items:爬取的内容

(通过scrapy_redis.pipelines.RedisPipeline保存,屏蔽之后可以实现自定义对象存取位置,存放的获取到的item信息,在pipeline中开启RedisPipeline才会存入)

dmoz dumpfilter:抓到过的request对象指纹

(指纹集合,存放的是已经进入scheduler队列的request对象的指纹,指纹默认由请求方法,url和请求体组成)

dumpfilter的数量减去request的数量是已经抓爬取过的数量

关闭redispipeline之后,redis数据库中数据量变化:

  • dmoz:requests 有变化(变多或者变少或者不变)
  • dmoz:dupefilter 变多
  • dmoz:items 不变

redispipeline中仅仅实现了item数据存储到redis的过程,我们可以新建一个pipeline(或者修改默认的ExamplePipeline),让数据存储到任意地方,但是权重应该小于redis存储的pipline。

scrapy-redis 源码详解

scrapy redis 如何生成指纹的?

import hashlib
f = hashlib.hsa1()
f.update(url.encode())
f.hexdigest()

scrapy-redis 判断request对象是否入队

def enqueue_request(self, request):
    if not request.dont_filter and self.df.request_seen(request):
      # dont_filter=False Ture  True request指纹已经存在  #不会入队
      # dont_filter=False Ture  False  request指纹已经存在 全新的url  #会入队
      # dont_filter=Ture False  #会入队
        self.df.log(request, self.spider)
        return False
    if self.stats:
        self.stats.inc_value('scheduler/enqueued/redis', spider=self.spider)
    self.queue.push(request)
    return True

  • dont_filter = True ,构造请求的时候,把dont_filter置为True,该url会被反复抓取(url地址对应的内容会更新的情况)
  • 一个全新的url地址被抓到的时候,构造request请求
  • url地址在start_urls中的时候,会入队,不管之前是否请求过
  • 构造start_url地址的请求时候,dont_filter = True

scrapy-redis如何去重

fp = hashlib.sha1()
fp.update(to_bytes(request.method)) #请求方法
fp.update(to_bytes(canonicalize_url(request.url)))  #请求链接
fp.update(request.body or b'')  # 请求体
return fp.hexdigest()

  • 使用sha1加密request得到指纹
  • 把指纹存在redis的集合中
  • 下一次新来一个request,同样的方式生成指纹,判断指纹是否存在reids的集合中

判断数据是否存在redis的集合中,不存在插入

added = self.server.sadd(self.key, fp)
return added != 0

scrapy-redis实战京东图书

爬取结果截图

页面分析

分析分类聚合页

打开待爬取页面:

https://book.jd.com/booksort.html

如下图:

分析分类聚合页

查看页面源代码,发现待爬取的内容存在其中,所以我们可以通过分析源码写出提取相应字段的xpath。

    def parse(self, response):
        dl_list = response.xpath("//div[@class='mc']/dl/dt")
        for dl in dl_list:
            item = JdbookspiderItem()
            item['book_sort'] = dl.xpath("./a/text()").extract_first()
            em_list = dl.xpath("./following-sibling::dd/em")
            for em in em_list:
                item['book_cate'] = em.xpath("./a/text()").extract_first()
                item['book_cate_url'] = em.xpath("./a/@href").extract_first()
                if item['book_cate_url'] is not None:
                    item['book_cate_url'] = 'https:' + item['book_cate_url']
                yield scrapy.Request(
                    item['book_cate_url'],
                    callback=self.parse_cate_url,
                    meta={"item": deepcopy(item)}
                )


### 最后

> **🍅 硬核资料**:关注即可领取PPT模板、简历模板、行业经典书籍PDF。  
> **🍅 技术互助**:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。  
> **🍅 面试题库**:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。  
> **🍅 知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值