前言
上回讲到如何安装scrapy(作为参考),本回将参照文档编写一个爬取豆瓣评分在8.9以上的军事类图书。
新建项目
打开Anaconda Prompt-->定位到新建的项目目录(上回讲到的scrapytest)-->通过命令venv\Scripts\activate
激活虚拟环境-->通过scrapy startproject doubanbook
命令创建scrapy项目
创建成功后,按照提示-->cd doubanbook
-->scrapy gensiper dbbook https://book.douban.com/tag/军事
说明:dbbook是生成爬虫的名字,https://book.douban.com/tag/军事为豆瓣读书军事类url,该url作为爬虫的起始url。
成功后,查看spiders目录下,多了dbbook.py文件,打开查看类似如下
至此,scrapy项目就创建成功啦!
代码编写
打开dbbook.py(我用的Notepad++)-->修改parse方法-->保存
def parse(self, response):
#respone是TextResponse的实例,而TextResponse又是Response的子类,相关说明请查看https://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.TextResponse和https://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Response
print("++++++++响应的url是:",response.url)
在命令提示中继续输入scrapy crawl dbbook
运行爬虫
但是!没有发现打印出来关于"++++++++响应的url是"的东西,却是什么403之类的
打开doubanbook目录下的settings.py-->找到USER_AGENT
,修改为USER_AGENT = 'doubanbook (+https://www.douban.com/)'
在命令提示符中重新输入scrapy crawl dbbook
可成功运行爬虫
接下来就可以安心编写解析程序了,修改parse方法,因为该方法是爬虫接受相应后默认的回调方法
在文档教程中,用css()
解析response,因为之前未接触过xpath,所以打算用xpath()
实现解析
tips:其实css()
和xpath()
是TextResponse.selector.css(query)
和TextResponse.selector.xpath(query)
的简写形式
def parse(self, response):
# print("+++++++++响应的url是:",response.url)
#每本书的列表
booklist = response.xpath('//li[@class="subject-item"]')
#遍历每本书
for book in booklist:
#书的图片地址
imgsrc = book.xpath('div[@class="pic"]//img/@src').extract()[0]
#书的其他信息
info = book.xpath('div[@class="info"]')
#书名
title = info.xpath('h2/a/text()').extract()[0].replace('\n','').replace(' ','')
#作者
author = info.xpath('div[@class="pub"]/text()').extract()[0].split('/')[0].replace('\n','').replace(' ','')
#评分
#有些评论数较少的书籍,可能没有评分
rate = info.xpath('div[@class="star clearfix"]/span[@class="rating_nums"]/text()').extract_first()
if rate is not None:
rate = float(rate)
if(rate >= 8.9):
yield{
'title':title,
'author':author,
'rate':rate,
'imgsrc':imgsrc
}
保存后,根据文档将结果保存到json文件中-->命令提示符中输入scrapy crawl dbbook -o junshibook89.json
-->回车运行
运行完成后,若无什么错误,打开最外层doubanbook目录,查看多了一个junshibook89.json文件,打开后可是中文字符都是类似\u4eae\u5251
的编码,这是什么?肿么回事?怎么办?
转码
是什么:\u4eae\u5251
看起来像Unicode,找了一个在线编码转换网站,证实了自己的想法,这两个字符其实代表的是”亮剑“
肿么回事:其实并不是什么错误结果,只是在存储到文件的时候,存放的是unicode,不管是什么只要代表的东西是对的就行了
怎么办:虽然无伤大雅,但是看起来总是别扭的,怎样把unicode表示的中文显示成中文呢?需要修改前面提到过的settings.py文件,在该文件中添加FEED_EXPORT_ENCODING = 'utf-8'
就行啦
命令提示符中输入scrapy crawl dbbook -o junshibook89-2.json
-->回车运行,查看结果是否显示中文了
总结
至此,初步爬取豆瓣评分咋8.9以上的军事类图书完成了,但是只是爬取了第一页中的内容,下篇抓取剩余页面的内容
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。