livandata
数据EDTA创始人,没有之一
现担任数据EDTA个人公众号董事长兼CEO兼财务兼创作人
口号是:让大数据赋能每一个人。
前 言
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)爬虫是一门位于数据价值底层的技能,还是想劝一下大家不要过于沉迷爬虫,多利用技术探索数据本身的价值。