我使用了scrapy异步框架来爬取当当网的数据,客户输入关键词,如:python,然后开始爬取关键词相关的图书数据,我简单进行了增量爬取的处理,数据爬下来后我使用了matplotlib实现数据可视化,画了几个相关统计数据的图表,如低价图书推荐、出版社排行榜、新书推荐等,最后生成word报告就完成了自己的爬虫。
之前课上老师讲过用requests来爬取网页,但是感觉效率不是很高,就在网上搜索到scrapy框架,实现了异步爬取,大大提高了效率。
scrapy 底层是异步框架 twisted ,并发是最大优势。scrapy 是异步的, 吞吐量很高. requests 爬完一个再爬一个, 一分钟爬不了几个页面. 当然你也可以自己用异步的方式去使用 requests, 那就是自己写了一个类似 scrapy 的东西了, 代码量和简单的使用 requests 就不是一个量级了.另外scrapy也实现了简单去重,已经爬取过的网页就不会再爬取。
scrapy是一个框架,能有效减少代码量,流程如下:
1. 首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。
2. 在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。
3. 在回调函数中,你解析网站的内容,我使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。
4. 最后,从蜘蛛返回的项目通常会进驻到项目管道。在项目管道中实现你自己的数据处理功能。
我的电脑安装scrapy有点麻烦,需要依赖一些其他库,我参考了一篇比较全的安装scrapy的博客,大家可以参考一下。
class BookItem(scrapy.Item): id=scrapy.Field() title=scrapy.Field() author=scrapy.Field() date=scrapy.Field() publisher=scrapy.Field() detail=scrapy.Field() price=scrapy.Field() ext=scrapy.Field()
yield scrapy.Request(url=url, callback=self.parse)`
执行爬虫,yield类似于return,不同的是它要等待自己储存的数据被拿走才往下执行,callback是回调函数,即爬取之后调用的函数,这个函数里用xpath进行信息的提取,然后封装到自己的item类中,最后yield item将item对象返回给管道,让管道进行数据的存储。这里我使用了一个递归调用
link = selector.xpath("//div[@class='paging']/ul[@name='Fy']/li[@class='next']/a/@href").extract_first() if link: url = response.urljoin(link) yield scrapy.Request(url=url, callback=self.parse)
即爬取每一页的末尾是否有下一页信息,有的话继续爬取下一页,因为scrapy框架实现了去重,所以递归途中不会重复爬取
scrapy已经简单实现了去重,原理是内部有一个set,开始爬取之前初始化set,每爬取一个网页就存入set,下一次就不用再进行重复爬取,但这仅限于每次运行这个爬虫期间不重复爬取,所以要实现增量爬取最好是与redis结合,我这里只实现了简单的增量爬取。 本来我只是将每次访问过的网页存入这个set,然后运行爬虫之前都会进行判断是否已经爬取,但因为我的是递归爬取,就是说只有爬了第一页才能爬到它的下一页,所以如果我将第一页存入了set,以后的每一页都不会再进行爬取,所以这个方法就行不通。之后我就想了一个改进方法,步骤如下:
将已存入数据库的图书细节取出来,用jieba库进行切割,再用wordcloud生成词云。
matpoltlib将柱状图绘制成横向,并把y轴的值修改成对应的中文,最后隐藏x轴
低价推荐是比较麻烦的,要先从数据库中把价格最低的16本图书的价格和图片取出来,然后用ImageDraw把价格绘制到图片上,最后将新生成的图片画到一张图片上
散点图不是很好画,需要传入坐标点和颜色变化函数,再添加上每个点的标签,然后将x轴设为时间,y轴及别的边框隐藏
传入折线变化的函数,及x,y坐标,绘制出自定义样式的折线图,并把作者的信息显示在每个点上。
新建一个Document文件,将文字及已生成的图片插入其中,并建立一个表格展示自己的数据库结构,最后调用os库的startfile函数打开显示word报告。
博客链接:https://blog.csdn.net/qq_38779009/article/details/85067019