网络数据采集与python爬虫

待补充清单:

  1. HTTP工作原理

一、数据的来源与采集方法

  • 单位自有的历史数据

  • 定量/定性的市场调研

  • 专业机构的长期积累

二、网络爬虫的基本概念

网络爬虫是一种根据特定爬去规则,自动抓取网页,提取网页内容,输出特定数据的应用程序

  • 主要功能

    1. 广泛收集网页信息,形成web检索

    2. 根据兴趣需求,聚焦具体内容,面向主题进行数据采集

    3. 针对特定web应用系统或处理流程,实现自动化测试或模型检测

    4. 针对web系统可能存在的风险或漏洞,实现自动化安全测试和漏洞检测

  • 工作原理

    • 构成部分

      1. 需要爬取的网页地址

      2. 执行爬取策略的任务调度器

      3. 访问页面或下载数据的下载器

      4. 分析和提取页面内容的解析器

      5. 保存爬得数据结果的存储器

    • 基本工作原理

三、网络爬虫的需求分析

  • 分类

    根据程序功能和目标的不同,网络爬虫系统可以分为:通用爬虫和主题爬虫

    通用爬虫:不针对特定主题,在网络上广泛收集网络链接和网页内容的爬虫,eg Google或百度搜索引擎中集成着这类程序,目标是形成互联网规模的网站地图

    主题爬虫:自定义的、面向特定主题需求的网络爬虫程序,返回结果更加定制化,有利于用户进行后续数据分析

  • 需求分析(面向主题的爬虫程序)

    • 功能需求

    • 性能需求

      覆盖度(爬虫程序已访问的网页数量与所需访问的网页数量的比值)

      新鲜度、时效性

      礼貌性(爬虫程序对服务器产生压力的大小)

      陷阱绕过能力

      扩展性(爬取和下载数据量的大小)

      提交效率(爬虫成功提交web页面表单的能力)

      状态敏感度(反映爬虫程序正确感知网页DOM状态更新的能力)

1.2.3 网络爬虫的发展历程

  • 阶段一:静态网页爬虫

    1994年诞生第一个网络爬虫WebCrawler

    1998年Google公司推出第一代Google bot

    网络爬虫的基本组成

    image-20230810212153546

    URL去重——降低负载

  • 阶段二:动态Web爬取

    动态网页;ASP、PHP、JSP、表单、数据库等技术称为组建网站的主流技术和关键部件

    image-20230810212215771

  • 阶段三:富互联网应用Web爬取

    富互联网:简称RIA,这些程序通常由Flash、Siverlight、javaFX、ActiveX和HTML5构成

    使用这些技术加载页面内容,通常不更新URL,通常通过Ajax或js中action动作改变页面状态

    image-20230810212254104

2.1 相关web技术介绍与网络爬取的入口

  • 相关web技术概述

    web是一种基于http和HTML的全球性的分布式图形信息系统,是建立在Internet上的一种网咯服务

    image-20230810212550016

    网络爬虫模拟人操作web浏览器的行为,通常以URL作为输入量

  • 网络爬取的入口(URL)

    根据人们指定的某个URL,去访问web页面。

    URL(Uniform Resource Locator)—— 统一资源定位符

    URL具有唯一性和通用性

    唯一性:互联网上的每个文件都有一个唯一的URL

    通用性:URL的构成遵循一定格式

    格式

    1. 访问模式(通信协议):服务器采用哪种协议或应用服务,来接收来自客户端的请求,并给予响应 eg.https/ftp

    2. 用户信息:非必填项,若服务器仅对授权用户开放,需要这段内容 通常表现为用户名+密码,用户信息后要跟@作间隔符 eg.ftp://test:test@ 192.168…

    3. 主机名称(IP地址):web网页所在服务器的域名或IP地址

      是一串用.分割的内容,IP地址时数字体,而域名是更易记忆的有含义的字符串

      eg. zhidao.baidu.com

    4. 访问端口:服务器上某个正在运行的网络服务程序的访问地址,缺省时表示访问模式的默认端口,若默认端口改变,则不可省略 eg. http://www.aspxfans.com:8080/

    5. 路径:由一个或多个/隔开的字符串组成,一般用来表示主机上的一个web访问目录或具体的文件路径

    6. 查询:常用于向网站服务器传递参数,通常由?开始,使用参数名=参数值的形式,有多个参数时,中间用&隔开

    7. 片断:通常以一个# 开始,用于辅助定位,包含其的URL,可以定位文档中的某一章节

    URL = scheme:[//authority]path[?query][#fragment]

2.2 网页下载的原理

  • 超文本传输协议(HTTP)

    因特网上应用最为广泛的网络传输协议,所有www文件都遵守这个标准

  • HTTP工作原理

    HTTP由请求和响应构成,采用客户端-服务器模式工作

    客户端:浏览器/网络爬虫程序

    image-20230810212609030

    image-20230810212627153

  • 注意事项

    • HTTP是无连接:限制每次连接只处理一个请求,服务器处理完客户的请求并收到应答后,即断开连接

    • HTTP是媒体独立的:客户端以及服务器指定使用适合的多用途互联网邮件扩展类型(设定某种扩展名的文件用一种应用程序打开的方式类型)

    • HTTP是无状态:指协议对事务处理没有记忆能力

  • HTTP请求与响应

    • 请求

      请求结构

      请求行    请求头部    空行    请求数据

      • 请求方法

        HTTP1.0定义了三种请求方法:GET、POST、HEAD

        GET:请求指定的页面信息,并返回实体主体

        POST:向指定资源提交数据进行处理请求,数据被包含在请求体中,可能会导致新的资源的建立或已有资源的修改

        HEAD:类似于get请求,但返回的响应中没有具体的内容,用于获取报文头部,常用于测试连接

        HTTP1.1新增五种请求方法

        PUT:从客户端向服务器传送数据,取代指定文档的内容,类似于更新操作

        DELETE:请求服务器删除URL指定的资源

        OPTIONS:客户端查看服务器性能参数

        TRACE:回显服务器收到的请求,主要用于测试或诊断

        CONNECT:1.1协议中预留给能够将连接改为管道方式的代理服务器

      • 请求头部的参数内容

        1. Accept参数

          用于向服务器申明客户端(浏览器)可以接受的媒体类型(MIME)的资源

          常见赋值

          text/html    application/xhtml+xml    

          application/xml

          如果客户端允许接收任意类型的文件,可使用通配符*/*

        2. Accept-encoding参数

          向服务器声明客户端允许接收的压缩编码算法

          常见赋值

          gzip    deflate    br

        3. Accept-Language

          用于向服务器申明客户端允许接收的语言

          en-US    zh-CN

          q,权重,取值0-1,根据权重大小优先支持

          Accept-Language: zh-cn;q=0.8,en-US;q=0.9
          意思:优先支持英文,如果没有英文则支持中文。

          Accept-Language: zh-cn;q=0.8,en-US;q=0.6
          意思:优先支持中文,如果没有中文则支持英文。

          **Accept-Language: ***
          意思: 支持所有语言

        4. Cache-contol

          用于控制客户端的缓存

          private    no-cache    max-age    must-revalidate

          private为默认,意为浏览器自身决定缓存大小

          若是no-cache、must-revalidate,打开新窗口时会重新访问服务器

          若指定max-age的值,在此之内时间里则不会重新访问服务器

          eg.Cache-control:max-age=5     访问此网页的5s内再次访问不会丢失服务器

        5. Connection

          设置浏览器是否需要与服务器持久链接

          keep-alive:需要持久链接

          no:完成此次访问后即关闭连接

        6. cookie

          网站服务器为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据(通常经过加密)

          在HTTP请求头中设置这个参数,在想服务器发送请求时,会将保存在该参数下的cookie值发送给web服务器,服务器根据这些值可以获得用户信息和访问历史

        7. Host

          用于指定请求发往的服务器的域名和端口号

          Host::

          host是服务器的域名 eg.www.baidu.com

          port是服务器监听的TCP端口号,可不填

        8. Upgrade-insecure-Requests

          赋值为1时,用于声明浏览器支持从http请求自动升级为https请求,并且在以后发送请求时都使用https

          设置为0,不允许升级为https

        9. User-Agent

          向服务器发送浏览器版本、系统、应用程序的信息,向服务器表明客户端身份

        10. Refer

          告诉服务器,客户端通过哪个页面跟踪到当前页面的,即客户端访问的上一页面地址

    • 响应

      响应结构

      状态行    消息报头    空行    响应正文

      HTTP响应状态码(HTTP Status Code),指示当前网络访问的状态

      由三个十进制数字组成,第一个数字定义了状态码的类型,后两个数字没有分类的作用

      • HTTP状态码

        1. 100~199

          响应类型为“信息”,即从服务器收到请求,提示客户端继续执行某项操作;

        2. 200~299

          响应类型为成功,表示客户端请求被服务器成功接收并处理;

        3. 300~399

          响应类型为重定向,客户端请求需要进一步的操作以完成请求;

        4. 400~499

          响应类型为客户端错误,表示请求包含语法错误或无法完成请求;

        5. 500~599

          响应类型为服务器错误,表示服务器在处理请求的过程中发生了错误

        RFC7230手册

      • 响应头部的参数内容

        1. Access-Control-Allow-Origin

          用于指定哪些网站可以跨域资源共享

          常取*,表示允许所有网站跨域共享

        2. Access-Patch

          指定服务器所支持的文档补丁格式

          eg.text/example;charset=utf-8表示支持文本,编码格式为utf-8

        3. Access-Pange

          服务器所支持的内容范围,常取bytes

        4. Ages

          响应对象在代理缓存中存在的时间,以秒为单位

        5. Allow

          指定对于特定资源的有效动作

          eg.GET、HEAD等方法

        6. Catch-Control

          通知服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象以及缓存有效时间,单位秒

          max-age=3600,表示缓存有效时间为1小时

        7. Content-Disposition

          对已知MIME类型资源的描述,浏览器可以根据这个响应头决定对返回资源的动作

        8. Content-Encoding

          响应资源所使用的编码类型,常见取值gzip等

        9. Last-Modified

          所请求对象的最后修改日期

        10. Set-cookie

          用于设置HTTP cookie值

        11. Date

          指明响应发送时的日期和时间

        12. Expires

          指定一个日期/时间,超过该时间则认为此响应已过期

        13. Srver

          指明服务器名称

        RFC2612、RFC7230文档

2.3 内容解析的对象

  • 主要对象:由HTML组织的web网页

    image-20230810212847547

    <base>标签,为页面上的所有链接规定的默认地址或默认目标

    <link>标签,用于定义文档与外部资源之间的关系,最常用于连接样式表

    <meta>标签,meta元素被用于规定页面的描述、关键词、文档的作者、最后修改时间以及其他元数据

  • 表单元素:不同类型的input元素、复选框、单选按钮、提交按钮

    <script>标签:用于定义客户端脚本

  • HTML元素

    外部样式表

    内部样式表

    内联样式

2.4 存储数据的仓库

  • 以文本文件存储数据

    • 纯文本文件:缺少格式控制,被称为无结构文本,机器可读性差

    • CSV文件(逗号分隔值文件),分隔字符通常是逗号,不是逗号时,可以称为字符分隔值文件

    • xml(可扩展标记语言)文件用于在互联网上传输和存储数据(独立于软件和硬件的信息传输工具)

      image-20230810212901870

      <note>——根元素,理解为本文档是一个便签

      xml的标签是自定义的

    • json(轻量级文本数据交换格式)文件:使用JavaScript对象表示法来组织数据,具有自我描述性和人类可读性

    • yaml文件:对人类友好可读的,面向所有编程语言的数据序列化标准,目前常用作应用程序的配置文件

  • 数据库管理系统

    • 关系型数据库:建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据

      关系模型遵循ACID原则

      • Atomic原子性

      • Consistency一致性

      • Isolation隔离性

      • Drability持久性

      SQL语言就是基于关系型数据库的语言,执行对关系型数据库中数据的检索和操作

      image-20230810212916626

    • 非关系型数据库:非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统(以键值对存储、结构不固定)

      image-20230810212931191

      • 键值存储数据库(key-value模型)

        主要会使用到哈希表,在这个表中有一个特定的键和一个指针指向特定的数据

        典型代表

        TokyoCabinet/Tyrant、Redis、Voldemort、OracleBDB等

      • 列存储数据库

        用来应对分布式存储的海量数据,键依然存在,不过指向多个列,这些列有列族安排的

        cassandra、HBASE、Rlak等

      • 文档型数据库

        LotusNotes办公软件,同第一种键值存储相类似,允许之间嵌套键值

        CouchDB、MongoDB、SequoiaDB等

      • 图形数据库

        同行列及刚性结构的SQL数据库不同,使用灵活的图形模型,并且能扩展到多个服务器上

        Neo4J、InfoGrid、InfiniteGraph

3.1 爬取web页面的基本过程

image-20230810212949126

  • 确定爬取目标

  • 确定URL

    人工确定待爬取的目标网页的URL,并将这个URL放入待爬取队列

  • 利用http获取HTML

    网络爬虫程序能够像浏览器一样,根据输入的URL向远程服务器发出http请求,尝试获得响应内容,通常是目标数据所在的HTML文件

  • 解析页面内容

    网络爬虫程序能够解析已下载HTML文档内容

    检索HTML文档,提取出目标数据的过程,除了目标数据,可能还需要获得新的URL,为后续爬取提供种子

  • 下载/保存

    将提取出的数据,按照用户所需的格式存储下来

    使用某种格式的文件或数据库来存储数据,将需要的图片或视频资源下载到特定的文件夹中,而爬得的新URL将放入待爬取队列中

3.2.1 使用Urllib实现基本web页面爬取

Anaconda集成开发工具,Anaconda是一个开源Python发行版本,其包含了180多个python包及其依赖

  • Urllib库

    • 第一模块Urllib.request

      用于打开和读取URL,处理简单或摘要类型的页面认证,页面重定向、以及cookies等访问web页面时的常见问题

    • 第二模块urllib.error

      request模块可能引发的异常

    • 第三模块urllib.parse

      解析URL

    • 第四模块urllib.robotparser

      解析robots.txt文件

3.2.3 初识urllib

urlopen(url, data=None, timeout=<object object at 0x000001956FE44900>, *, cafile=None, capath=None, cadefault=False, context=None)最常见的打开url的方法

URL可以是一个字符串或request对象

urlopen()函数总是返回一个对象,可以使用以下函数获取信息

  • geturl() 获取实际访问URL

  • info() 返回响应头部信息

  • getcode() 返回状态码

信息头出现b'表示是按字节组织的信息

r.coder.status都能获得http的响应码

r.headers获得响应对象的响应头参数

with是为了更好地打开和关闭文件类/io资源

1
2
with urllib.request.urlopen(request) as r:
print(r.read().decode('utf-8'))

3.3.1 使用Requests优化页面爬取过程

使用urllib库,可以实现:访问URL、传递参数、设置代理、进行身份认证等功能,但不够简洁,使用复杂

  • Requests库

    是一个用于处理URL的工具库,基于urllib库,但在应用时比urllib更加简洁

    主要特点:

    • 能够自动保持与网站的TCP连接
    • 能够内含带持久cookie的会话机制
    • 能够提供像浏览器类似的SSL认证
    • 能够自动完成内容解码
    • 能够支持文件分块上传和流式下载
    • 能够自动对下载图片、文件进行解压
    • 能够支持Unicode响应结果

    r.encoding = r.apparent_encoding通过自动变换实现编码转化

4.1 如何实现Web页面内容的解析

一般来说,网络爬虫需要解析的数据可以分为三类:

  • 无结构的文本数据,如txt纯文本
  • 半结构化的标记型数据,例如HTML网页、Json数据、Xml文档、Yaml数据
  • 结构化的数据,如关系数据库文件、Excel电子表格文件、Word文件等

python标准数据库接口为python db-api

4.2 解析文本数据

文本内容的解析

  • 正则表达式

    又称规则表达式,通常被用来检索、替换那些符合某个模式的文本

    image-20230802215038674

    image-20230802215106540

    python3中内置的正则表达式模块叫re模块,它包含正则表达式中的各个操作集

    1. 第一步:编译正则表达式

      使用compile()函数将正则表达式的字符串形式编译为一个Pattern对象

      1
      re.compile("正则表达式")
    2. 第二步:对目标字符串进行匹配

      通过Pattern对象提供的一系列方法对文本进行匹配查找,获得匹配结果(Match对象)

      pattern对象的相关方法

    3. 提取结果信息

      使用Match对象提供的属性和方法获得信息,还可根据需要进行其他的操作

      1
      2
      3
      4
      5
      6
      #match表示Match对象名
      match.group() #返回匹配对象
      match.group(0) #获取匹配结果,结果同上
      match.span() #获取匹配范围
      match.start() #匹配开始的位置
      match.end() #匹配结束位置

4.3 解析类XML数据

类xml文档即xml文档、html文档以及所有用标记组织的文本文件

  • 利用XPATH实现XML和HTML文本信息提取

    XPath解析

    XPath(XML Path Language)是一种在XML文档中查找信息的语言,可用来在类XML文档中对元素和属性进行遍历

    XPath通过路径表达式、谓词、通配符、逻辑运算符等语法实例实现信息查找

    • 使用路径表达式来选去XML文档中的节点或节点集

      image-20230804200114269

    • 常用Xpath路径

      image-20230804200409471

    • 谓语用来查找某个特定的节点或者而包含某个指定的值的节点。谓语被嵌在方括号中

      image-20230804201145574

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

      通配符 描述
      * 匹配任何元素节点
      @* 匹配任何属性节点
      node() 匹配任何类型的节点
    • 通过在路径表达式中使用 |运算符,可以选取若干个路径

      image-20230804201712106

    安装lxml

    1
    2
    # 打开anaconda prompt命令行
    输入 pip install lxml

    安装beautifulSoup

    1
    2
    # 打开anaconda prompt 命令行
    输入 pip install beautifulsoup4

    beautifulsoup中的对象

    • beautifulsoup对象:表示一个文档的全部内容,继承自tag、
    • 标签对象(tag对象),与类xml文档中的原生tag标签相对应,最重要的是name属性(标签名)
    • 可遍历的字符串对象(Navitable string),通常被包含在标签中,使用.string方法访问、
    • 注释对象,文档中的注释,特殊的navitable string对象
  • 类XML文档包括HTML、XML等标记语言文档

4.4 解析JSON数据

JSON数据:

  • 作为一种轻量级的数据交换格式,目前被广泛应用于web编程和数据交换
  • 是JavaScript中的对象和数组,通过这两种结构可以表示各种复杂的结构
  • 有关JSON的详细说明,可以参考JSON 简介

python中自建了JSON处理模块json

提供了四种方法,用于将JSON字符串或JSON文件与python对象进行相互转化

  1. json.dumps()将python类型转化为json字符串,返回一个str
  2. json.dump()将python内置类型序列化为json对象后写入文件
  3. json.loads()把json格式字符串解析为python对象,返回一个python对象
  4. json.load()读取文件中json形式的字符串元素,转化成python类型

JsonPath方法

JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,JsonPath对于JSON,相当于XPath对于XML

  • 数据库文件的解析

5.1 Web身份认证技术概述

应用现状(常见应用):

  1. HTTP基本认证(HTTP Basic Auth)
  2. OAuth(开放授权)
  3. Cookie/Session认证机制
  4. 基于Token的认证机制
  • HTTP Basic 认证

    是一种允许浏览器或其他客户端在请求时提供用户名和口令形式的身份凭证的一种登录验证方式,最常用的通过用户名和密码登录,通常用于内部网和局域网

    image-20230806152114788

  • OAuth(开放授权)

    一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源,而无需将用户名和密码提供给第三方应用,允许用户提供一个令牌,而非用户名和密码

    每一个令牌授权一个特定的网站,在特定的时间段访问特定的资源

    • OAuth2.0运行流程
      1. 客户端(client)向资源拥有者(Resource Owner)发送授权请求(Authorization Request)
      2. 资源拥有者授权许可(Authorization Grant)
      3. 客户端向验证服务器(Authorization Server)发送通过B获取的授权许可
      4. 验证服务器验证授权许可,通过的话,则返回Access Token给客户端
    • 认证和授权过程的三阶段
      1. 客户端(即某网站)和资源服务器之间的协商
      2. 用户和资源服务器之间的协商
      3. 网站和资源服务器存储的用户数据之间的协商
  • Cookie/Session认证机制

    • Cookie是由用户端保存的小型文本文件,其内容为一系列的键值对

      由HTTP服务器设置的,保存在浏览器中,Cookie会随着HTTP请求一起发送

    • Session是存储在服务器端的,避免在客户端Cookie中存储敏感数据

      可以存储在HTTP服务器的内存中,也可以存在内存数据库(如redis)中

    • 实质

      一次请求认证在服务器端创建一个Session对象,在客户端的浏览器创建一个Cookie对象

      通过客户端带上来的Cookie对象来与服务器端的Session对象匹配来实现状态管理

      关闭浏览器的时候,cookie会被删除,可以通过修改其expire time使cookie在一定时间内有效

  • 基于Token的认证机制

    无需长期保存用户名和密码,服务器端能主动让token失效,实用于Web应用和App

    • 使用流程

      1. 客户端使用用户名和密码请求登录
      2. 服务端收到请求,验证用户名与密码
      3. 验证成功,服务器签发一个token,将其发送给客户端
      4. 客户端收到token后进行存储,如cookie或Web storage
      5. 客户端每次向服务端请求资源,都需要带着token
      6. 服务器受到其你去,验证token,验证成功,返回请求的数据;失败返回对应的错误信息
    • 风险与问题

      image-20230806162033601

      image-20230806162112046

      对于XSS,处理数据时,应该escape and encode所有不信任的数据

      与CSRF相比,XSS更加容易防范和意识到,因此不建议将Token存在Cookie中

5.2 自动跨越HTTP Basic认证

典型认证过程

image-20230806163403539

请求头的具体形式

image-20230806163517328

记录一下请求通过

image-20230806165716959

5.3 自动跨越HTTP Digest认证

特点:

  1. 不以明文方式在网络上发送密码
  2. 可以防止恶意用户捕获并重放认证的握手过程
  3. 可以有选择地防止对报文内容的篡改

原理

image-20230806173107326

6.1 RIA网站数据爬取技术

RIA : Rich Internet Applications 富互联网应用程序

是一种特殊的Web应用程序,其用户界面比第一代和第二代Web应用程序具有更丰富的功能

通常使用JavaScript Flash Google Web Toolkit JavaFX Silverlight在浏览器中执行

目前,HTML5+JavaScript+CSS3+JavaScript Frameworks是构建RIA前端的主流技术

常见JavaScript框架:

JQuery AngularJS D3 Sencha EXT-JS SmartClient Dart

  • AJAX

    异步 Java Script 和XML,是一种用于创建快速动态网页的技术

    通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新

    工作原理

    image-20230807195836646

    image-20230807195917648

    image-20230807195951002

    服务器响应内容,可以通过XMLHttpRequest对象的responseTextresponseXML属性获取

    下例为读取非XML类型响应

    1
    2
    document.getElementById("myDiv").
    innerHTML = xmlhttp.responseText;

    如果响应内容以XML格式返回,则需要使用responseXML属性

    例如,解析服务器返回的docxXML文件

    image-20230807200700713

    当请求被发送到服务器时,需要执行一些基于响应的任务

    每当readyStage改变时,就会触发onreadystatechange事件

    readyStage属性存有XMLHttpRequest的状态信息

    XMLHttpRequest的重要属性

    image-20230807202455741

6.2 模拟人工操作爬取网站数据

通过操纵鼠标和键盘,模拟人使用浏览器来触发JavaScript Action,当页面数据被异步加载后,直接从页面内容中读取所需数据

  • Selenium

    image-20230807204429722

    image-20230807205129199

7.1 Scrapy爬虫框架基础

Scrapy是一个用于爬取网页、提取结构化数据的应用框架,可用于数据挖掘、信息处理或历史归档等多种应用系统

基本模块:

  • Scrapy Engine(引擎)

    负责SpiderItemPipelineDownloaderScheduler中间的通讯,信号、数据传递

  • Scheduler(调度器)

    负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎

  • Downloader(下载器)

    负责下载Scrapy Engine发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine,由引擎交给Spider来处理

  • Spider(爬虫)

    负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler

  • Item Pipeline(管道)

    负责处理Spider中获取到的Item,并进行后期处理(详细分析、过滤、存储等)

    以流水线方式对Spider解析后得到的结果(Item),用户可以定义一组操作顺序,包括:清理、检验、查重、存储到数据库等

  • Downloader Middlewares(下载中间件)

    一个可以自定义扩展下载功能的组件

  • Spider Middlewares(Spider 中间件)

    一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入SpiderResponses和从Spider出去的Requests

基本结构图:

image-20230808213508274

工作原理:

  • Scrapy有三条数据流路径

    1. 请求发起与调度

      image-20230808213631468

    2. 请求执行与响应

      image-20230808213707750

    3. 结果输出与新请求的产生

      image-20230808213756349

      入口是Spider,出口是Item Pipeline,核心Engine,策略由Scheduler制定

      需要用户编写:Scrapy、Item Pipeline

      已经实现,不需用户编写:Engine、Scheduler、Downloader

  • 中间件

    Download Midleware

    定义这些中间件来修改、丢弃和新增请求或响应

    Spider Middleware

    对请求和爬取项的再处理,可以修改、丢弃、增加请求和爬取项

7.2 组建Scrapy运行环境

conda不仅能管理包,还能构建python虚拟环境

在命令行输入conda create -n scrapyws scrapy,生成一个名字为scrapyws的虚拟环境,同时要求安装scrapy爬虫框架

image-20230808230407520

image-20230808230633815

激活刚建立的虚拟环境conda activate scrapyws

通过cd命令,进入安装anaconda的目录

...\Anaconda3\envs查看虚拟环境目录

cd scrapyws进入scrapyws

dir显示目录结构的命令

Scrapy框架的特点,在命令行进行操作

scrapy --help scrapy命令的usage

scrapy startproject tutorial 新建项目,tutorial为项目名

image-20230809141328404

scrapy.cfg只是一个配置文件,暂时不用管

image-20230809141543599

scrapy常用命令

item.py,是爬虫项目的数据容器文件,主要来定义我们所要获取的数据。

middlewares.py ,存放中间件,负责中间件定义

pipelines.py: 是爬虫项目的管道文件,主要用来对items里面定义的数据进行进一步的加工

**setting.py ** tutorial全局设置

init.py :是项目的初始化文件,包含项目的初始化信息

子目录spider,在其中编写爬虫程序

创建爬虫名为quotesspider的scrapy命令是(默认模板basic)

scrapy genspider quotesspider "http://quotes.toscrape.com/"

1
2
3
4
scrapy genspider -t 模板 爬虫名称 "网站域名"

例如
scrapy genspider -t basic a "baidu,com"

爬虫利器Scrapy之Crawl Spider 模板的使用

1
2
3
4
5
6
7
8
9
10
class QuotesspiderSpider(scrapy.Spider):
name = "quotesspider"
#定义一个列表,允许爬取的范围,利于目标集中
allowed_domains = ["quotes.toscrape.com"]
start_urls = ["http://quotes.toscrape.com/"]

def parse(self, response):
#占位符
pass

scrapy crawl quotesspider运行爬虫

scrapy提供一种交互式分析方法scrapy shell --help查看帮助

scrapy shell [url|file]

image-20230809162332580

会显示可以爬取的对象

在运行scrapy交互环境,对爬得页面进行分析时,使用xpath方法得到的元素对象为selector

image-20230809163215714

image-20230809163232810

extract()方法可以显示具体内容

scrpy crawl quotesspider -0 quotes.json将爬取内容存在文件中

8.1 分布式爬虫系统

使用Redis-scrapy模块,扩展scrapy爬虫框架,构建分布式网络爬虫的方法

分布式系统

image-20230810160822519

分布式爬虫系统是用于完成数据采集任务的分布式系统

  • 主从式分布式爬虫

    不同服务器承担不同的角色分工,其中有一台主服务器(URL服务器)专门负责待爬取URL的分发,其他服务器作为从服务器负责实际网页访问和资源下载

    主服务器还担负着从服务器的复杂均衡任务,确保各个从服务器的负荷大致相同

    image-20230810161204891

    URL服务器承担着很多管理任务,同时待抓取URL队列数量巨大,所以URL服务器容易成为整个系统的瓶颈

  • 对等式分布式爬虫

    服务器之间不存在分工差异,每台服务器承担相同的功能,各自负担一部分URL的抓取工作

    每台服务器基于算法分析URL属于自己还是需要传给其他服务器

    image-20230810161811761

  • 人们往往通过使用高性能的键值数据库、消息队列、非阻塞I/O调度来实现分布式爬虫系统的调用

8.2 Scrapy-Redis

image-20230810162134983

–> 使用高性能的键值数据库redis存储URL队列

Redis

一种key-value存储系统:用于缓存、事件发布或订阅、高速队列等场景

支持多种数据结构:列表(List)、集合(Set)、有序集合(Sorted Set)

使用数据库存放url,可以防止爬虫意外终断后的继续爬取

Redis-scrapy模块是基于Redis和scrapy的一个分布式爬虫支持系统

架构:

image-20230810162604752

  1. Redis-scrapy在原有scrapy架构的基础上,增加了Redis组件
  2. 取代Scrapy queue作为待爬取URL的请求队列,这一改变使多个scrapy spider能够同时获取同一个URL队列中的待爬取请求
  3. 为了从Redis中读取待爬取的请求,Redis-scrapy模块改变了原有scrapy中的schedular和spider,使其能够直接读取redis数据
  4. 增加了redis中的请求去重功能

安装Redis

在redis安装目录下打开命令行,运行 redis-server.exe redis.windows.conf即可获得监听端口

redis-cli.exe -h 127.0.0.1 -p 6379打开redis控制台

image-20230810173048004

安装scrapy-redis

打开anaconda prompt

conda create -n scrapyredisws

cd .conda\envs\scrapyredisws

conda activate scrapyredisws

conda install pip

pip install scrapy-redis

scrapy startproject tutorial

没写完(很多代码相关的内容在jupyter上面,挪动起来比较复杂繁琐,就……嘿嘿嘿偷个懒啦
笔芯