一、写在前面

当你看着你的博客的阅读量慢慢增加的时候,内心不禁有了些小激动,但是不得不吐槽一下--博客园并不会显示你的博客的总阅读量是多少。而这一篇博客就将教你怎么利用队列这种结构来编写爬虫,最终获取你的博客的总阅读量。

二、必备知识

队列是常用数据结构之一,在Python3中要用queue这个模块来实现。queue这个模块实现了三种队列:

class queue.Queue(maxsize=0):FIFO队列(first in first out),先进先出,第一个进入队列的元素会第一个从队列中出来。maxsize用于设置队列里的元素总数,若小于等于0,则总数为无限大。

class queue.LifoQueue(maxsize=0):LIFO队列(last in first out),后进先出,最后一个进入队列的元素会第一个从队列中出来。maxsize用于设置队列里的元素总数,若小于等于0,则总数为无限大。

class queue.PriorityQueue(maxsize=0):优先级队列(first in first out),给队列中的元素分配一个数字标记其优先级。maxsize用于设置队列里的元素总数,若小于等于0,则总数为无限大。

这次我使用的是Queue这个队列,Queue对象中包含的主要方法如下:

Queue.put(item, block=True, timeout=None):将元素放入到队列中。block用于设置是否阻塞,如果timeout为正数,表明最多阻塞多少秒。

Queue.get(block=True, timeout=None):从队列中删除并返回一个元素,如果队列为空,则报错。block用于设置是否阻塞,如果timeout为正数,表明最多阻塞多少秒。

Queue.empty():判断队列是否为空,如果队列为空,返回False,否则返回True。

三、具体步骤

首先进入博客,然后打开开发者工具选择查看元素,如下:

这里只要定位到类名为postDesc的div节点就可以提取到我们想要的阅读量信息了,这一步是很简单的。问题在于如何实现翻页?先定位到下一页查看一下元素:

好像定位到id为nav_next_page的div节点就行了,是这样吗?点击进入下一页,然后再次定位查看一下:

可以看到用之前定位div节点的方法已经不行了,怎么办呢?我的解决办法是用正则表达式进行匹配,因为下一页对应的元素都是这样的:

<a href="链接">下一页</a>

所以只需要进行一下正则匹配就能获取下一页的链接了,如果获取不到,就说明已经是最后一页了!

四、完整代码

 1 """
 2 Version: Python3.5
 3 Author: OniOn
 4 Site: http://www.cnblogs.com/TM0831/
 5 Time: 2019/3/11 10:46
 6 """
 7 import re
 8 import queue
 9 import requests
10 from lxml import etree
11
12
13 class CrawlQueue:
14     def __init__(self):
15         """
16         初始化
17         """
18         self.q = queue.Queue()  # 爬取队列
19         self.username = input("请输入您的博客名称:")
20         self.q.put("http://www.cnblogs.com/" + self.username)
21         self.urls = ["http://www.cnblogs.com/" + self.username]  # 记录爬取过的url
22         self.result = []  # 储存阅读量数据
23
24     def request(self, url):
25         """
26         发送请求和解析网页
27         :param url: 链接
28         :return:
29         """
30         res = requests.get(url)
31         et = etree.HTML(res.text)
32         lst = et.xpath('//*[@class="postDesc"]/text()')
33         for i in lst:
34             num = i.split(" ")[5].lstrip("阅读(").rstrip(")")
35             self.result.append(int(num))
36
37         # 下一页
38         next_page = re.search('<a href="(.*?)">下一页</a>', res.text)
39         if next_page:
40             href = next_page.group().split('&nbsp;')[-1].replace('<a href="', '').replace('">下一页</a>', '')
41             if href not in self.urls:  # 确保之前没有爬过
42                 self.q.put(href)
43                 self.urls.append(href)
44
45     def get_url(self):
46         """
47         从爬取队列中取出url
48         :return:
49         """
50         if not self.q.empty():
51             url = self.q.get()
52             self.request(url)
53
54     def main(self):
55         """
56         主函数
57         :return:
58         """
59         while not self.q.empty():
60             self.get_url()
61
62
63 if __name__ == '__main__':
64     crawl = CrawlQueue()
65     crawl.main()
66     print("您的博客总阅读量为:{}".format(sum(crawl.result)))

完整代码已上传到GitHub!

转载于:https://www.cnblogs.com/TM0831/p/10510319.html

【Python3爬虫】用Python中的队列来写爬虫相关推荐

  1. python中的队列和栈_python的队列和栈

    (一)队列和栈的区别 1.队列: 队列是一种特殊的线性表.其两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端 ...

  2. python中 getnode用法_node.js 爬虫入门总结

    node.js爬虫 前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等.当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript ...

  3. [转载] 【零基础学爬虫】python中的yield详解

    参考链接: 什么时候在Python中使用yield而不是return python中的yield功能比较强大,什么意思呢?如果一个函数f内使用了yield关键词,那么该函数就可以这样使用: for i ...

  4. 【网络爬虫】python中的数据解析工具(re,bs4,xpath,pyquery)

    1.基础知识 1.1 正则(re) Regular Expression, 正则表达式, ⼀种使⽤表达式的⽅式对字符进⾏匹配的语法规则. ⽹⻚源代码本质上就是⼀个超⻓的字符串, 想从⾥⾯提取内容.⽤正 ...

  5. python爬虫百科-Python从概念上先了解爬虫

    什么是爬虫 爬虫:就是抓取网页数据的程序.搜索引擎的底层其实就是爬虫. 百度百科:网络爬虫 关于Python爬虫,我们需要学习的有: Python基础语法学习(基础知识) HTML页面的内容抓取(数据 ...

  6. python一个月能学成嘛-0基础学Python,1个月写爬虫,走了哪些弯路?

    你是如何自学Python的? 今天我们来分享一位小伙伴的自学之路.当然,如果你没有任何编程基础,也将会和他一样走很多弯路,如果有条件希望你能够找到老师带领. 0基础小白的自学之路 首先介绍下我的背景, ...

  7. python爬虫的数据如何解决乱码_写爬虫时如何解决网页乱码问题

    实战讲解,文章较长,对爬虫比较熟悉的浏览翻看章节 2.3 获取新闻文本内容. 写爬虫时经常对网址发起请求,结果返回的html数据除了标签能看懂,其他的全部是乱码.大家如果对爬虫感兴趣,请耐心阅读本文, ...

  8. python中空格键怎么写_python的空格键

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我使用pyqt 5和python 3创建了工作ui,除了单击按钮外,还想通过按键 ...

  9. python中文件路径怎么写?

    绝对地址 1.双反斜杆 \\ 我们知道,文件夹地址中有这样的反斜杆 \,但是这样的斜杆在python字符串中代表的是转义符,是将后一个字符进行转义,比如,\n,\r,\',但是要单独再输出反斜杆,就可 ...

最新文章

  1. c语言分支结构程序设计教学设计 赛课,《分支结构程序设计》教学设计.doc
  2. SAP EWM - 其他主数据 - 运输主数据-1
  3. layui循环数据并渲染_layui使用表格渲染获取行数据的例子
  4. 十一、Shell 文件包含
  5. 《51单片机应用开发从入门到精通》——2.6 中断控制功能的作用
  6. linux nat span端口镜像,SPAN端口镜像
  7. 重温“ Java Sucks”
  8. DreamFactory 第7章 限制和记录API请求
  9. 使用 Inno Setup 快速打包你的应用程序
  10. URL 中,查询字符串与HTML实体冲突,可能带来的问题.
  11. bzoj 3680: 吊打XXX
  12. Java面向对象编程三大特征-多态
  13. python 无头浏览器_python3使用无头浏览器
  14. 基于单片机的脉搏心率远程监测
  15. 学习微信开发公众号的第一天(根据文字自动回复文字)
  16. 如何开发Android安卓RFID读卡APP
  17. android 表情键盘切换,如何在键盘之间切换(从表情符号到qwerty,反之亦然)
  18. pythonapi是什么意思_API是什么意思?API文档又是什么意思?
  19. 群发微信图文消息,但是正文中的图片却不显示
  20. Spring Data JPA-单向一对一关联映射

热门文章

  1. 团队项目:个人工作总结06
  2. UIPickView 和 UIDatePicker
  3. UIAlertController (UIActionSheet, UIAlertView is deprecated in iOS 8.)
  4. 访问数据库时如何解决并发问题
  5. selector的使用
  6. centos 7.4 + postgresql 10.1 + pg_amqp
  7. Myeclipse连接数据库删除数据库(JDBC)
  8. 【Spring学习笔记-MVC-1.3】消息转换器HttpMessageConverter
  9. ASP.net MVC Mock Context(上下文)
  10. SQL数据库从高版本到低版本的迁移,同时解决sql脚本文件太大无法打开的尴尬问题