1.Scrapy简介

python网络自动化 python网络自动化scapy_python

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

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

2.网络爬虫

爬虫基本流程:

python网络自动化 python网络自动化scapy_python_02

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

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

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

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

3.Scrapy总览

python网络自动化 python网络自动化scapy_ide_03


Scrapy开发步骤
  • 新建工程和spider模板
  • 编写Item.py(确定需要采集的信息)
  • 编写spider.py(网页爬取,数据采集)
  • 编写pipelines.py(数据清洗、保存)
  • 优化配置策略
Scrapy命令行

python网络自动化 python网络自动化scapy_python_04

命令

描述

scrapy -h

启动

scrapy [options][args]

格式

start project

新建工程:scrapy startproject [dir]

genspider

创建爬虫:scrapy genspider [options]

setting

获取爬虫配置:scrapy settings [options]

crawl

运行爬虫:scrapy crawl

shelll

启动url调试命令行:scrapy shell [url]

list

列出工程中所有爬虫:scrapy list

Scrapy组成部分

python网络自动化 python网络自动化scapy_ide_05

  • 五大模块

模块

描述

engine模块

控制所有模块之间的数据流;根据条件触发事件

downloader模块

根据请求下载网页

scheduler模块

对所有爬取进行调度管理

spider模块

解析downloader返回的响应(response);产生爬取项(scraped item);产生额外的爬取请求(request)

item pipelines模块

以流水线方式处理spider返回的爬取项; 由一组操作顺序组成,类似流水线,每个操作是一本item pipeline类型;操作包括:清理、检验和查看爬取项中的HTML数据、将数据存储到数据库

  • 两个中间件

中间件

描述

downloader middleware

目的:实施engine、scheduler、scheduler和downloader之间进行用户可配置的控制;功能:修改、丢弃、新增请求或响应

spider middleware

目的:对请求和爬取项的再处理;功能:修改、丢弃、新增请求或爬取项

python网络自动化 python网络自动化scapy_数据_06

三大类

python网络自动化 python网络自动化scapy_ide_07

类名

描述

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

复制该响应

python网络自动化 python网络自动化scapy_爬虫_08

Scrapy数据流

python网络自动化 python网络自动化scapy_python网络自动化_09

  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使用路径表达式来选取节点。

python网络自动化 python网络自动化scapy_爬虫_10


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

python网络自动化 python网络自动化scapy_python网络自动化_11


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

python网络自动化 python网络自动化scapy_python网络自动化_12


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

python网络自动化 python网络自动化scapy_爬虫_13

CSS选择器

python网络自动化 python网络自动化scapy_数据_14

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

  • 查看数据
  • python网络自动化 python网络自动化scapy_python网络自动化_15

写在最后
双击屏幕,解锁新技能!