我的当当图书爬虫

我的当当图书爬虫

  • 一、项目简介
  • 二、爬取数据(scrapy框架)
    • scrapy框架的简单介绍
    • scrapy框架的安装
    • 爬取过程
    • 增量爬取
  • 三、数据的处理(matpoltlib)
    • 通过jieba库和wordcloud创建词云
    • 通过matpoltlib绘制横向柱状图(十大出版社排行榜)
    • 通过PIL绘制低价推荐
    • 通过matpoltlib绘制散点图(新书推荐)
    • 绘制折线图(最受欢迎作者)
  • 四、利用docx库生成word报告并打开

一、项目简介

我使用了scrapy异步框架来爬取当当网的数据,客户输入关键词,如:python,然后开始爬取关键词相关的图书数据,我简单进行了增量爬取的处理,数据爬下来后我使用了matplotlib实现数据可视化,画了几个相关统计数据的图表,如低价图书推荐、出版社排行榜、新书推荐等,最后生成word报告就完成了自己的爬虫。

二、爬取数据(scrapy框架)

之前课上老师讲过用requests来爬取网页,但是感觉效率不是很高,就在网上搜索到scrapy框架,实现了异步爬取,大大提高了效率。

scrapy框架的简单介绍

scrapy 底层是异步框架 twisted ,并发是最大优势。scrapy 是异步的, 吞吐量很高. requests 爬完一个再爬一个, 一分钟爬不了几个页面. 当然你也可以自己用异步的方式去使用 requests, 那就是自己写了一个类似 scrapy 的东西了, 代码量和简单的使用 requests 就不是一个量级了.另外scrapy也实现了简单去重,已经爬取过的网页就不会再爬取。
我的当当图书爬虫_第1张图片
scrapy是一个框架,能有效减少代码量,流程如下:
1. 首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。
2. 在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。
3. 在回调函数中,你解析网站的内容,我使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。
4. 最后,从蜘蛛返回的项目通常会进驻到项目管道。在项目管道中实现你自己的数据处理功能。

scrapy框架的安装

我的电脑安装scrapy有点麻烦,需要依赖一些其他库,我参考了一篇比较全的安装scrapy的博客,大家可以参考一下。

爬取过程

  1. 在items里面建立一个自己的类,里面对应的每一个属性存储爬取的每一个字段
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()
  1. 在pipeline里面定义三个方法,分别用于开启爬虫之前,和正在爬取时、爬取结束后调用,开启前就可以准备数据库连接,结束后关闭连接,正在爬取时的函数用于处理爬虫中每次爬取到的数据。
  2. 在myspider里面写自己的爬虫程序,里面定义了一个start_requests函数,用于定义初始的爬取网页,然后用yield语句 `

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,以后的每一页都不会再进行爬取,所以这个方法就行不通。之后我就想了一个改进方法,步骤如下:

  1. 创建一个DupeFilter类,因为scrapy框架的去重原理是通过这个类里面的方法进行过滤,所以我们要自定义这个类,并查询数据库中所有的已爬取网页,把它们存入set。
  2. 修改配置文件settings.py里面的默认过滤器,改成自定义的这个DupeFilter类
  3. 将每次爬取的网页页码存入数据库,以后每次运行程序之前除了去set中去重还要查询出最大页码,从最大页码的后一页开始爬取,如果没有后一页,默认爬取的是第一页,所以将已存入数据库的那些网页提前存入数据库非常必要,否则就会又从第一页开始爬取。
    总结:每次都把已经爬取的网页链接和页码存入数据库,每次运行爬虫之前先查出最大页码,从它的下一页开始爬取,因为如果没有下一页默认从第一页开始,所以我们需要重写DupeFilter,每次运行爬虫之前先将已经爬取的网页加入set,这样就可以实现增量爬取。

三、数据的处理(matpoltlib)

通过jieba库和wordcloud创建词云

将已存入数据库的图书细节取出来,用jieba库进行切割,再用wordcloud生成词云。我的当当图书爬虫_第2张图片

通过matpoltlib绘制横向柱状图(十大出版社排行榜)

matpoltlib将柱状图绘制成横向,并把y轴的值修改成对应的中文,最后隐藏x轴
我的当当图书爬虫_第3张图片

通过PIL绘制低价推荐

低价推荐是比较麻烦的,要先从数据库中把价格最低的16本图书的价格和图片取出来,然后用ImageDraw把价格绘制到图片上,最后将新生成的图片画到一张图片上我的当当图书爬虫_第4张图片

通过matpoltlib绘制散点图(新书推荐)

散点图不是很好画,需要传入坐标点和颜色变化函数,再添加上每个点的标签,然后将x轴设为时间,y轴及别的边框隐藏我的当当图书爬虫_第5张图片

绘制折线图(最受欢迎作者)

传入折线变化的函数,及x,y坐标,绘制出自定义样式的折线图,并把作者的信息显示在每个点上。我的当当图书爬虫_第6张图片

四、利用docx库生成word报告并打开

新建一个Document文件,将文字及已生成的图片插入其中,并建立一个表格展示自己的数据库结构,最后调用os库的startfile函数打开显示word报告。我的当当图书爬虫_第7张图片
我的当当图书爬虫_第8张图片

博客链接:https://blog.csdn.net/qq_38779009/article/details/85067019

你可能感兴趣的:(python)