python爬虫架构之scrapy重现江湖

2019-11-05 15:18:53 浏览数 (1)

livandata

数据EDTA创始人,没有之一

现担任数据EDTA个人公众号董事长兼CEO兼财务兼创作人

口号是:让大数据赋能每一个人。

前 言

自从上次出了两篇爬虫的文章后,很多人私信我说爬虫技术还是比较系统的,如果只用上文的一些技能很难爬取大规模的网站,是否会有一些架构之类的东东,java都有spring,为什么爬虫就没有,别着急,爬虫也是有的,只是我们平时没有深入探索,下面我们就了解一下爬虫的常规架构——scrapy。

scrapy是一个python爬虫架构,非常适合做一些大型爬虫项目,并且开发者利用这个架构,可以用不关注一些细节问题,现在爬虫的架构还是很多的,作为元老级别的scrapy依然是一个受到多方关注的技术。

scrapy的安装是一个比较繁琐的过程,大家可以百度一下最新的安装手册,此处笔者将当时用的一个安装方式跟大家分享一下,有问题不要喷我,主要是电脑已经安装过一次了,再搞一次怕环境卸载不干净,好在百度非常强大,足够解决安装问题:

在操作完上面的步骤后,再在 cmd 中输入:

scrapy startproject my_crawler

一个全新的scrapy框架即可创建成功。

是不是很简单?

此处你也可以体会python的优势,其他语言是很难想象会有如此效率的。

了解过django的大佬们估计也会有同样的感慨,太方便了~

我们先创建一个普通的爬虫

创建项目的命令为:

代码语言:javascript复制
Scrapy genspider -t basic qsbk qiushibaike.com

项目创建完成后,我们会在指定的文件夹下看到一个全新的项目:

我们该怎么使用scrapy呢?

最直接的方式就是上代码,下面请欣赏案例《糗事百科》的爬取:

1)test文件:

代码语言:javascript复制
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import scrapy
from my_crawler.items import MyCrawlerItem
from scrapy.http import Request
class TestSpider(scrapy.Spider):
    name = "test"
    allowed_domains = ["qiushibaike.com"]
    # start_urls = ['http://qiushibaike.com/']
    #对 request 内容进行设置
    def start_requests(self):
        ua = {"User_Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64;rv:53.0) Gecko/20100101 Firefox/53.0"}
        yield Request('http://www.qiushibaike.com/', headers=ua)
    def parse(self, response):
        it = MyCrawlerItem()
        it["content"]=response.xpath("//div[@class='content']/span/text()").extract()
        it["link"] = response.xpath("//a[@class='contentHerf']").extract()
        yield it
代码语言:javascript复制

2)item文件:

代码语言:javascript复制
import scrapy
class MyCrawlerItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

3)pipeline文件:

代码语言:javascript复制
class MyCrawlerPipeline(object):
    def process_item(self, item, spider):
        for i in range(0, len(item["content"])):
            print(item["content"][i])
            print(item["link"][i])
        return item

面对这个项目,不知大家有没有什么启发呢?

scrapy中存在较多的文件,这些文件之间有固定的执行顺序,而且文件之间会相互调用,清晰了这一点,我们就可以看scrapy的原理了。

scrapy原理

先上一个图吧:

这个图是被广为流传的图,成为学习scrapy的基本架构图,我们可以做一些简单的介绍:

(1)、调度器(Scheduler):

调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是 什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。

(2)、下载器(Downloader):

下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主 要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。

(3)、 爬虫(Spider):

爬虫,是用户最关心的部分。用户定制自己的爬虫,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。

(4)、 实体管道(Item Pipeline):

实体管道,用于处理爬虫提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。

(5)、Scrapy引擎(Scrapy Engine):

Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。

那么,scrapy运行的主要流程呢:

1) 首先爬虫将需要发送请求的url(requests)经引擎交给调度器;

2) 排序处理后,经ScrapyEngine

DownloaderMiddlewares(有User_Agent, Proxy代理)交给Downloader;

3) Downloader向互联网发送请求,并接收下载响应.将响应经ScrapyEngine,可选交给Spiders;

4) Spiders处理response,提取数据并将数据经ScrapyEngine交给ItemPipeline保存;

5) 提取url重新经ScrapyEngine交给Scheduler进行下一个循环。直到无Url请求程序停止结束。

scrapy 的常用命令

Scrapy 框架中有两个命令:

其一:为全局命令:

Fetch 命令:

功能是爬一个网页,主要参数为:-h;--nolog;

代码语言:javascript复制
1)Scrapy fetch http://www.baidu.com :
爬取一个网页,包含爬取的过程。
2)Scrapy fetch https://www.baidu.com -–nolog 
3)Runspider可以不依托 scrapy 项目独立运行爬虫文件。
Scrapy runspider test.py:
运行单独的一个不依托项目的爬虫文件。
4)Scrapy shell http://www.baidu.com –nolog : 
爬取百度,并进入 shell 的交互终端。

其二为项目命令:

进入到项目中:Scrapy Bench:测试本地硬件的性能。

代码语言:javascript复制
1)Scrapy -t basic weisun baidu.com 
-l:用来展示当前项目中有多少爬虫模板;
-t:创建一个爬虫项目;
Basic:创建基础模板, 
2)Scrapy check weisun
检查这个爬虫 weisun 是否可以运行;
3)Scrapy crawl weisun
运行 weisun 爬虫。
4)Scrapy list
展示当前目录下可以使用的爬虫文件。
5)Scrapy edit weisun
在 Linux 下修改 weisun 爬虫。

后续杂言

scrapy的架构还是很精深的,几乎涵盖了爬虫的所有内容,本文只做一个简单的介绍,有兴趣的同学,可以找到scrapy的官方文档,做深入了解

近期关于爬虫的新闻挺多的,笔者借这篇文章也表达一下自己对爬虫的看法,希望大家不喜勿喷:

1)爬虫是门技术,只是用来收集公开的数据,就像是之前商店里陈列的商品价格,爬虫只是替代了大家线下拿着笔去抄录的过程,对于网站上没有展示的内容或者网站名言说是不能获取的内容,爬虫是不能获取的,这是学习技术的一个基本线的问题。

2)爬虫是一门位于数据价值底层的技能,还是想劝一下大家不要过于沉迷爬虫,多利用技术探索数据本身的价值。

0 人点赞