文章目录

  • 1 scrapy全站爬取
    • 1.1 全站爬取简介
    • 1.2 CrawlSpider
      • 1.2.1 基本讲解
      • 1.2.2 使用CrawlSpider
        • 1.2.2.1 爬虫文件
        • 1.2.2.2 items.py文件
  • 2 分布式爬虫
    • 2.1 分布式爬虫概念
    • 2.2 环境安装
    • 2.3 使用方法
      • 2.3.1 CrawlSpider配置
      • 2.3.2 redis相关配置
      • 2.3.3 启动工程
  • 3 增量式爬虫
    • 3.1 概念讲解
    • 3.2 使用
      • 3.2.1 爬虫文件
      • 3.2.2 管道文件

1 scrapy全站爬取

1.1 全站爬取简介

CrawlSpider:全站数据爬虫的方式,它是一个类,属于Spider的子类
如果不使用CrawlSpider,那么就相当于基于spider,手动发送请求,太不方便
基于CrawlSpider可以很方便地进行全站数据爬取

1.2 CrawlSpider

1.2.1 基本讲解

基本步骤:

  • 创建一个工程:scrapy startproject ProjectName
  • 切换到爬虫工程中后,创建爬虫文件:scrapy genspider -t crawl xxx www.xxx.com

使用CrawlSpiderspider产生的爬虫文件除了继承类不一样外还有一个rules的规则解析器

 rules = (Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),)

rules规则解析器内有一个链接提取器LinkExtractor(allow=r'Items/')callback是规则解析器指定的解析方法,follow是指爬取页面内可见部分页面还是全部

页面内可见部分页面如下:

链接提取器作用:根据指定的规则allow=r'Items/'进行指定的链接的提取
规则解析器作用:把链接提取器提取到的链接进行指定规则callback='parse_item'的解析操作
follow作用:True可以把 链接提取器 继续作用到 链接提取器提取到的链接所对应的 页面 中,False爬取页面内可见部分页面

1.2.2 使用CrawlSpider

1.2.2.1 爬虫文件

使用CrawlSpider生成爬虫文件时,在规则解析器rules里面添加正则表达式进而发起请求,如果要一个请求内需要再次发起请求,就需要在rules中添加链接请求并指定对应的解析方法

注意xpath中最好不要出现tbody标签

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rulefrom sunPro.items import SunproItem,DetailItem
class SunSpider(CrawlSpider):name = 'sun'#爬虫文件名# allowed_domains = ['www.xxx.com']#允许的urlstart_urls = ['http://dk.test.com/mail/?ac=list&tid=1']#url列表#规则解析器 rules = (#LinkExtractor(allow=r'Items/')连接提取器,就是用来提取连接,根据指定规则(allow=r'Items/')进行指定连接的提取Rule(LinkExtractor(allow=r'ac=list&tid=1&order=1&page=\d+'), callback='parse_item', follow=False),#获取详情信息Rule(LinkExtractor(allow=r'ct=index&ac=detail&id=\d+'), callback='parse_detail', follow=False),)def parse_item(self, response):tr_list=response.xpath('/html/body/table[2]//tr/td/table//tr[3]/td/table//tr/td[1]/table//tr/td/table//tr[1]/td/div/table//tr[@bgcolor="#FFFFFF"]')# print(tr_list)for tr in tr_list:news_num = tr.xpath('./td[1]/text()').extract_first()news_title = tr.xpath('./td[2]/a/text()').extract_first()print(news_num,news_title)""" item=SunproItem()item['news_title']=news_titleitem['news_num']=news_numyield item """def parse_detail(self,response):news_id=response.xpath('/html/body/table[2]//tr/td/table//tr[3]/td/table//tr/td[1]/table//tr[1]/td/table//tr/td/table//tr[2]/td/table//tr[1]/td[1]/span/text()').extract_first()news_content=response.xpath('/html/body/table[2]//tr/td/table//tr[3]/td/table//tr/td[1]/table//tr[1]/td/table//tr/td/table//tr[3]/td/table//tr[1]/td/table//tr[2]/td//text()').extract()news_content=''.join(news_content)item=DetailItem()item['news_id']=news_iditem['news_content']=news_contentyield item

1.2.2.2 items.py文件

由于不能发送请求时传参因此,需要两个item类文件

import scrapyclass SunproItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()news_title=scrapy.Field()    news_num=scrapy.Field()class DetailItem(scrapy.Item):news_id=scrapy.Field()news_content=scrapy.Field()

2 分布式爬虫

2.1 分布式爬虫概念

分布式爬虫:需要搭建一个分布式的集群,让其对一组资源进行分布联合爬取,主要是为了提升爬取数据效率

2.2 环境安装

安装一个scrapy-redis的组件:pip install scrapy-redis,由于原生的scrapy不可以失效分布式爬虫,必须让scrapy结合scrapy-redis组件一起实现分布式爬虫
那么为什么原生scrapy不可以实现分布式?

  • 调度器不可以被分布式集群共享
  • 管道不可以被分布式集群共享

但是scrapy-redis组件可以提供共享的管道和调度器

2.3 使用方法

2.3.1 CrawlSpider配置

基本使用步骤:

  • 创建基于CrawlSpider的爬虫文件,修改爬虫文件

导包:from scrapy_redis.spiders import RedisCrawlSpider
start_urlsallowed_domains注释掉
添加一个新属性:redis_key='sun'作为可以被共享的调度器队列名称
编写数据解析相关操作
把当前父类修改为RedisCrawlSpider

  • 修改配置文件settings.py,不要开启项目自带的pipelines不然还是走的原来的管道,需要指定共享的管道RedisPipeline,还要指定调度器
指定管道
ITEM_PIPELINES = {#'sunPro.pipelines.SunproPipeline': 300,'scrapy_redis.pipelines.RedisPipeline':400
}指定调度器
#增加一个去重容器类的配置,作用使用redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
#使用scrapy-redis组件自己的调度器
SCHEDULER='scrapy_redis.scheduler.Scheduler'
#配置调度器是否需要持久化,也就是当爬虫结束了,要不要清空reids中请求队列
#如果服务器宕机了,重启后从爬取的位置继续爬取
SCHEDULER_PERSIST = True指定redis地址和端口
REDIS_HOST='127.0.0.1'
REDIS_PORT='6379'

2.3.2 redis相关配置

redis.windows-server.conf文件修改把bind 127.0.0.1给注释掉,由于要把爬到的数据库储存到不同地方,因此不要绑定本地
关闭保护模式protected-mode yes修改为protected-mode no,如果开启了保护模式,那么其他客户端只能读取redis而不能写入

2.3.3 启动工程

分布式爬虫启动和scrapy工程不同,需要定位到爬虫文件.py目录内,执行scrapy runspider xxx.py
工程启动后在redis客户端中向redis添加调度队列:lpush sun www.xxx.com(由于之前写过redis_key='sun’的共享调度属性)

3 增量式爬虫

3.1 概念讲解

增量式爬虫:检测网站数据更新的情况,只会爬取网站最新出来的数据
还是基于CrawlSpider获取其他页码链接处理的,每次爬取时,都会对已经爬取的数据进行比较,若爬取过了,就不再爬取

3.2 使用

3.2.1 爬虫文件

主要通过redis来判断是否已经存储过

from redis import Redis
from sunPro.items import SunproItem
class SunSpider(CrawlSpider):name = 'sun'# allowed_domains = ['www.xxx.com']start_urls = ['http://www.xxx.com/']rules = (Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),)#创建redis对象conn = Redis(host='127.0.0.1',port=6379)def parse_item(self, response):li_list=response.xpath('xxxxx');for li in li_list:# 获取详情urldetail_url=li.xpath('xxxxxxxxxx').extract_first()ex=self.conn.sadd('urls',detail_url)if ex==1:print('该url没有爬取过,可以进行数据爬取')yield scrapy.Request(url=detail_url,callback=self.parse_detail)else:print('数据没有更新,暂无新数据可爬取')def parse_detail(self,response):item = SunproItem()item['name']=response.xpath('xxxxxxxxxxxxx').extract()

3.2.2 管道文件

在管道文件中获取redis


class SunproPipeline:conn=None# 开启爬虫时执行,只执行一次def open_spider(self,spider):self.conn=spider.conn#理提取的数据(保存数据)def process_item(self, item, spider):dict={'name':item['name']}self.conn.lpush('test',dict)return item# 关闭爬虫时执行,只执行一次。 (如果爬虫中间发生异常导致崩溃,close_spider可能也不会执行)def close_spider(self, spider):# 可以关闭数据库等pass

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

  1. python爬京东联盟_python爬虫框架scrapy实战之爬取京东商城进阶篇

    前言 之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scrapy如何爬取京东商城,下面话不多说了,来看看详细的介绍吧 ...

  2. 爬虫实战之全站爬取拉勾网职位信息

    全站爬取拉勾网职位信息 一.环境 window7 scrapy MySQL 二.简介 scrapy的全站爬取方式crawlspider跟其通用爬取方式spider实现上有一定的区别,两者都有各自的优势 ...

  3. Python爬虫开源项目代码(爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网 等等)...

    文章目录 1.简介 2.开源项目Github 2.1.WechatSogou [1]– 微信公众号爬虫 2.2.DouBanSpider [2]– 豆瓣读书爬虫 2.3.zhihu_spider [3 ...

  4. Python爬虫开源项目代码(爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网 等等)

    文章目录 1.简介 2.开源项目Github 2.1.WechatSogou [1]– 微信公众号爬虫 2.2.DouBanSpider [2]– 豆瓣读书爬虫 2.3.zhihu_spider [3 ...

  5. 23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博

    今天为大家整理了32个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心,所有链接指向GitHub. 1.WechatSogou – 微信公众号爬虫 基于搜狗微信搜 ...

  6. 推荐23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博等

    点击上方 Python知识圈,选择"设为星标" 回复"1024"获取编程资料 阅读文本大概需要 5 分钟. 今天为大家整理了23个Python爬虫项目.整理的原 ...

  7. python爬取网页内容_Python爬虫原理解析

    笔者公众号:技术杂学铺 笔者网站:mwhitelab.com 本文将从何为爬虫.网页结构.python代码实现等方面逐步解析网络爬虫. 1. 何为爬虫 如今互联网上存储着大量的信息. 作为普通网民,我 ...

  8. python 写csv scrapy_scrapy爬虫框架实例一,爬取自己博客

    本篇就是利用scrapy框架来抓取本人的博客,博客地址:http://www.cnblogs.com/shaosks scrapy框架是个比较简单易用基于python的爬虫框架,相关文档:http:/ ...

  9. python爬虫影评_Python爬虫(二十)_动态爬取影评信息

    本案例介绍从JavaScript中采集加载的数据.更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import t ...

最新文章

  1. 服务器安装使用rstudio-server
  2. 以实用著称的《PHP与MySQL程序设计(第3版)》问世啦!
  3. 【洛谷 2782】友好城市
  4. SQL Server性能调优入门(图文版)
  5. python鸢尾花数据集_Python实现鸢尾花数据集分类问题——使用LogisticRegression分类器...
  6. python ljust 库_Python知识精解:str ljust()方法
  7. 生产管理erp系统源码_仁和ERP企业管理系统提高生产管理流程
  8. 第2、3讲 图像的存储格式
  9. DOM-动态操作心得
  10. ConvMLP:你见过长得像CNN的MLP吗?UOUIUC提出了用于视觉任务的层次卷积MLP
  11. shell基础07 函数
  12. Factory Method (工厂模式)
  13. stdio.h头文件被更改怎么办
  14. POI读取Excel表格时遇到科学计数法处理
  15. SQL_Xbar代码
  16. 神仙打架!今年计算机考研爆炸实况!
  17. 简七32堂极简理财课——模块三:日常理财,让你时时刻刻都有钱
  18. Tita OKR分享:我们提出的OKRs-E是什么?
  19. 乐视电商云的整体架构与技术实现
  20. 计算机电源直接连接哪两根线才能开机,电脑电源开关线是哪两根

热门文章

  1. Android中的事件处理研究
  2. import java.sql.* ;报错
  3. 分布式系统简介和学习路线
  4. 卡轨式2光8电千兆工业级环网交换机嵌入式低功耗网管型矿用工业以太网交换机
  5. 小白必看:一文读懂推荐系统负采样
  6. python-for循环-数字类型-字符串类型str
  7. 按字编址与按字节编址
  8. python爬虫-使用cookie登录
  9. 计算机中的文件名英文,计算机中的各种文件(国外英文资料).doc
  10. 微信小程序canvas绘制曲线图表