功能强大的python包(八):Scrapy

1.Scrapy简介
Srapy图标

Scrapy是用python开发的一个应用程序框架,用于对网站进行爬取和提取结构化数据,这些结构化的数据可用于数据挖掘、信息处理或历史存档等。

Scrapy一站式解决了Requests库BeautifulSoup库两个库所做的工作;并且完善了爬虫调度流程,简化了数据爬取任务。

2.网络爬虫

爬虫基本流程:


网络爬虫流程

发起请求:
通过HTTP库向目标站点发起请求,等待目标站点服务器响应。

获取响应:
若服务器正常响应,会返回一个Response,该Response即为获取得页面内容,Response可以是HTML、JSON字符串、二进制数据等数据类型。

解析内容:
利用正则表达式、网页解析库对HTML进行解析;将json数据转为JSON对象进行解析;保存我们需要得二进制数据(图片、视频)。

保存数据:
可将爬取并解析后的内容保存为文本,或存至数据库等。

3.Scrapy总览
scrapy框架

Scrapy开发步骤
  • 新建工程和spider模板
  • 编写Item.py(确定需要采集的信息)
  • 编写spider.py(网页爬取,数据采集)
  • 编写pipelines.py(数据清洗、保存)
  • 优化配置策略
Scrapy命令行
在这里插入图片描述
命令 描述
scrapy -h 启动
scrapy <command>[options][args] 格式
start project 新建工程:scrapy startproject <name> [dir]
genspider 创建爬虫:scrapy genspider [options] <name> <domain>
setting 获取爬虫配置:scrapy settings [options]
crawl 运行爬虫:scrapy crawl <spider>
shelll 启动url调试命令行:scrapy shell [url]
list 列出工程中所有爬虫:scrapy list
Scrapy组成部分
在这里插入图片描述
  • 五大模块
模块 描述
engine模块 控制所有模块之间的数据流;根据条件触发事件
downloader模块 根据请求下载网页
scheduler模块 对所有爬取进行调度管理
spider模块 解析downloader返回的响应(response);产生爬取项(scraped item);产生额外的爬取请求(request)
item pipelines模块 以流水线方式处理spider返回的爬取项; 由一组操作顺序组成,类似流水线,每个操作是一本item pipeline类型;操作包括:清理、检验和查看爬取项中的HTML数据、将数据存储到数据库
  • 两个中间件
中间件 描述
downloader middleware 目的:实施engine、scheduler、scheduler和downloader之间进行用户可配置的控制;功能:修改、丢弃、新增请求或响应
spider middleware 目的:对请求和爬取项的再处理;功能:修改、丢弃、新增请求或爬取项
Spider类实现
三大类
在这里插入图片描述
类名 描述
request request对象表示一个HTTP请求由spider生成,由downloader执行
response reponse对象表示一个HTTP响应,由downloader生成,由spider处理
item 表示从HTML页面中提取的信息内容
request方法 描述
.url request对应的请求url地址
.method 请求方法,'get','post'
.headers 字典类型风格的请求头
.body 请求内容,字符串类型
.meta 用户添加的扩展信息,在scrapy内部模块间传递信息使用
.copyl 复制该请求
response方法 描述
.url response对应的url地址
.stauts HTTP状态码,默认为200
.headers response对应的头部信息
.body response对应的内容信息,字符串类型
.meta 用户添加的扩展信息,在scrapy内部模块间传递信息使用
.flags 一组标记
.request 产生response类型对应的request对象
.copy 复制该响应
数据交互
Scrapy数据流
在这里插入图片描述
  1. 引擎(engine):打开要处理的网站,向爬虫(spider)请求第一个要爬取的URL
  2. 引擎(engine):从爬虫(spider)获取第一个要爬取的URL,并交给调度器(scheduler)处理
  3. 调度器(scheduler):返回处理好的request给引擎(engine)
  4. 引擎(engine):将request传递给(downloader)下载器下载
  5. 下载器(downloader):将下载好的信息传递给引擎(engine)
  6. 引擎(engine):将下载好的response传递给爬虫(spider)
    7.爬虫( spider):提交从response获取的item数据和需跟进的URL
  7. 引擎(engine):将item传递给管道(item pipeline),将需跟进的URL传递给调度器(scheduler),重复4至8步骤,直至获取完全部信息
  8. 管道(item pipeline):处理item数据
4.选择器

选择器是实现spider的关键技术,我们通过选择器来定位网页源码中我们所需信息的位置,并提取该位置;所以选择器是spider的核心。

xpath选择器

xpath使用路径表达式来选取节点。


路径表达式

通过在路径表达式中使用“|”运算符,来选取若干个路径。


在这里插入图片描述

xpath 通配符可用来选取未知的 XML 元素。
通配符

谓语用来查找某个特定的节点或者包含某个指定的值的节点;谓语被嵌入在"[ ]"中。


谓语
CSS选择器
CSS选择器
5.scrapy爬虫实战

目标:获取起点中文网中小说热销榜的数据信息:小说名称、作者、类型、形式。

  • 创建项目
    通过命令行定位到存储项目的目录:

    cd d:\scrapyProject\

    创建一个名为qidian_hot的项目:

    scrapy startproject qidian_hot

    创建一个名为hot的爬虫:

    scrapy genspider hot "qidian.com"

  • 编写items.py代码:

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

import scrapy


class QidianHotItem(scrapy.Item):
    name = scrapy.Field()
    author = scrapy.Field()
    types = scrapy.Field()
    form = scrapy.Field()
    # define the fields for your item here like:
    # name = scrapy.Field()
    #pass

  • 编写hot.py代码:
#coding:utf-8

from scrapy import Request
from scrapy.spiders import Spider
from ..items import QidianHotItem
#导入下需要的库

class HotSalesSpider(Spider):#设置spider的类
    
    name = "hot" #爬虫的名称
    #设置header
    qidian_header={"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"} 
    current_page = 1 #爬虫起始页
    
    def start_requests(self): #重写第一次请求
        url="https://www.qidian.com/rank/hotsales?style=1&page=1"
        yield Request(url,headers=self.qidian_header,callback=self.hot_parse)
        #Request发起链接请求
        #url:目标url
        #header:设置头部(模拟浏览器)
        #callback:设置页面抓起方式(空默认为parse)
        
    def hot_parse(self, response):#数据解析
        #xpath定位
        list_selector=response.xpath("//div[@class='book-mid-info']")
        #获取所有小说
        for one_selector in list_selector:
            #获取小说信息
            name=one_selector.xpath("h4/a/text()").extract()[0]
            #获取作者
            author=one_selector.xpath("p[1]/a[1]/text()").extract()[0]
            #获取类型
            types=one_selector.xpath("p[1]/a[2]/text()").extract()[0]
            # 获取形式
            form=one_selector.xpath("p[1]/span/text()").extract()[0]

            item = QidianHotItem()
            #生产存储器,进行信息存储
            item['name'] = name
            item['author'] = author
            item['types'] = types
            item['form'] = form

            yield item #送出信息
  • 通过命令行运行爬虫:

    scrapy crawl hot -o hot.csv

  • 查看数据


    image
写在最后

基于此整理的各种资料,大家可以在我的个人简介中查看并获取!


优秀参考

网络爬虫

Scrapy入门教程

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容