Python爬虫Scrapy框架CrawlSpider原理及使用案例


Posted in Python onNovember 20, 2020

提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?

方法一:基于Scrapy框架中的Spider的递归爬去进行实现的(Request模块回调)

方法二:基于CrawlSpider的自动爬去进行实现(更加简洁和高效)

一、简单介绍CrawlSpider

CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能。其中最显著的功能就是”LinkExtractors链接提取器“。Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适。

二、使用

1.创建scrapy工程(cmd切换到要创建项目的文件夹下执行):scrapy startproject projectName (如:scrapy startproject crawlPro)

2.创建爬虫文件(cmd切换到创建的项目下执行):scrapy genspider -t crawl spiderName www.xxx.com (如:scrapy genspider -t crawl crawlDemo www.qiushibaike.com)

--此指令对比以前的指令多了 "-t crawl",表示创建的爬虫文件是基于CrawlSpider这个类的,而不再是Spider这个基类。

3.启动爬虫文件(cmd基于步骤二的路径执行):scrapy crawl crawlDemo (启动的一定是name对应的值,如果爬虫文件与name的值不一致,任然以name的值进行启动)

观察生成的爬虫文件

crawlDemo.py

# -*- coding: utf-8 -*-
import scrapy
# 导入CrawlSpider相关模块
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

# 表示该爬虫程序是基于CrawlSpider类的
class CrawldemoSpider(CrawlSpider):
  name = 'crawlDemo'  #爬虫文件名称
  #allowed_domains = ['www.qiushibaike.com']
  start_urls = ['http://www.qiushibaike.com/']
  
  #连接提取器:会去起始url响应回来的页面中提取指定的url
  link = LinkExtractor(allow=r'/8hr/page/\d+')
  #rules元组中存放的是不同的规则解析器(封装好了某种解析规则)
  rules = (
    #规则解析器:可以将连接提取器提取到的所有连接表示的页面进行指定规则(回调函数)的解析
    Rule(link, callback='parse_item', follow=True),
  )
  # 解析方法
  def parse_item(self, response):
    #print(response.url)
    divs = response.xpath('//div[@id="content-left"]/div')
    for div in divs:
      author = div.xpath('./div[@class="author clearfix"]/a[2]/h2/text()').extract_first()
      print(author)

CrawlSpider类和Spider类的最大不同是CrawlSpider多了一个rules属性,其作用是定义”提取动作“。在rules中可以包含一个或多个Rule对象,在Rule对象中包含了LinkExtractor对象。 

三、生成的爬虫文件参数介绍

3.1 LinkExtractor:顾名思义,链接提取器。

LinkExtractor(

  allow=r'Items/',# 满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。

deny=xxx, # 满足正则表达式的则不会被提取。

restrict_xpaths=xxx, # 满足xpath表达式的值会被提取

restrict_css=xxx, # 满足css表达式的值会被提取

deny_domains=xxx, # 不会被提取的链接的domains。 

)

- 作用:提取response中符合规则的链接。 

3.2 Rule : 规则解析器。根据链接提取器中提取到的链接,根据指定规则提取解析器链接网页中的内容。

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

- 参数介绍:

参数1:指定链接提取器

参数2:指定规则解析器解析数据的规则(回调函数)

参数3:是否将链接提取器继续作用到链接提取器提取出的链接网页中。当callback为None,参数3的默认值为true。

3.3 rules=( ):指定不同规则解析器。一个Rule对象表示一种提取规则。

3.4 CrawlSpider整体爬取流程:

a)爬虫文件首先根据起始url,获取该url的网页内容

b)链接提取器会根据指定提取规则将步骤a中网页内容中的链接进行提取

c)规则解析器会根据指定解析规则将链接提取器中提取到的链接中的网页内容根据指定的规则进行解析

d)将解析数据封装到item中,然后提交给管道进行持久化存储

四、基于CrawlSpider示例

创建爬虫项目和启动爬虫项目以及settings中配置自行完成,在这里不在追赘述

4.1爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from qiubaiBycrawl.items import QiubaibycrawlItem
import re
class QiubaitestSpider(CrawlSpider):
  name = 'qiubaiTest'
  #起始url
  start_urls = ['http://www.qiushibaike.com/']

  #定义链接提取器,且指定其提取规则
  page_link = LinkExtractor(allow=r'/8hr/page/\d+/')
  
  rules = (
    #定义规则解析器,且指定解析规则通过callback回调函数
    Rule(page_link, callback='parse_item', follow=True),
  )

  #自定义规则解析器的解析规则函数
  def parse_item(self, response):
    div_list = response.xpath('//div[@id="content-left"]/div')
    
    for div in div_list:
      #定义item
      item = QiubaibycrawlItem()
      #根据xpath表达式提取糗百中段子的作者
      item['author'] = div.xpath('./div/a[2]/h2/text()').extract_first().strip('\n')
      #根据xpath表达式提取糗百中段子的内容
      item['content'] = div.xpath('.//div[@class="content"]/span/text()').extract_first().strip('\n')

      yield item #将item提交至管道

4.2items文件

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class QiubaibycrawlItem(scrapy.Item):
  # define the fields for your item here like:
  # name = scrapy.Field()
  author = scrapy.Field() #作者
  content = scrapy.Field() #内容

4.3管道文件

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

class QiubaibycrawlPipeline(object):
  
  def __init__(self):
    self.fp = None
    
  def open_spider(self,spider):
    print('开始爬虫')
    self.fp = open('./data.txt','w')
    
  def process_item(self, item, spider):
    #将爬虫文件提交的item写入文件进行持久化存储
    self.fp.write(item['author']+':'+item['content']+'\n')
    return item
  
  def close_spider(self,spider):
    print('结束爬虫')
    self.fp.close()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 Python
Python Tkinter简单布局实例教程
Sep 03 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
PyQt5响应回车事件的方法
Jun 25 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
keras 如何保存最佳的训练模型
May 25 Python
Python 程序员必须掌握的日志记录
Aug 17 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 #Python
python IP地址转整数
Nov 20 #Python
Python django框架 web端视频加密的实例详解
Nov 20 #Python
总结python 三种常见的内存泄漏场景
Nov 20 #Python
Python偏函数实现原理及应用
Nov 20 #Python
python与idea的集成的实现
Nov 20 #Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 #Python
You might like
ezSQL PHP数据库操作类库
2010/05/16 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
python 调用c语言函数的方法
2017/09/29 Python
简单实现python进度条脚本
2017/12/18 Python
python 文件查找及内容匹配方法
2018/10/25 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
django删除表重建的实现方法
2019/08/28 Python
使用python实现画AR模型时序图
2019/11/20 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
《画》教学反思
2014/04/14 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年少先队工作总结
2014/12/03 职场文书
小学班主任心得体会
2016/01/07 职场文书
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技