Scrapy是一个应用程序框架,用于抓取web站点和提取结构化数据,这些数据可以用于广泛的应用,如数据挖掘、信息处理。尽管Scrapy最初是为web抓取而设计的,但它也可以使用api(比如Amazon Associates的web服务)或作为一个通用的web爬虫程序来提取数据。
1 环境安装
最初Scrapy是不支持python3的,现在已经支持了,所以我们主要还是使用python3来实现。
1.1Ubuntu 14.04 或以上版本安装
主要注意相关依赖包其它linux版本基本相似(会玩linux,这个都是小菜一碟,不多讲解)
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
sudo apt-get install python3 python3-dev
pip install scrapy
1.2 windows上安装
windows上安装稍微复杂一点,首先要安装Anaconda,Anaconda下载地址:
百度网盘下载 密码:3kjd 官网下载地址
Anaconda安装很简单,就是下一步,下一步即可,安装完后一定要记得配置环境变量,不然也会出错,配置步骤如下:
按照箭头方向配置即可,注意Anaconda安装的路径要与你的安装路径对应。配置完成后直接cmd,后运行命令:
conda install scrapy
2 Scrapy使用
2.1 创建一个项目
在开始爬取之前,您必须创建一个新的Scrapy项目。 进入你打算存储代码的目录中,运行下列命令:
scrapy startproject tutorial
2.2 pycharm中调试scrapy代码
如果在pycharm中调试scrapy,需要安装scrapy,在安装scrapy之前还有几个依赖文件也要安装,如下:
- zope.interface
- pyOpenSSL
- twisted 我下载的版本地址 更多版本地址
- liblxml2dom
- lxml
twisted报错
这些包都可以用pycharm插件工具安装,但其中安装twisted时候会出现报错,报错内容大概如下:
building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
twisted报错解决办法如下:
下载twisted对应版本的whl文件(如我的Twisted‑17.5.0‑cp36‑cp36m‑win_amd64.whl)下载地址上文已经给出,cp后面是python版本,amd64代表64位,运行命令,注意Twisted文件的路径:
pip install Twisted-17.5.0-cp36-cp36m-win_amd64.whl
解决上面报错后在pip install scrapy就OK了。
pycharm无法直接调试scrapy
pycharm是无法直接调试scrapy的,需要我们在项目中做一些配置,配置如下图:
图一
图一中quotes_spider.py名称是你自己定义的,类中的name = "quotes"名称也是自定义的
图二
然后在scrapy.cfg的同级目录下创建一个main.py文件,内容如上图,这里要注意cmdline.execute("scrapy crawl quotes".split())中的quotes要与图一中的name=“quotes”是对应的。每次执行main.py就可以了。
quotes_spider.py代码如下:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
如上代码,我们的爬虫子类scrapy.Spider并定义了一些属性和方法:
name:标识爬虫。它必须在一个项目中是唯一的,不能为不同的爬虫设置相同的名称。
start_requests():必须返回一个可重复的请求(您可以返回一个请求列表,或者编写一个生成器函数),这将使爬虫开始爬行。后续请求将依次从这些初始请求中生成。
parse():将调用一个方法来处理每个请求所下载的响应。响应参数是保存页面内容的TextResponse的一个实例,并且有进一步的帮助方法来处理它。parse()方法通常解析响应,提取解析的数据,并找到新的url来跟踪和创建新的请求。
win32api报错
按照上面配置完成后,你会发现提示no module name win32api错误,这是因为没有安装win32的模块造成的
win32api报错解决办法
安装win32模块,安装有两种方式:
1.pycharm安装工具直接安装
2.下载win32包用pip install 包名 方式安装我下载的包 更多版本包
我这边pycharm直接安装是失败的,所以我用的第二种安装方式
pip install pywin32-222-cp36-cp36m-win_amd64.whl
3 开始scrapy
3.1 scrapy流程及总体架构
执行完main.py后,检查当前目录中的文件,你应该注意到已经创建了两个新文件:quotes-1.html和quotes-2.html,并且带有相应的url的内容。那通过scrapy是如何工作的呢?接下来我们讲一下scrapy的工作流程及总体架构。下图描述了scrapy的架构及它的组件是如何交互的:
从上图可以看出scrapy中的数据流由执行引擎控制,流程如下:
- 1.引擎(Engine)得到最初初始的请求,通过spiders去爬取;
- 2.引擎(Engine)在调度器(Scheduler)中调度请求,并寻找下一个请求去爬取;
- 3.调度程序(Scheduler)将下一个请求返回给引擎(Engine);
- 4.引擎(Engine)将请求发送给下载器(Downloader),通过下载器(Downloader)中间件(请参阅proce***equest());
- 5.一旦页面完成下载后,下载器(Downloader)会生成一个响应(使用该页面)并将其通过Downloader中间件发送到引擎;
- 6.引擎(Engine)接收来自下载器(Downloader)的响应,并将其发送给spiders进行处理,通过spiders中间件;
- 7.spiders处理响应并返回提取的items 和新请求返回到引擎,通过爬行器spider中间件;
- 8.引擎(Engine)将处理过的项目发送到项目管道(Item Pipelines),然后将处理过的请求发送到调度程序(Scheduler),并请求下一个可能要爬取的请求;
- 9.这个过程重复(从步骤1)直到不再有来自调度程序(Scheduler)的请求。
3.2 scrapy各组件功能
Scrapy引擎(Engine)
引擎负责控制系统的所有组件之间的数据流,当某些动作发生时触发事件
调度程序(Scheduler)
调度程序接收来自引擎的请求,并在引擎请求时对它们进行排队,以便在稍后(也对引擎)请求时提供它们
下载器(Downloader)
下载器负责获取web页面,并将它们提供给引擎,而引擎又将它们提供给spiders
Spiders
Spiders是类,它定义了一个特定的站点(或一组站点)如何被抓取,包括如何执行爬取(也就是跟踪链接)以及如何从它们的页面中提取结构化数据(例如抓取项目)。换句话说,Spiders是定义为特定站点爬行和解析页面的定制行为(或者,在某些情况下,是一组站点)的定制行为。
Item Pipeline
Item Pipeline负责处理由spiders提取出来的item,典型的处理有清理、 验证及持久化(例如存取到数据库中)。
下载器中间件(Downloader middlewares)
Downloader中间件是一种特定的钩子,它位于引擎和Downloader之间,当请求从引擎传递到Downloader时,以及从Downloader传递到引擎的响应。
Spider middlewares
Spider middlewares是位于引擎和spiders之间的特定钩子,能够处理spiders输入(响应)和输出(items和requests)。
事件驱动网络
scrapy是用Twisted编写的,它是一种流行的、用于Python的事件驱动的网络框架。因此,它是使用非阻塞(又称为异步)的并发性来实现的。
scrapy入门,这一篇就结束了,欢迎批评指正~!