因为公司项目需求,需要做一个爬虫。所以我一个python小白就被拉去做了爬虫。花了两周时间,拼拼凑凑总算赶出来了。所以写个blog做个记录。
快速入门
首先,初步要做的就是快速构建一个爬虫。
配置环境
Mac下安装
1) 直接从官网下载
python下载官网
2) 是通过brew安装
首先安装xcode
可以选择在App Store安装或者使用xcode-select --install
这个命令安装
接着安装brew
usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
把这个命令输入终端运行就可以安装了
brew官网
接着利用brew安装python3brew install python3
安装完python3以后,我们来装scrapy。因为python3是自带pip3的,
所以如果找不到该命令的话,可以去看看python3的安装路径。brew是将其安装在了\usr\local\bin
这个目录下。
如果pip没安装上的话,不要慌。我们还可以通过命令来安装
curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
接下来安装scrapy
输入命令pip3 install Scrapy
就可以了
windows下安装
首先从官网上下载msi文件
在安装选项中勾选上需要pip
然后在cmd中输入pip3 install Scrapy
完成
Linux安装
sudo get-apt install python36 python36-devel gcc
sudo pip3 install Scrapy
两条命令就搞定了。
因为我的爬虫是跑在docker上,有些镜像可能没有gcc。所以需要devel和gcc,否则有些包会安不上。切记
Redhat系的话,只需要把get-apt
改成yum
就可以了
快速开始
- 建立项目
scrapy startproject demo
- 建立爬虫
scrapy genspider demo_spider www.google.com
- 启动爬虫
scrapy crwal demo_spider
当你建立完项目的时候,scrapy会帮你生成一堆文件。
目录结构是这样的
在你的demo项目中,会有个scrapy.cfg
的配置文件和一个demo
的文件夹
scrapy.cfg
这个文件我们先暂时不去关心。我们来关心一下demo
文件夹下的东西
分别是items.py
,middlewares.py
,pipelines.py
,settings.py
和一个spiders
文件夹。
接着我们去spiders
目录下去创建一个爬虫scrapy genspider demo_spider www.google.com
OK,爬虫生成功了。
spider初步解析
我们来初步解析一下这个爬虫。
有一个DemoSpiderSpider
的类。很明显,这个是我们刚才生成爬虫的名字为demo_spider然后后面又添加了一个Spider。
接着往下看,有个name的属性,这个属性很重要,我们到时候启动爬虫的时候,就要通过这个name来告知scarpy
启动的是哪个爬虫
allowed_demains
是用来指定,我们只爬取哪些域名下的。比如说,我在爬取google的搜索结果的时候,会爬到很多别的网站,这个属性就是用来告知,除了www.google.com
以外的,我都不爬取。
start_urls
是用来做启动url,看命名就知道了。可以把Scrapy的爬取过程看成一个广度搜索。所以它会先迅速把start_urls
下的所有url
都爬取一遍。然后把结果加入到一个队列中。也是因为这个原因,所以在做并发爬虫时,会让不同的爬虫的start_urls
不一样。当然还有重复的问题要解决(笑)
接下来就是parse
方法了,我们对页面的爬取也是在这个parse
中解决
向外走
初步理解了spider
,我们往外层走。
我们首先来假想几个问题,如果我是Scrapy框架的设计者,我会这么设计这个框架。
既然是通用的爬虫框架,那用户是不是应该可以操作header之类的,让我的每一个爬虫都经过代理,或者是设置不同的cookie。
当当当,所以就有了中间件。middlewares.py
我们来看看Scrapy
生成的是什么样的。
既然是入门,我们肯定是先关心我们需要的。看第二张图。有这么几个干方法process_request
,process_response
,process_exception
处理request
,response
,exception
。很好,我们就要这几个东西。
我们可以这么理解,我们的爬虫爬到的每一个页面,都会经过这些中间件。
来看看架构图
所以我们的数据是经过每一个中间件。然后中间件来决定去留。
然后我们来想想具体process_request
下的情况。
- 第一种,我修改了代理,但是我只是改了代理,我还需要把这个数据继续下去。返回
None
- 第二种,这个已经处理好了,现在我需要想直接把数据发给
spider
了,这个时候,我们就需要返回一个response
了。 - 第三种,我想要重新调度我的
request
.这时候只要返回request
。调度器会终止process_request
,然后用这个request
重新开始。 - 第四种,这个数据我直接丢弃了,不想用了。直接
raise
一个IgnoreRequest
,也就是,如果你不处理这个异常,这异常就直接扔了。当然,你还可以选择在process_exception
去处理这个异常
Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法
初步理解了中间件,我们来说说items
在spider
处理完数据以后,写入item中,然后就来到了这儿。scrapy
生成的代码
怎么用呢。举个例子,我在spider中需要存储url。于是我在这个文件中就写入url = scrapy.Field
接着在spider
中生成这个item
。然后将item['url'] = url
,在处理完了以后。yield item
完成
这个数据呢,就会交给pipelines
来处理
接着,我们来看看pipelines
我们和刚才一样,思考一下,数据拿过来有几种可能。
- 数据不是我的,我不处理。OK,我直接返回itme
- 数据是我的,但是数据错了。扔掉。
raise
一个DropItem
就可以了
这边呢,如果要写入数据库,玩玩写入的时间特别长,所以推荐使用Twisted
来做一个异步写入
最后。我们来看看settings
配置文件,比如是否遵守robots.txt之类的。当然,你刚才写的所有middlewares
,pipelines
。都要在这儿注册!!!!随便给它一个不重复的数字就好了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。