百度贴吧,我发了帖子把link复制到另一个没有登录账号的设备浏览就提示该贴已被删除?

很久以前曾在 中说过要分享一篇关于Python多线程爬虫的文章,最近用零碎的时间把这个坑给填了。

大多数Python学习者都是冲着Python在爬虫领域有非常出色的表现才开始学习的,在学好Python的基本语法并会使用re、requests、BeautifulSoup4等模块后,很快就能写出一个简单的爬虫小程序(不要看不起这个,毕竟这是我们每个人从0到1的必经阶段)

这篇文章的受众是:有Python基础,会用requests框架,会写简单的单进程单线程爬虫的新手,最好了解相关的threading模块知识。旨在让新手了解多线程爬虫的优势并会使用它,文章内容我觉得也比较易懂,相信会对大家有所帮助。另一方面,也能记录一下我的Python学习历程。

在这之前,我们看一下相关的Q&A科普,有了解的就跳过吧,我尽量配合易理解的语言来表述:

Q1: 什么是多线程?

A1: 多线程(Multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个执行绪,进而提升整体处理性能。通俗点来说,就是计算机程序在处理一个大任务时,程序将这个大任务按相关逻辑功能分成几个小任务,由多个线程分别工作。

A2: 有,具体实现是threading模块(在python3是标准内置模块)。不过我们要了解一下GIL(全局解释锁,Global Interpreter Lock)的概念。是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行,禁止多线程的并行执行。常见例子有CPython(Jython不使用GIL)与Ruby MRI。我们的Python(CPython实现)解释器就是如此,同一时间只有一个线程在工作,但因为线程切换得很快导致我们认为是多个线程在同时工作。

Q3: 那Python的多线程不就没什么用了吗?

其实并不是这样。在程序进行CPU密集型的任务时(计算、逻辑判断等CPU动作频繁),因GIL的存在的确即使在多核的情况下也提升不了性能,反而因为线程的频繁切换甚至会下降。但在程序进行IO密集型的任务时(CPU大多数时间在等I/O的读写),Python的多线程就发挥出了它的优势,尤其在Python在http请求上,使用多线程可以使其效率大幅度提升,在一个线程在等待socket返回数据时其他线程可以继续执行。

Q4: 我还听说过进程、协程等概念,它们又是什么?

A4: 简单说一下。进程(Process)是计算机中已运行程序的实体,一个进程可以由多个线程构成。协程(Coroutine) 是比线程更为轻量的一种模型,我们可以自行控制启动与停止的时机,Python3的协程爬虫就是基于此,有兴趣的可以深入了解一下。

关于threading模块,大家最好自己花点时间先去看看官方文档

我简单说一下比较重要的,创建一个线程有两种方法,一是将函数对象传入”

那我们可不可以写一个爬虫工具来,快速(3分钟以内)爬取特定贴吧的帖子(帖子数目可控),从帖子中筛选出其中的网盘链接,并判断链接是否有效,然后将网盘链接存储起来?

粗略来看,这个爬虫不难设计,无非是基于页面的请求和解析(甚至只用正则表达式就能实现解析),很容易实现。

设计思路和过程(以下为简单的单线程爬虫思路为例,至于多线程其实只是多了几个请求工作线程):

我们以ttf字体吧为例,ttf是一种常用的字体格式,在网页设计、系统美化等方面都有涉及。而我本人作为字体爱好者,比较喜欢收藏各式各样的字体,但字体资源也较为有限,更何况在潮流瞬息万变的今天,字体也是日新月异,百花齐放。获取这类资源的最好途径之一就是打开相关贴吧,有很多善良的贴吧小伙伴分享相关文件,我们只需将文件保存就行了。

我们看一下这个贴吧的目录。在浏览器地址栏输入:,然后在搜索栏输入ttf字体。

我们看到有52232个帖子,展现在我们眼前的是ttf字体吧目录页的第一页,并且我们得到了这个贴吧目录首页的url地址:

“kw=”后面就是我们要爬取的贴吧名。我们往下滑可以看到很多主题帖链接,这都是在目录页第一页中。我们翻到底部,可以看到这个选择栏:

有一项信息对我们很重要,没错,就是url地址!我们可以看到url地址是字体&ie=utf-8&pn=50,我们继续翻后面的一面,很容易分析出一个目录页有50个主题帖链接(因为有删除封禁的主题帖,实际上要少一点),第二页pn=50,第三页pn=100,以此类推,当然我们也可以试试pn=0会不会也是首页链接?事实证明,是的。我们把这个url记录下来后面会用到。

经过以上分析,我们了解到贴吧目录页和主题帖的对应关系,我们可以从目录页中通过简单的正则提取出各目录页中的主题帖页url地址(主题帖页url规则是:/p/.*)。当然用BeautifulSoup解析也行,毕竟怎么方便怎么来。

接下来我们打开一个带有网盘分享链接的主题帖,比如说这个:

往下翻,我们很容易找到其中分享的网盘链接:

同样的方法,我们用正则将网盘链接解析,我们可以在爬虫程序中将这个网盘链接保存起来,后续爬取这个网盘url看是否属于失效链接。

除此之外,对于这个页面,我们还有另一件很重要的事要做。因为这是我们通过解析目录页得到的主题帖,这个主题帖很有可能不止有一页,我们往下翻,可以看到:

这个帖子一共有11页,所以我们还需要爬取后面10页的帖子获取其中的网盘链接,但通过目录页解析我们只能得到这个主题帖的首页。所以,我们要获取后面页面的url还是得解析这个页面的内容,查看源码可以得到:

解析出后面的11(正则,BeautifulSoup随意)以及分析出后面页面的url格式(跟前面获取目录页方法相同)就不赘述了。附上单线程的实现简化思路图(图用word画的,比较简陋还请包涵):

基本思路就是这样。得到的网盘链接可以通过获取网盘页的title标签内的内容(如"百度网盘-链接不存在","百度网盘 请输入提取密码"即为无效网盘链接)判断。从以上来看,整体处理还是很简单的,但是唯一困难的就是页面请求量较大,如果要请求上千个主题帖(而且很多主题帖不止一页)那就不能快速获得了(想象一下一个单线程爬虫爬到天荒地老)。很容易想到,在面对大量页面请求时,多线程技术就可以闪亮登场了。

那多线程爬虫的思路是怎样的呢?其实,跟单线程思路是差不多的,首先我们除主线程任务之外,构建出另外三个子任务和一个url_and_response_queue,用于存放url和其请求后的response结果对象组成的元组,第一个子任务是专门用于网页请求获取结果,执行从url_queue取出url并/"+i[6:-1] print("程序参数错误!参数1应为贴吧名,参数2应为搜索深度(大于0的整数)。或不带其他参数直接运行此程序。") #headers设置"User-Agent"用于伪装成普通的浏览器,其实百度贴吧反爬系统并不严格,不需要校验headers、也不需要模拟登陆和IP池

这个多线程爬虫程序的大致功能是给出一个贴吧名和搜索深度(即要爬取的主题帖数目),它将爬取的结果保存到与程序相同目录下的html文件中,在爬取过程中可以即时从程序和html文件中看到爬虫进度(在爬虫进行时html文件每5秒会自动刷新更新一次,完成后不会自动刷新)。

爬虫启动有两种方式,第一种直接双击启动,第二种是命令行下传参启动(例如在程序目录下键入命令:python tieba_spider.py [贴吧名] [搜索深度]即可(例如:python tieba_spider.py ttf字体 1000)

建议从主函数__name__ == “__main__”开始看,注释虽然啰嗦,但比较详细。

给有时间有精力想搞事的小伙伴一个拓展作业: 用相同的多线程请求页面方式实现爬取百度贴吧用户信息用于统计分析。

顺便埋个坑:下次分享一篇用Python GUI实现的小玩意。

我要回帖

更多关于 注销百度贴吧账号会影响百度网盘吗 的文章

 

随机推荐