Scrapy框架--增量式爬虫

Posted sxy-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy框架--增量式爬虫相关的知识,希望对你有一定的参考价值。

增量式爬虫
- 概念:监测网站数据更新的情况,只会爬取网站最新更新出来的数据。
- 分析:
  - 指定一个起始url
  - 基于CrawlSpider获取其他页码链接
  - 基于Rule将其他页码链接进行请求
  - 从每一个页码对应的页面源码中解析出每一个电影详情页的URL

  - 核心:检测电影详情页的url之前有没有请求过,这里的示例使用了redis集合的去重特性,也可以使用python集合的去重特性。
  - 将爬取过的电影详情页的url存储
  - 存储到redis的set数据结构

  - 对详情页的url发起请求,然后解析出电影的名称和简介
  - 进行持久化存储

 

示例:爬取电影的名称和简介,只爬取之前没有爬取过的电影。

爬虫文件

 

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from moviePro.items import MovieproItem

class MovieSpider(CrawlSpider):
    name = movie
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [https://www.4567kan.com/frim/index1.html]

    rules = (
        Rule(LinkExtractor(allow=rindex1-d+.html), callback=parse_item, follow=False),
    )

    conn = Redis(host=127.0.0.1,port=6379)
    def parse_item(self, response):
        li_list = response.xpath(/html/body/div[1]/div/div/div/div[2]/ul/li)
        for li in li_list:
            title = li.xpath(./div/div/h4/a/text()).extract_first()
            detail_url = https://www.4567kan.com/+li.xpath(./div/div/h4/a/@href).extract_first()
            ex = self.conn.sadd(urls, detail_url)
            # 利用redis的集合类型 如果存在 返回0  不存在 返回1
            if ex == 1:
                print("爬取成功")
                yield scrapy.Request(url=detail_url,callback=self.parse_detail)
            else:
                print(暂无新资源)

    def parse_detail(self,response):
        item = MovieproItem()
        desc = response.xpath(/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()).extract_first()
        title = response.xpath(/html/body/div[1]/div/div/div/div[2]/h1/text()).extract_first()
        item[desc] = desc
        item[title] = title
        yield item

    def closed(self,response):
        self.conn.close()

 

items.py

import scrapy


class MovieproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    desc = scrapy.Field()

pipelines.py

import json

class MovieproPipeline:
    def open_spider(self,spider):
        self.conn = spider.conn

    def process_item(self, item, spider):
        dic = {
            title:item[title],
            desc: item[desc]
        }
        dic = json.dumps(dic)
        # 向redis中存放一个数据结构
        self.conn.lpush(movieDate,dic)
        return item

 

以上是关于Scrapy框架--增量式爬虫的主要内容,如果未能解决你的问题,请参考以下文章

scrapy主动退出爬虫的代码片段(python3)

python爬虫--scrapy框架的学习和使用⭐---第二部分

Python都有哪些常见的,好用的爬虫框架

scrapy增量式爬虫

爬虫07 /scrapy图片爬取中间件selenium在scrapy中的应用CrawlSpider分布式增量式

LogParser v0.8.0 发布:一个用于定期增量式解析 Scrapy 爬虫日志的 Python 库,配合 ScrapydWeb 使用可实现爬虫进度可视化