【图文详解】scrapy安装与真的快速上手——爬取豆瓣9分榜单

写在开头

如今scrapy的安装教程都明显过期了,随便一搜都是要你安装一大堆的依赖,什么装python(若是别人连python都没装,为何要学scrapy….)wisted, zope interface,pywin32………如今scrapy的安装真的很简单的好很差!html

代码我放github上了,能够参考:
https://github.com/hk029/doubanbook
python

为何要用scrapy

我以前讲过了requests,也用它作了点东西,(【图文详解】python爬虫实战——5分钟作个图片自动下载器)感受它就挺好用的呀,那为何我还要用scrapy呢?git

由于:它!更!好!用!就这么简单,你只要知道这个就好了。github

我相信全部能找到这篇文章的人多多少少了解了scrapy,我再copy一下它的特色来没太多意义,由于我也不会在这篇文章内深刻提。就像你知道系统的sort函数确定比你本身编的快排好用就好了,若是须要知道为何它更好,你能够更深刻的去看代码,但这里,你只要知道这个爬虫框架别人就专门作这件事的,确定好用,你只要会用就行。sql

我但愿每一个来这里的人,或者每一个在找资料的朋友,都能明确本身的目的,我也尽可能将文章的标题取的更加的明确。若是这是一篇标题为《快速上手》的文章,那你可能就不要太抱但愿于能在这篇文章里找到有关scrapy架构和实现原理类的内容。若是是那样,我可能会取标题为《深刻理解scrapy》数据库

好了废话说了那么多,咱们就上手把?json

安装scrapy

一条命令解决全部问题vim

pip install scrapy

好吧,我认可若是用的是windows一条命令可能确实不够,由于还要装pywin32windows

https://sourceforge.net/projects/pywin32/files/pywin32/浏览器

如今sourceforge变的很慢,若是大家不能打开,我在网盘上也放一个64位的,最新220版本的:
连接: http://pan.baidu.com/s/1geUY6Dd 密码: z2ep

而后就结束了!!结束了!!好很差!就这么简单!

豆瓣读书9分书榜单爬取

咱们考虑下作一个什么爬虫呢?简单点,咱们作一个豆瓣读书9分书:
https://www.douban.com/doulist/1264675/

创建第一个scrapy工程

把scrapy命令的目录加入环境变量,而后输入一条命令

scrapy startproject doubanbook

 

 

而后你的目录下就有一个文件夹名为doubanbook目录,按照提示,咱们cd进目录,而后按提示输入,这里咱们爬虫取名为dbbook,网址就是上面的网址

 

 

打开pycharm,新建打开这个文件夹

关于pytharm的安装配置:Pycharm的配置和使用

 

 

打开后,咱们在最顶层的目录上新建一个python文件,取名为main,这是运行的主程序(其实就一行代码,运行爬虫)

 

 

输入

from scrapy import cmdline
cmdline.execute("scrapy crawl dbbook".split())

 

 

而后咱们进入spider-dbbook,而后把start_urls里面重复的部分删除(若是你一开始在命令行输入网址的时候,没输入http://www.那就不用改动)而后把allowed_domains注掉
而且,把parse里面改为

print response.body

 

 

好了,到此第一个爬虫的框架就搭完了,咱们运行一下代码。(注意这里选择main.py)

 

 

运行一下,发现没打印东西,看看,原来是403

 

说明爬虫被屏蔽了,这里要加一个请求头部,模拟浏览器登陆

在settings.py里加入以下内容就能够模拟浏览器了

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'

 

 

咱们再运行,发现网页内容已经被爬取下来了

 

好了,咱们的scrapy教程结束!

若是真这样结束,我知道你会打我。。

编写xpath提取标题名和做者名

这里咱们就要得分,标题名和做者名
观察网页源代码,用f12,咱们能够快速找到,这里不细讲怎么找信息的过程了,具体过程,参考上一个教程【图文详解】python爬虫实战——5分钟作个图片自动下载器

 

 

根据先大后小的原则,咱们先用bd doulist-subject,把每一个书找到,而后,循环对里面的信息进行提取

 

 

提取书大框架:

'//div[@class="bd doulist-subject"]'

提取题目:

'div[@class="title"]/a/text()'

提取得分:

'div[@class="rating"]/span[@class="rating_nums"]/text()'

提取做者:(这里用正则方便点)

'<div class="abstract">(.*?)<br'

编写代码

通过以前的学习,应该很容易写出下面的代码吧:做者那里用正则更方便提取

selector = scrapy.Selector(response)
        books = selector.xpath('//div[@class="bd doulist-subject"]')
        for each in books:
            title = each.xpath('div[@class="title"]/a/text()').extract()[0]
            rate = each.xpath('div[@class="rating"]/span[@class="rating_nums"]/text()').extract()[0]
            author = re.search('<div class="abstract">(.*?)<br',each.extract(),re.S).group(1)
            print '标题:' + title
            print '评分:' + rate
            print author
            print ''

关键这个代码在哪里编写呢?答案就是还记得大明湖……不对,是还记得刚才输出response的位置吗?就是那里,那里就是咱们要对数据处理的地方。咱们写好代码,这里注意:

  1. 不是用etree来提取了,改成scrapy.Selector了,这点改动相信难不倒聪明的你
  2. xpath若是要提取内容,须要在后面加上.extract(),略为不适应,可是习惯还好。

 

 

咱们看看结果,很差看,对于注重美观的咱们来讲,简直不能忍

 

 

加入两条代码:

title = title.replace(' ','').replace('\n','') author = author.replace(' ','').replace('\n','')

再看看结果,这才是咱们想要的嘛

 

好了,剩下的事情就是如何把结果写入文件或数据库了,这里我采用写入文件,由于若是是写入数据库,我又得花时间讲数据库的一些基本知识和操做,仍是放在之后再说吧。

items.py

好了,咱们终于要讲里面别的.py文件了,关于这个items.py,你只要考虑它就是一个存储数据的容器,能够考虑成一个结构体,你全部须要提取的信息都在这里面存着。

这里咱们须要存储3个变量,title,rate,author,因此我在里面加入三个变量,就这么简单:

title = scrapy.Field()
    rate = scrapy.Field()
    author = scrapy.Field()

 

 

pipelines.py

通常来讲,若是你要操做数据库什么的,须要在这里处理items,这里有个process_item的函数,你能够把items写入数据库,可是今天咱们用不到数据库,scrapy自带了一个很好的功能就是Feed exports,它支持多种格式的自动输出。因此咱们直接用这个就行了,pipelines维持不变

settings.py

Feed 输出须要2个环境变量:

FEED_FORMAT :指示输出格式,csv/xml/json/
FEED_URI : 指示输出位置,能够是本地,也能够是FTP服务器

FEED_URI = u'file:///G://douban.csv'
FEED_FORMAT = 'CSV'

FEED_URI改为本身的就好了

 

dbbook.py修改

其实也就加了3条命令,是把数据写入item

 

固然,你要使用item,须要把item类引入

from doubanbook.items import DoubanbookItem

下面的yield可让scrapy自动去处理item

好拉,再运行一下,能够看见G盘出现了一个douban.csv的文件

用excel打开看一下,怎么是乱码

 

不要紧又是编码的问题,用能够修改编码的编辑器好比sublime打开一下,

 

保存编码为utf-8包含bom,或者用gvim打开:set fileencoding=gbk

 

 

再打开,就正常了

 

 

爬取剩下页面

这还只保存了一个页面,那剩下的页面怎么办呢?难道要一个个复制网址??固然不是,咱们从新观察网页,能够发现有个后页的连接,里面包含着后一页的网页连接,咱们把它提取出来就好了。

 

由于只有这里会出现标签,因此用xpath轻松提取

'//span[@class="next"]/link/@href'

而后提取后 咱们scrapy的爬虫怎么处理呢?
答案仍是yield,

yield scrapy.http.Request(url,callback=self.parse)

这样爬虫就会自动执行url的命令了,处理方式仍是使用咱们的parse函数

改后的代码这样:

 

 

这里要加一个判断,由于在最后一页,“后一页”的连接就没了。

 

好了,咱们再运行一下(先把以前的csv删除,否则就直接在后面添加了)能够发现,运行的特别快,十几页一下就运行完了,若是你用requests本身编写的代码,能够比较一下,用scrapy快不少,并且是自动化程度高不少。

 

 

咱们打开csv,能够看见,有345篇文章了,和豆瓣上一致。

 

好了,这个豆瓣9分图书的爬虫结束了,相信经过这个例子,scrapy也差很少能上手,至少编写通常的爬虫是so easy了!

代码我放github上了,能够参考:
https://github.com/hk029/doubanbook

相关文章
相关标签/搜索