python3写的爬虫_【Python3爬虫】用Python中的队列来写爬虫

本文介绍了如何使用Python3的队列数据结构编写爬虫,以获取博客园个人博客的总阅读量。通过定位网页元素,结合正则表达式匹配下一页链接,实现翻页抓取。详细讲解了使用queue模块的Queue类,并给出了完整的爬虫代码示例。
摘要由CSDN通过智能技术生成

一、写在前面

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

二、必备知识

队列是常用数据结构之一,在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。

三、具体步骤

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

7f8575e64eec30eba9b79d84fca1e87e.png

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

5c23e6ff0973005430e6c83c7cfd447a.png

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

5e898330e1e73d3638a07331ac903897.png

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

下一页

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

四、完整代码

1 """

2 Version: Python3.53 Author: OniOn4 Site: http://www.cnblogs.com/TM0831/5 Time: 2019/3/11 10:466 """

7 importre8 importqueue9 importrequests10 from lxml importetree11

12

13 classCrawlQueue: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 defrequest(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 inlst:34 num = i.split(" ")[5].lstrip("阅读(").rstrip(")")35 self.result.append(int(num))36

37 #下一页

38 next_page = re.search('下一页', res.text)39 ifnext_page:40 href = next_page.group().split(' ')[-1].replace('下一页', '')41 if href not in self.urls: #确保之前没有爬过

42 self.q.put(href)43 self.urls.append(href)44

45 defget_url(self):46 """

47 从爬取队列中取出url48 :return:49 """

50 if notself.q.empty():51 url =self.q.get()52 self.request(url)53

54 defmain(self):55 """

56 主函数57 :return:58 """

59 while notself.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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值