scrapy介绍

42次阅读

共计 2431 个字符,预计需要花费 7 分钟才能阅读完成。

scrapy框架

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

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

正文完
 0