scrapy框架

crapy.png

绿色箭头是数据的流向,各个模块作用如下:

Spiders:爬虫,定义了爬取的逻辑和网页内容的解析规则,主要负责解析响应并生成结果和新的请求;
Engine:引擎,框架的核心,处理整个系统的数据流处理;
Scheduler:调度器,接受引擎发过来的请求,并将其加入队列中,在引擎再次请求时将请求提供给引擎;
Downloader:下载器,下载网页内容,并将下载内容返回给spider
ItemPipeline:项目管道,负责处理spider从网页中抽取的数据,主要负责清洗、验证和向数据库存储数据;
Downloader Middlewares:下载中间件,处于ScrapyRequestRequesponse之间的处理模块;
Spider Middlewaresspider中间件,位于引擎和spider之间的框架,主要处理spider输入的响应和输出的结果及新的请求;

scrapy框架的整体执行流程如下:

1、spideryeildrequest发送给engine
2、enginerequest不做任何处理发送给scheduler
3、scheduler生成request交给engine
4、engine拿到request,通过middleware发送给downloader
5、downloader获取到response之后,又经过middleware发送给engine
6、engine获取到response之后,返回给spiderspiderparse()方法对获取到的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

ScrapySpiderstart_urls属性中的每个url创建了Request对象,并将parse方法作为回调函数赋值给requests,而requests对象经过调度器的调度,执行生成response对象并送回给parse() 方法进行解析,所以请求链接的改变是靠回调函数实现的。

参考文章

pip升级后Import Error:cannot import name main解决方案
Scrapy官方文档
爬虫框架Scrapy的安装与基本使用
scrapy
scrapy使用
爬虫框架Scrapy个人总结(详细)熟悉
初窥Scrapy


txgcwm
764 声望71 粉丝

Linux C/C++


« 上一篇
python线程