Scrapy是经典的爬虫框架;框架,顾名思义,可以让开发者免去“重复造轮子”的枯燥与重复,从而加快爬虫建设进度。
2017年12月19日:安装Scrapy包,建立一个新工程,需要在cmd窗口中输入
scrapy startproject project_name
project_name是工程的名字。之后,你就会发现,该工程已经存在于你所指定的某个文件夹中了。例如,在cmd输出scrapy startproject abcd
,那么在cmd运行的当前目录下,就会生成一个命名为abcd的文件夹。即为Scrapy工程文件。
此处,我输入scrapy startproject doubanbook
,会生成doubankook这个文件夹;此文件夹下方,有doubankook文件夹,以及scrapy.cfg这个文件,如下图所示(这个book文件是爬取的文件,不算0-0):
scrapy.cfg是总的控制文件,一般不用打开更改;但是这个文件也不能删去,否则,scrapy运行不了!!!
进入这个doubanbook文件夹,即下图所示,这几个文件也是执行startproject命令时候,框架自动生成的,每个文件都有有自己作用。spiders文件夹这个目录,用来防止我们自己写的py爬虫文件(这个py需要自己新建,不是自动生成的);init.py是自动生成的,不用理会,也不必修改;items.py用于定义我们想要获取的字段;pipelines.py用于定义我们的存储;settings.py用于设置各种爬取属性;middlewares.py是框架的中间件,不必修改,也不必理会0-0。
进入spiders文件夹,则如下图所示。同理,init.py是不用管。这就是Scrapy的基本框架。
learning by doing是掌握工程技术最快捷的方式。因此,建立了Scrapy之后,首先不必深入理解那么多原理,去开始爬取数据就行了!
在学习的过程中,遇到的第一个问题就是:网络上针对Scrapy的教程,很多都是Python2环境的,或者是Scrapy1.0以下的版本,这些教程太老旧,在最新的环境下,已经无法运行了。Scrapy官网还在用dmoz.org
这个网站做教程,但是这个网站已经停止运营了=-=真特么无语。
因此,在找实例的过程中,浪费了2天时间!!最后,还是在CSDN上看到了合适的例子。不得不佩服这个社区的更新速度和技术广度~
我参考的教程网址是:http://blog.csdn.net/a1091885194/article/details/78467595。win7+python3.6+Spyder环境下,实测可运行。
下面记录详细的实操步骤:
1、在cmd窗口中输入如下代码,新建scrapy工程
scrapy startproject project_name
2、打开items.py,内部代码如下
# items.py文件的作用是:定义要提取的数据
# Item是保存爬取到的数据的容器,任何定义的Item都要继承scrapy.item;
# 定义Item非常简单,只需要继承scrapy.Item类,并将所有字段都定义为scrapy.Field类型即可
# 在Item中要定义相应的字段,如name/price等需要爬取的信息,Field对象用于为每个字段指定任意元数据
import scrapy
class DoubanbookItem(scrapy.Item): # 继承scrapy.item父类
# define the fields for your item here like:
# name = scrapy.Field()
# pass
name = scrapy.Field() # 书名
price = scrapy.Field() # 价格
edition_year = scrapy.Field() # 出版年份
publisher = scrapy.Field() # 出版社
ratings = scrapy.Field() # 评分
author = scrapy.Field() # 作者
content = scrapy.Field() # 内容
3、新建爬虫文件, 命名为BookSpider.py;也可以在cmd中,用scrapy genspider doubanbook douban.com
来新建一个spider(这里,doubanbook是爬虫的name,douban.com是爬虫的爬取域)。内部代码如下:
# BookSpider.py的作用是:在单一网站或一群网站,编写爬取数据的类。
# 它包含了:一个用于下载的初始url;跟进网页链接、分析网页的内容;提取生成Item的方法
import scrapy
from doubanbook.items import DoubanbookItem
class BookSpider(scrapy.Spider):
# 定义spider的三个重要属性:名字name、爬取范围allowed_domains、爬取的第一个页面start_urls。这三个部分是规定、开发者不可更改的
name = 'doubanbook'
allowed_domains = ['douban.com']
start_urls = [
'https://book.douban.com/top250'
]
# parse的作用:
# 1、每个url下载后生成的response类会传递给parse函数;
# 2、用于解析response数据;
# 3、提取数据,生成item;
# 4、生成需要进一步处理的request对象
def parse(self, response): # 回调函数
# 请求第一页。self指类自身
yield scrapy.Request(response.url, callback=self.parse_next)#对第一个初始页面爬取内容,使用回调函数执行parse_next
# 请求其它页
for page in response.xpath('//div[@class="paginator"]/a'):
link = page.xpath('@href').extract()[0]#获取链接,用xpath解析网页,用extract函数获取数据
yield scrapy.Request(link, callback=self.parse_next)#去其他页面执行同样的操作,用yield构造一个生成器
def parse_next(self, response):
for item in response.xpath('//tr[@class="item"]'):
book = DoubanbookItem()
book['name'] = item.xpath('td[2]/div[1]/a/@title').extract()[0]
book['content'] = item.xpath('td[2]/p/text()').extract()[0]
book['ratings'] = item.xpath('td[2]/div[2]/span[2]/text()').extract()[0]
yield book
理解yield关键词,可以看这两篇文章:
https://www.jianshu.com/p/d09778f4e055;
http://blog.csdn.net/alvine008/article/details/43410079;
理解
4、打开pipelinse.py,代码如下:
# pipelines.py的作用如下:接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
# 1.清理HTML数据
# 2.验证爬取的数据(检查item包含某些字段)
# 3.查重(并丢弃)
# 4.将爬取结果保存到数据库中
class DoubanbookPipeline(object):
def process_item(self, item, spider):
info = item['content'].split(' / ') # [法] 圣埃克苏佩里 / 马振聘 / 人民文学出版社 / 2003-8 / 22.00元
item['name'] = item['name']
item['price'] = info[-1]
item['edition_year'] = info[-2]
item['publisher'] = info[-3]
return item
5、打开settings.py,代码如下:
BOT_NAME = 'doubanbook'
SPIDER_MODULES = ['doubanbook.spiders']
NEWSPIDER_MODULE = 'doubanbook.spiders'
ROBOTSTXT_OBEY = True
# 上面都是框架自动生成的,下面才是开发者自己写的
# 由于豆瓣存在反爬机制,因此需要在settings生成一个user_agent信息
from faker import Factory
f = Factory.create()
USER_AGENT = f.user_agent()
6、在写好了items.py、pipelines.py、新建爬虫.py、settings.py这四个文件之后,继续在cmd中,输入如下代码:scrapy crawl doubanbook -o book.csv
,即可执行这个scrapy项目。o的作用是,导出爬取的数据;然后将其导入到csv格式的文件当中,此格式文件可以用Excel打开。
是的,scarpy是无法在IDE中直接运行的,只能通过这种蛋疼的方式来新建工程、执行。最后,将数据存放在book.csv这个文件当中,而该文件保存在doubanbook这个项目最顶层的文件路径当中。
除此之外,还可以保存到MySQL中,但是这一招我还没学会0-0
这就是我第一个成功运行的Scrapy项目,爬取了豆瓣读书Top List250,保存在csv中。花费了3天才搞定!!