环境搭建
在开始搭建scrapy爬虫的开发环境之前,建议已经安装Anaconda这个python发行版本,这个可以让以后的开发过程中,安装其他的模块环境不至于出现一堆的错误。
假定你安装好了Anaconda,也配置好了相应的环境变量,这是你可以用以下的命令安装scrapy框架:
- 在终端执行下面这条命令
conda install Scrapy
下面是安装过程的截图,是不是很简单
2.通过python的包安装和管理工具pip来安装
pip install Scrapy
这样,scrapy就安装完成了, 不管通过哪种方式,是不是都很简单!当然此处推荐使用第一种安装方式,什么??你就要用第二种,ok,ok,你用好了,体验一把安装python模块库错综复杂,藕断丝连,欲罢不能,让人蛋疼依赖关系(有多疼??疼到你怀疑你有一颗假的蛋,没错,一颗),也是一种人生的历练!!
环境安装好了以后,下面就可以开始我们想入非非,性奋不已的scrapy基础之路了。
作为流程,下面请允许我从scrapy的官网借(程序员的事情不叫偷的)一些话来凑个字数
项目创建
在开始爬取之前,您必须创建一个新的Scrapy项目(废话,请忽略)
怎么创建项目??对,没错,就是这样,打开终端:
注意注意 项目取名字的时候,不要像我的这个取得这么见名知意,万一你的领导或同事没有八年开发经验和汉语八级,你可能会被打的
项目创建完成,可以看到下面的项目目录
下面该写爬虫了??no!!在开始写爬虫之前还是来了解一下scrapy的工作流程!
没错我又从网上偷来的这张图
??图看不太懂?我艹,我就知道有人跟我一样,没关系,来来来,看看别人通俗形象的解释:
引擎:Hi!Spider, 你要处理哪一个网站?
Spiders:我要处理xxoo.com
引擎:你把第一个需要的处理的URL给我吧。
Spiders:给你第一个URL是XXXXXXX.com
引擎:Hi!调度器,我这有request你帮我排序入队一下。
调度器:好的,正在处理你等一下。
引擎:Hi!调度器,把你处理好的request给我,
调度器:给你,这是我处理好的request
引擎:Hi!下载器,你按照下载中间件的设置帮我下载一下这个request
下载器:好的!给你,这是下载好的东西。(如果失败:不好意思,这个request下载失败,然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载。)
引擎:Hi!Spiders,这是下载好的东西,并且已经按照Spider中间件处理过了,你处理一下(注意!这儿responses默认是交给def parse这个函数处理的)
Spiders:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,这是我需要跟进的URL,将它的responses交给函数 def xxxx(self, responses)处理。还有这是我获取到的Item。
引擎:Hi !Item Pipeline 我这儿有个item你帮我处理一下!调度器!这是我需要的URL你帮我处理下。然后从第四步开始循环,直到获取到你需要的信息,
注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy会重新下载。)
以上就是Scrapy整个流程了。
注: 以上引用自博客http://cuiqingcai.com/3472.html
以上完成了对scrapy的工作流程的理解,下面开始进入正题,开始我们的小爬虫,用于scrapy官网给出的例子中的domz网站已经永久关闭,所以下面的例子,我们以http://quotes.toscrape.com/tag/humor/这个网站为例。
Item编写
观察网页的结构后,确定一下需要爬取的页面和想要爬取的内容字段,比如,你要要爬取番号,封面,还是种子呢?别激动,我们在这里只爬取上面的网站每个条目的标题,链接,作者和标签四个字段,
确定要爬取的字段以后,就可以开始爬虫的编写,在==items.py==文件中加入我们要爬取的字段,如下图所示:
爬虫文件编写
确定以及定义好了我们需要提取的字段,下面就该开始爬虫的编写了,在spiders文件夹下新建自己的爬虫文件:
对于这个文件里的几行代码,这里只简单的解释一下,详细的介绍以后再说,毕竟这里只是入门嘛!
开始我们导入scrapy模块(这行还看不懂的话)。。。。
除了这个模块,我们还需要导入之前编写的item文件。之后是定义了一个spider类,该类继承自scrapy.Spider,下面的name = 'PachongSpider'是爬虫的名字,这个名字是唯一的,因为在完成代码后运行爬虫要用到这个名字,start_urls 列表里存放要爬取的链接地址,scrapy会自动从这个列表取出地址进行爬取,并将返回的response作为参数传递给self.parse,在self.parse里就可以从response解析出需要的数据字段(即item里定义的字段)。
关于数据的解析,scrapy提供了多种方式,xpath,css,re,都是可以的,这里先来试试xpath,如果对xpath不是很熟悉,可以先看一下http://www.w3school.com.cn/xpath/index.asp,看了,还不会用???多试几遍就会了,或者也可以借助强大的chrome浏览器
爬虫的编写如下:
#coding:utf-8
import scrapy
from pachong.items import PachongItem
class QuotesSpider(scrapy.Spider):
name = 'pachong'
start_urls = [
'http://quotes.toscrape.com/tag/humor/',
]
def parse(self, response):
base_url = 'http://quotes.toscrape.com'
item = PachongItem()
divs = response.xpath('//div[@class="quote"]')
for div in divs:
item['name'] = div.xpath('span[@class="text"]/text()').extract()[0]
item['url'] = base_url+div.xpath('span/a/@href').extract()[0]
item['tags'] = div.xpath('div[@class="tags"]/a/text()').extract()
item['author'] = div.xpath('span/small[@class="author"]/text()').extract()[0]
print(item)
yield item
数据持久化
最后我们将爬取的数据持久化到本地,可以存储在文件中,csv,json,当然也可以是数据库,这里采用mongodb来存储(关于python使用mongodb,请自行百度),如同文章开始介绍的,数据持久化需要在pipelines.py文件中进行,
一下开始编写pipelines.py文件
import pymongo
class PachongPipeline(object):
def __init__(self):
self.client = pymongo.MongoClient('localhost', 27017)
self.pchdb = self.client['pchdb']
self.pchtab = self.pchdb['pchtab']
def process_item(self, item, spider):
self.pchtab.insert_one(dict(item))
return item
首先导入mongodb的python依赖模块,在pipelines.py初始化方法中,连接到mongodb数据库,在process_item方法中向数据库插入数据。这个文件编写完成,需要在settings.py文件中配置该管道
ITEM_PIPELINES = {
'pachong.pipelines.PachongPipeline': 1,
}
如果运行了程序,数据库没有数据,可能是没有在settings里配置ITEM_PIPELINES。
下面就是运行脚本了,打开终端,进入到爬虫的根目录(到达根目录,scrapy list命令查看爬虫的列表就是前面所说的spider里面的name对应的值),然后输入scrapy crawl pachong,脚本运行完成可以在数据库看到爬取到的数据了
最后说一下,每次都要打开终端输入命令来运行脚本多少有些不便,可以在项目的根目录下新建一个python文件输入下面的代码:
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'pachong'])
execute方法的的参数list中的三个元素是不是很熟悉,没错,就是前面在终端输入过的命令,第三个元素是根据你爬虫的“name”来定的
至此一个简单的爬虫就完成了,至于怎么爬取有分页的网页,怎么设置代理,应对反爬,以及怎么爬取js动态加载的页面,将会在后面的博客中讲到。
最后是代码地址:https://github.com/lexyhp/pachong