Python网络爬虫-5

认识Scrapy框架

  • Scrapy概述
  • Scrapy框架安装流程
  • Scrapy项目架构
  • Scrapy常见指令
  • Scrapy项目创建(PyCharm)
# Scrapy概述
'''
开发Python爬虫方式很多,从程序的复杂程度角度说,可分为:爬虫项目和爬虫文件
Python的urllib模块一般用于写爬虫文件,大型项目为了提高开发效率一般用Scrapy框架。
'''
# Scrapy框架安装流程

参考文章:
Mac环境下使用pycharm成功安装Scrapy爬虫框架

# Scrapy项目架构

项目框架结构图:
———— mySpider
     |
     |———— mySpider/   #项目的Python模块(核心目录),将会从这里引用代码
     |     |———— __init__.py    #初始化文件
     |     |———— items.py       #定义项目的爬取目标文件
     |     |———— middlewares.py #中间件,用于扩展Scrapy功能
     |     |———— pipelines.py   #项目的管道文件,其中可创建多个管道类
     |     |———— settings.py    #项目的设置文件
     |     |———— spiders/       #存储爬虫文件的目录
     |           |   
     |           |———— __init__.py   #初始化文件
     |           |———— myspider.py   #爬虫,建项目时不建爬虫文件文件,需自己创建
     |           |———— ...
     |
     |———— scrapy.cfg   #项目配置文件,无需修改

在这里插入图片描述

项目框架结构图如上:
1)scrapy.cfg 框架的基本设置
2)settings.py 用户的相关全局设置
3)spiders 用户自己实现的spider文件夹,主要放我们的爬虫文件
4)items.py 数据条目,里边写要保留的字段 就是爬到的那些数据要存 
5)pipelines 管道,主要用文件储存
6)middlewares.py 中间件,用于扩展Scrapy功能

项目一次执行流程:
items.py(获取保留字段)->spiders爬虫文件(具体逻辑实现)->middlewares.py(代理反扒)->目标网址(目标资源)->pipelines.py(存储文件)

在这里插入图片描述
组件说明:

  • Spiders(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)
  • Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
  • Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理
  • ItemPipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
  • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间
  • 通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

框架执行顺序:

  1. SPIDERS的yeild将request发送给ENGIN
  2. ENGINE对request不做任何处理发送给SCHEDULER
  3. SCHEDULER( url调度器),生成request交给ENGIN
  4. ENGINE拿到request,通过MIDDLEWARE进行层层过滤发送给DOWNLOADER
  5. DOWNLOADER在网上获取到response数据之后,又经过MIDDLEWARE进行层层过滤发送给ENGIN
  6. ENGINE获取到response数据之后,返回给SPIDERS,SPIDERS的parse()方法对获取到的response数据进行处理,解析出items或者requests
  7. 将解析出来的items或者requests发送给ENGIN
  8. ENGIN获取到items或者requests,将items发送给ITEMPIPELINES,将requests发送给SCHEDULER

另一种数据流执行过程方式说明:

  1. 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
  2. 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
  3. 引擎向调度器请求下一个要爬取的URL。
  4. 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
  5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
  6. 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
  7. Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
  8. 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
  9. (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

注意:只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy也会重新下载。)

白话版

1.引擎:Hi!Spider, 你要处理哪一个网站?

2.Spider:老大要我处理xxxx.com。

3.引擎:你把第一个需要处理的URL给我吧。

4.Spider:给你,第一个URL是xxxxxxx.com。

5.引擎:Hi!调度器,我这有request请求你帮我排序入队一下。

6.调度器:好的,正在处理你等一下。

7.引擎:Hi!调度器,把你处理好的request请求给我。

8.调度器:给你,这是我处理好的request

9.引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求

10.下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)

11.引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)

12.Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。

13.引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。 
14.管道&调度器:好的,现在就做!

参考文章:
PyCharm创建scrapy项目
Scrapy框架流程图解析
Scrapy架构图(工作原理)

# Scrapy常见指令
'''
这里的命令分为全局的命令和项目的命令,全局的命令表示可以在任何地方使用,而项目的命令只能在项目目录下使用

全局的命令有:
startproject
genspider
settings
runspider
shell
fetch
view
version

项目命令有:
crawl
check
list
edit
parse
bench
'''

在这里插入图片描述

# 创建一个新项目
scrapy startproject myprojec

# 在新项目中创建一个新的spider文件
scrapy genspider mydomain mydomain.com
注意:mydomain为spider文件名,mydomain.com为爬取网站域名(对于http://www.baidu.com说明:http:协议名,www:主机名,网站名举例:baidu.com)

# 运行spider项目中的爬虫
scrapy crawl spidername
# 运行独立的爬虫文件(不在spiders文件中,而是与核心目录并列的爬虫文件)
scrapy runspider spidername

# 检查代码是否有错误
scrapy check 

# 列出项目里面所有spider文件名称
scrapy list

# scrapy fetch url地址 
该命令会通过scrapy downloader 讲网页的源代码下载下来并显示出来
常用参数:
--nolog 不打印日志
--headers 打印响应头信息
--no-redirect 不做跳转
# fetch 将网页内容下载下来,然后在终端打印当前返回的内容,相当于 request 和 urllib 方法:
scrapy fetch http://www.baidu.com
# fetch --nolog 只输出源代码
scrapy fetch --nolog http://www.baidu.com
# fetch --nolog --headers 输出响应头
scrapy fetch --nolog --headers http://www.baidu.com
# --nolog --no--redirect 禁止重定向
scrapy fetch --nolog --no--redirect http://www.baidu.com

# 网页document内容下载下来,并且在浏览器显示出来
scrapy view http://www.taobao.com
注意:因为现在很多网站的数据都是通过ajax请求来加载的,这个时候直接通过requests请求是无法获取我们想要的数据,所以这个view命令可以帮助我们很好的判断

# 运行spider:
scrapy runspider spider_file.py

# 查看机器对于爬虫的性能
scrapy bench

# 使用爬虫文件获取某个网址数据
scrapy parse --spider=爬虫文件名 网址
scrapy parse --spider=

在这里插入图片描述
在这里插入图片描述

参考文章:
Scrapy框架的命令行详解【转】
scrapy 命令行基本用法

# Scrapy项目创建(PyCharm)

# 创建爬虫
scrapy genspider test "lab.scrapyd.cn"
# genspider:表示创建一个爬虫,默认为scrapy.Spider类
# test:表示爬虫名,与爬虫代码里的name参数一致
# "lab.scrapyd.cn":表示允许爬虫爬取的域范围

# 爬虫文件
# -*- coding: utf-8 -*-
import scrapy

class TestSpider(scrapy.Spider):
    name = 'test' #爬虫的名字
    allowed_domains = ['lab.scrapyd.cn'] #爬虫的域名
    start_urls = ['http://lab.scrapyd.cn/'] #爬虫的初始url入口

    def parse(self, response): #默认的回调处理函数
        #passs
        print("========1=1=1=1========")
        print(response) # http://lab.scrapyd.cn/
        print("=======2=2=2=2==========")
        data = response.body
        print(data)
        print("========3=3=3=3=========")


# 执行爬虫
scrapy crawl test
# crawl:表示启动一个scrapy爬虫
# test:表示爬虫名

参考文章:
scrapy爬虫框架简单实例
Python爬虫(二):制作一个简单的scrapy爬虫项目

发布了42 篇原创文章 · 获赞 0 · 访问量 1858

猜你喜欢

转载自blog.csdn.net/qq_44750620/article/details/105013346