scrapy
框架
绿色箭头是数据的流向,各个模块作用如下:
Spiders
:爬虫,定义了爬取的逻辑和网页内容的解析规则,主要负责解析响应并生成结果和新的请求;Engine
:引擎,框架的核心,处理整个系统的数据流处理;Scheduler
:调度器,接受引擎发过来的请求,并将其加入队列中,在引擎再次请求时将请求提供给引擎;Downloader
:下载器,下载网页内容,并将下载内容返回给 spider
;ItemPipeline
:项目管道,负责处理spider
从网页中抽取的数据,主要负责清洗、验证和向数据库存储数据;Downloader Middlewares
:下载中间件,处于 Scrapy
的Request
和 Requesponse
之间的处理模块;Spider Middlewares
:spider
中间件,位于引擎和 spider
之间的框架,主要处理 spider
输入的响应和输出的结果及新的请求;
scrapy
框架的整体执行流程如下:
1、spider
的 yeild
将request
发送给 engine
;
2、engine
对request
不做任何处理发送给 scheduler
;
3、scheduler
生成 request
交给 engine
;
4、engine
拿到 request
,通过middleware
发送给 downloader
;
5、downloader
获取到 response
之后,又经过 middleware
发送给 engine
;
6、engine
获取到 response
之后,返回给 spider
,spider
的parse()
方法对获取到的 response
进行处理,解析出 items
或者 requests
;
7、将解析出来的items
或者 requests
发送给 engine
;
8、engine
获取到 items
或者 requests
,将items
发送给 ItemPipeline
,将requests
发送给scheduler
;
安装及常用命令
安装scrapy
$ sudo pip3 install scrapy
几条常用的命令:
创建项目:scrapy startproject xxx
创建爬虫:scrapy genspider xxx xxx.com
生成某种类型的文件:scrapy crawl xxx -o xxx.json
运行爬虫:scrapy crawl xxx
列出所有爬虫:scrapy list
获得配置信息:scrapy settings [options]
爬虫例子
创建项目:
$ scrapy startproject tutorial
项目目录功能如下:
scrapy.cfg
: 项目的配置文件 tutorial/
: 该项目的python
模块 tutorial/items.py
: 项目中的item
文件,这是创建容器的地方,爬取的信息分别放到不同容器里;tutorial/pipelines.py
: 项目中的 pipelines
文件;tutorial/middlewares.py
:定义 Downloader Middlewares
(下载器中间件) 和Spider Middlewares
(蜘蛛中间件)的实现;tutorial/settings.py
: 项目的设置文件;tutorial/spiders/
: 放置 spider
代码的目录;
容器的定义:
import scrapy
class MaoyanItem(scrapy.Item):
# 需要取哪些内容,就创建哪些容器
index = scrapy.Field()
title = scrapy.Field()
在 spiders
文件夹下创建一个 maoyan.py
文件,输入如下内容:
# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import MaoyanItem
class MaoyanSpider(scrapy.Spider):
# 爬虫的唯一标识,不能重复,启动爬虫的时候要用
name = "maoyan"
# 限定域名,只爬取该域名下的网页
allowed_domains = ["maoyan.com"]
# 开始爬取的链接
start_urls = ["https://maoyan.com/board/7/"]
def parse(self, response):
dl = response.css('.board-wrapper dd')
for dd in dl:
item = MaoyanItem()
item['index'] = dd.css('.board-index::text').extract_first()
item['title'] = dd.css('.name a::text').extract_first()
yield item
name
:项目的名字。allowed_domains
:允许爬取的域名,比如一些网站有相关链接,域名就和本网站不同,这些就会忽略。start_urls
:是 Spider
爬取的网站,定义初始的请求 url
,可以多个。parse
方法:是 Spider
的一个方法,在请求 start_url
后,对网页解析与提取自己想要的东西。parse
方法有两个作用:1、负责解析 start_url
下载的 Response
对象,根据 item
提取数据;2、如果有新的 url
则加入爬取队列,负责进一步处理。response
参数:是请求网页后返回的内容,也就是需要解析的网页。
启动爬虫:
$ scrapy crawl maoyan
Scrapy
为 Spider
的start_urls
属性中的每个 url
创建了 Request
对象,并将 parse
方法作为回调函数赋值给 requests
,而requests
对象经过调度器的调度,执行生成 response
对象并送回给 parse()
方法进行解析,所以请求链接的改变是靠回调函数实现的。
参考文章
pip 升级后 Import Error:cannot import name main 解决方案
Scrapy 官方文档
爬虫框架 Scrapy 的安装与基本使用
scrapy
scrapy 使用
爬虫框架 Scrapy 个人总结(详细)熟悉
初窥 Scrapy