scrapy的增量爬虫(未完待续。。。)

Scrapy爬虫改为Scrapy-Redis增量式爬虫 如何把一个Scrapy项目改造成Scrapy-Redis增量式爬虫 前提: 安装Scrapy-Redis 1.原有的爬虫代码不用改动 2 在setting配置文件中添加如下配置 1. 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化 DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFP... 阅读详情
  • 增量爬虫
    1、增量爬虫(crawlspider)

    1)创建增量式爬虫:scrapy genspider -t crawl xxx xxx.xx

    2)增量式爬虫介绍:
    在scrapy中有许多的爬虫模板(例如:crawl,Feed等模板),这些模板可以对basic爬虫进行功能的扩充),这些模板经过扩充以后可以更好的实现一些复杂功能,crawlspider是最常用的一种爬虫模板
    3)增量式爬虫的运行机制:
    basic模板运行机制:从start_urls中提取起始url,把这些url放入调度队列进行调度。
    增量式模板运行机制:以start_urls中url为起点,从这些url的响应网页中根据一定的规则匹配出一批url,把匹配出的这批url放入到调度队列中;新产生网页中也会根据前面的规则来匹配新的url并且这些url如果没有和之前重复将其将入到调度队列中去,这样循环往复直至再也匹配不到新的url为止。

代码实现

spiders

#dushu
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
# 导入链接提取器类,从一个url的网页上根据一定的规则来提取新的链接

from scrapy.spiders import CrawlSpider, Rule
# CrawlSpider是spiders一个派生类,在基本爬虫的基础上扩展功能
# Rule规则对象,根据规则安排url的提取、组合与调度
from DushuPro.items import DushuproItem

class DushuSpider(CrawlSpider):
    name = 'dushu'
    allowed_domains = ['dushu.com']
    start_urls = ['https://www.dushu.com/book/1002.html']

    rules = (
        Rule(LinkExtractor(allow=r'/book/1002_\d\.html'), callback='parse_item', follow=True),
        # Rule(LinkExtractor(restrict_xpaths="//div[@class='pages']//a"), callback='parse_item', follow=True),
        # Rule(LinkExtractor(restrict_css=".pages a"), callback='parse_item', follow=True),
    )

    # rules属性:是一个元组,包含了若干个Rule对象
    # 每个Rule对象有三个参数,可以根据参数LinkExtractor对象里面的规则来匹配、提取并且组合、调度符合规则url;callback是回调函数(这个回调函数写法是写函数名的字符串)当对应的url请求完毕以后回调
    # LinkExtractor对象:链接提取器,用于根据一定的规则来提取链接,具体有如下三种:
    # 规则一:allow="xxx" 根据xxx这个正则表达式从网页源码上匹配新的链接
    # 规则二:restrict_xpaths="xxx" 根据xxx这个xpath路径来匹配链接
    # 规则三:restrict_css="xxx"  根据xxx这个css选择器来匹配
    # 【注意】在使用xpath或者css的时候,只需要匹配目标链接的那个a标签即可,不需要再xpath路径或者css选择器中写具体href属性

    def parse_item(self, response):
        booklist = response.xpath("//div[@class='bookslist']//li")
        for book in booklist:
            item = DushuproItem()
            item["title"] = book.xpath(".//h3/a/text()").extract_first()
            # extract_first()从selector列表将内容取出,然后从内容列表中取出首元素,如果列表为空,直接去None

            item["author"] = "".join(book.xpath(".//div[@class='book-info']/p[1]//text()").extract())
            # print(item)
            # 匹配出二级页面的链接
            next_url = "https://www.dushu.com" + book.xpath(".//h3/a/@href").extract_first()

            # 向二级页面发起请求
            yield scrapy.Request(url=next_url,callback=self.parse_Info,meta={"item":item})
    # 回调函数,用于解析下级页面
    def parse_Info(self, response):
        # 把上级页面送的item提取出来
        item = response.meta["item"]
        # 继续解析item
        item["price"] = response.xpath("//span[@class='num']/text()").extract_first()
        item["publisher"] = response.xpath("//div[@class='book-details-left']/table//tr[2]//a/text()").extract_first()
        item["authorInfo"] = response.xpath("//div[@class='text txtsummary']//text()").extract()[1]
        item["content"] = response.xpath("//div[@class='text txtsummary']//text()").extract()[0]
        item["mulu"] = "\n".join(response.xpath("//div[@class='text txtsummary']")[2].xpath(".//text()").extract())
        yield item

items

import scrapy

class DushuproItem(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    price = scrapy.Field()
    publisher = scrapy.Field()
    authorInfo = scrapy.Field()
    content = scrapy.Field()
    mulu = scrapy.Field()

中间件

下载中间件

1、下载中间件
下载中间件:主要工作在下载器向服务器发起请求的过程中,可以截获下载器的请求对请求作出相应的扩展与配置
下载中间件有两种:一种是系统自带的中间,位置在scrapy的核心引擎中,路径为:scrapy.dowloadermiddleweres.xxxx.xxxx;另外一种是自定义下载中间,它的位置就在我们的当前工程的middleweres中
下载中间件的开启:settings文件中
DOWNLOADER_MIDDLEWARES = {
‘DushuPro.middlewares.DushuproDownloaderMiddleware’: 543,
}
2、下载中间件的应用
1)植入selenium动态页面加载
在settings文件中将用于植入selenium的下载中间件激活同时为了节省系统开销,可把浏览器能够代替的那些组件的功能的中间件关闭掉
然后在selenium中间件类中重写响应方法来截获request,并且用selenium来代替其工作,最后把selenium中取出的解析以后的网页源码封装到响应数据对象中返回出去
spiders

import scrapy


class MoguSpider(scrapy.Spider):
    name = 'mogu'
    allowed_domains = ['mogu.com']
    start_urls = ['https://list.mogu.com/book/clothing/50240?acm=3.mce.1_10_1ko4s.132244.0.mtYuRrx6QL5ne.pos_1-m_482170-sd_119&ptp=31.nXjSr._head.0.UvbiJ3IU']

    def parse(self, response):
        goods_list = response.css(".iwf")
        print(len(goods_list))

        # 练习:解析内容
        pass

middlewares

from scrapy import signals
from selenium import webdriver
from time import sleep
from scrapy.http import HtmlResponse

class MogujieDownloaderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        print("当前创建出了一个爬虫对象!")
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):

        print("我是process_request方法,爬虫:%s的请求:%s正在经过当前下载中间件..."%(spider.name,request))
        # 由于系统的下载器不能解析js动态页面,我们在这里截获系统的请求对象,重新的定义其请求的过程,用selenium来操作
        driver = webdriver.Chrome()
        # 从截获的request中提取url
        url = request.url
        print("当前浏览器正在访问:",url)
        driver.get(url)
        sleep(1)
        # 下拉加载
        distance = 0
        for i in range(100):
            distance = i*500
            js = "document.documentElement.scrollTop=%d"%distance
            driver.execute_script(js)
            sleep(0.5)
        sleep(3)
        # 提取网页源码
        html = driver.page_source
        # 把网页源码封装到一个响应对象中返回出去
        res = HtmlResponse(url=driver.current_url,request=request,body=html,encoding='utf-8')
        return res

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.
        print("我是process_response方法,爬虫%s的请求%s的响应对象%s正在被返回..."%(spider.name,request,response))
        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.
        print("有异常出现")
        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        print("爬虫被打开!")
        spider.logger.info('Spider opened: %s' % spider.name)

settings

DOWNLOADER_MIDDLEWARES = {
   'Mogujie.middlewares.MogujieDownloaderMiddleware': 543,
   'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
}

2)植入代理池
代理服务器:在客户端与服务器之间发生请求与响应的过程中,如果设置了代理服务器,则我们的请求会直接发到代理服务器端,由代理服务器代替客户端向服务器发起请求,服务器的响应数据也会响应给代理服务器,然后由代理服务器在把响应数据传递回客户端
代理服务器的获取:1)自己搭建(不推荐) 2)抓取免费的代理服务器(不靠谱) 3)付钱买
【愚公系列】《Python网络爬虫从入门到精通》049-了解Scrapy爬虫框架 大家好,欢迎来到《Python网络爬虫从入门到精通》系列教程的第48篇文章。经过前面几十篇的学习,我们已经掌握了使用 requests、BeautifulSoup、Selenium 等工具进行数据抓取的基本方法。然而,随着项目的复杂度提升,这些工具在面对大型、高并发、高可维护性的爬虫任务时,往往力不从心。这时候,专业的爬虫框架——Scrapy,就该登场了。Scrapy 是一个由 Python 编写的、功能强大的异步爬虫框架,它具备高性能、模块化、易扩展等诸多优点,被广泛应用于各种数据采集任务中。 阅读详情

相关推荐

1.网络爬虫概述

一、爬虫是什么? 二、爬虫可以做什么? 三、爬虫开发中有哪些技术?

qq_40407729的博客 5391

scrapy实现增量式爬取

实现爬虫的增量式爬取有两种方法,一是在获得页面解析的内容后判断该内容是否已经被爬取过,二是在发送请求之前判断要被请求的url是否已经被爬取过,前一种方法可以感知每个页面的内容是否发生变化,能获取页面新增或者变化的内容,但是由于要对每个url发送请求,所以速度比较慢,而对网站服务器的压力也比较大,后一种无法获得页面变化的内容,但是因为不用对已经爬取过的url发送请求,所以对服务器压力比较小,速度比较快

qq_35488769的博客 1万+

python爬虫介绍及其应用

网络爬虫是什么 网络爬虫又称网络蜘蛛、网络机器人,它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。 认识爬虫 我们所熟悉的一系列搜索引擎都是大型的网络爬虫,比如百度、搜狗、360浏览器、谷歌搜索等等。每个搜索引擎都拥有自己的爬虫程序,比如 360 浏览器的爬虫称作 360Spider,搜狗的爬虫叫做 Sogouspider。 ...

m0_69043821的博客 2725

使用Scrapy实现网站数据的增量爬取

使用Scrapy实现网站数据的增量爬取

manfanying的博客 1123

浅谈电商网络爬虫技术

除此之外,搜索引擎更关注的是大而全,为大多数用户提供检索服务,所以有些冷门的没有被列入索引的网站就没办法被实时获取到,而网络爬虫则可以通过个人定制,爬取一些搜索引擎关照不到的地方,典型的案例便是深层网络爬虫以及在robots.txt中明确禁止搜索引擎爬取的网站,而理论上开发者编写的网络爬虫可以到达世界上的任何网站。如图1所示,完整的爬虫流程应当是编写的网络爬虫在发起请求之后,目标服务器返回指定的请求响应,通过对请求响应返回的响应体进行解析,找到需要的信息进行数据存储。

Jernnifer_mao的博客 1906

Python爬虫入门教程 78-100 用Scrapy+BloomFilter再写个增量爬虫

继续搞定增量爬虫,本文涉及两个Python模块,一个为Scrapy,另一个是BloomFilter

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

python爬虫Scrapy框架之增量式爬虫

一 增量式爬虫 什么时候使用增量式爬虫: 增量式爬虫:需求 当我们浏览一些网站会发现,某些网站定时的会在原有的基础上更新一些新的数据。如一些电影网站会实时更新最近热门的电影。那么,当我们在爬虫的过程中遇到这些情况时,我们是不是应该定期的更新程序以爬取到更新的新数据?那么,增量式爬虫就可以帮助我们来实现 二 增量式爬虫 概念 通过爬虫程序检测某网站数据更新的情况,这样就能爬取到该网站更新出来的数据 ...

weixin_30455067的博客 921

Python-scrapydjango增量抓取天涯莲蓬鬼话全部帖子

scrapy django增量抓取天涯莲蓬鬼话全部帖子,并简单展示,部署至centos

Python爬虫之scrapy高级(全站爬取,分布式,增量爬虫)

1 scrapy全站爬取 1.1 全站爬取简介 CrawlSpider:全站数据爬虫的方式,它是一个类,属于Spider的子类 如果不使用CrawlSpider,那么就相当于基于spider,手动发送请求,太不方便 基于CrawlSpider可以很方便地进行全站数据爬取 1.2 CrawlSpider 1.2.1 基本讲解 基本步骤: 创建一个工程:scrapy startproject ProjectName 切换到爬虫工程中后,创建爬虫文件:scrapy genspider -t crawl xxx

上善若泪 6298

python 爬虫 实现增量去重和定时爬取实例

今天小编就为大家分享一篇python 爬虫 实现增量去重和定时爬取实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。首先在对项目编译产生文件的属性设置为Release。 在编译完成后,找到每个CORE单独生成的DXE文件: 文件通常位于项目目录下每个core的Release文件中。安装SC589评估板的驱动(ADSP-SC5xx_EZ-KIT_Lite-Rel2.0.0.exe)后,在安装目录下可以找到SPI FLASH芯片的驱动程序(sc589_w25q128fv_dpia_Core1.dxe): 把文件copy到CCES 的目录下由于SC58x处理器的特殊性

daijingxin的博客 3730

爬虫框架Scrapy 之(六) --- scrapy增量爬虫

增量爬虫   在scrapy中有很多的爬虫模版,这些模版都是基于basic模版进行的功能扩展(例如:crawl模版、feed模版等)最常用的是crawl(即增量式爬虫)   basicspider的设计理念是:从start_urls里面取出起始的url,使用start_urls来驱动引擎工作   增量式爬虫:首先以start_urls中的url为起点,从这些url中不断的请求网页,...

baoding4359的博客 382

PS/2鼠标接口协议

一、PS/2鼠标接口        PS/2接口用于许多现代的鼠标和键盘,由IBM最初开发和使用。物理上的PS/2接口有两种类型的连接器:5脚的DIN和6脚的MINI-DIN。        二、鼠标的接口协议原理             PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。但是在相互传输中 ,主机是拥有总线控制权的

Ant's home 1万+

网络爬虫是什么

。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。

api_Anzexi的博客 1万+

STM32N6570-DK ISP调试

将下载线接入STLINK V3EC接口,将BOOT1拨码拨至右边,即将其置为H,上电或已经上电的按复位,打开STM32CubeProgrammer,设置start address:0x70000000。板子消耗电流较大,即使缩短数据线接了USB供电依然不能正常点亮显示屏,最终通过板上CN2端子加了外部5V供电,仍然需要560mA的外部电流。3.烧录bin文件:STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。

liu的博客 1065

机器学习第五章之决策树模型

机器学习专题系列

wangyutao12345的博客 5183

通过网络爬虫采集大数据

网络数据采集是指通过网络爬虫或网站公开 API 等方式从网站上获取数据信息。该方法可以将非结构化数据从网页中抽取出来,将其存储为统一的本地数据文件,并以结构化的方式存储。它支持图片、音频、视频等文件或附件的采集,附件与正文可以自动关联。 在互联网时代,网络爬虫主要是为搜索引擎提供最全面和最新的数据。 在大数据时代,网络爬虫更是从互联网上采集数据的有利工具。目前已经知道的各种网络爬虫工具已经有上...

程序员生活网 3万+

MacOS下Mixly 2.0安装避坑指南:从Java环境到终端权限全解析

本文详细解析了在MacOS系统上安装Mixly 2.0时可能遇到的核心问题与解决方案。针对Java环境版本不兼容、MacOS Gatekeeper安全机制拦截以及终端权限不足三大常见障碍,提供了从检查并配置正确Java版本、安全设置绕过到彻底解决应用内部工具链权限的完整避坑指南,帮助用户顺利完成安装并正常使用。

weixin_29231725的博客 503

网络爬虫学习

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。类型:网络爬虫按照系统结构和实现技术,大致可以分为以下几种:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。

2303_77635734的博客 2466

广东省低应变题库

11.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,采用低应变法对混凝土预制桩进行检测时,地基基础设计等级为甲级的桩基工程抽检桩数不应少于总桩数的30%,其余桩基工程抽检桩数不应少于总桩数的20%,且不得少于10根;16.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,当对某桩的桩身完整性判定为III类时,可认为该桩不满足验收条件,不用进一步确定该桩桩身缺陷对桩身结构承载力的影响程度。2.地基基础检测所用计量器具均应在检定(校准、验证)的有效期内,性能符合相关技术要求。

ZShy001238的博客 319

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能。本篇文章主要介绍如何使用xlwings对Excel表格进行多行多列数据设置和操作,并给出相应的源代码。接着,我们可以对这个范围内的所有单元格进行操作,如设置字体颜色、填充颜色、对齐方式等。以上就是使用xlwings对Excel表格进行多行多列数据操作和设置字体颜色、填充色和对齐方式的全部内容。最后,我们可以将数据写入到单元格中,也可以从单元格中读取数据。在Excel中,可以通过。

BUG?不存在的! 713

Python网络爬虫简介与环境配置

Python网络爬虫简介以及环境配置,包括conda环境下载安装、PyCharm编辑器下载安装以及解释器配置,网络爬虫所需库安装,MySQL数据库安装、MongoDB数据库安装。

shield911的博客 6079

华为OD机考双机位C卷 - 敌情监控 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 敌情监控 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 964

什么是网络爬虫

网络爬虫(Web Crawler),也被称为网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定的规则,自动抓取万维网信息的程序或脚本。它通过模拟人类浏览器的行为,在互联网上遍历网页,提取其中的文本、图片、链接等数据,为后续的数据分析、处理和应用提供原始素材。

zchRain的博客 1509

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

升级普通Scrapy为增量式爬虫(一)

根据一些业务需求,在爬虫的过程中由于一些网络或者人为的原因终止了爬虫流程,下次发起爬虫请求时,会重新开始,导致原来爬虫过的数据会重复爬取。 为了解决重复爬取,同时也是为了对爬取的数据进行一个筛选,就需要用到增量式爬虫。 增量式爬虫的意义在于,当爬虫流程中断后,下次爬虫请求会紧接着上次中断的地方进行爬取,上次爬取的数据,就不会再发送请求,提高爬虫效率。 增量式爬虫的方法: 第一种: 启用scrapy...

mygodit的博客 4936

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

网络爬虫是什么?怎么学python爬虫

网络爬虫又称网络蜘蛛、网络机器人,它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。

m0_59235508的博客 2847

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: scrapy如何GET和POST请求
下一篇: 分布式爬虫的部署(scrapy_redis)
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值