2022 年最新 Python3 网络爬虫教程
大家好,我是崔庆才,由于爬虫技术不断迭代升级,一些旧的教程已经过时、案例已经过期,最前沿的爬虫技术比如异步、JavaScript 逆向、安卓逆向、智能解析、WebAssembly、大规模分布式、Kubernetes 等技术层出不穷,我最近新出了一套最新最全面的 Python3 网络爬虫系列教程。
博主自荐:截止 2022 年,可以将最前沿最全面的爬虫技术都涵盖的教程,如异步、JavaScript 逆向、安卓逆向、智能解析、WebAssembly、大规模分布式、Kubernetes 等,市面上目前就这一套了。
最新教程对旧的爬虫技术内容进行了全面更新,搭建了全新的案例平台进行全面讲解,保证案例稳定有效不过期。
教程请移步:
如下为原文。
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子。与上一篇不同的是,这次我们需要用到文件的相关操作。
前言
亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路。
2016/12/2
本篇目标
1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件
1.URL 格式的确定
首先,我们先观察一下百度贴吧的任意一个帖子。 比如:http://tieba.baidu.com/p/3138733512?see_lz=1&pn=1,这是一个关于 NBA50 大的盘点,分析一下这个地址。
1 |
http:// 代表资源传输使用http协议 |
所以我们可以把 URL 分为两部分,一部分为基础部分,一部分为参数部分。 例如,上面的 URL 我们划分基础部分是 http://tieba.baidu.com/p/3138733512,参数部分是 ?see_lz=1&pn=1
2.页面的抓取
熟悉了 URL 的格式,那就让我们用 urllib2 库来试着抓取页面内容吧。上一篇糗事百科我们最后改成了面向对象的编码方式,这次我们直接尝试一下,定义一个类名叫 BDTB(百度贴吧),一个初始化方法,一个获取页面的方法。 其中,有些帖子我们想指定给程序是否要只看楼主,所以我们把只看楼主的参数初始化放在类的初始化上,即 init 方法。另外,获取页面的方法我们需要知道一个参数就是帖子页码,所以这个参数的指定我们放在该方法中。 综上,我们初步构建出基础代码如下:
1 |
__author__ = 'CQC' |
运行代码,我们可以看到屏幕上打印出了这个帖子第一页楼主发言的所有内容,形式为 HTML 代码。 
3.提取相关信息
1)提取帖子标题
首先,让我们提取帖子的标题。 在浏览器中审查元素,或者按 F12,查看页面源代码,我们找到标题所在的代码段,可以发现这个标题的 HTML 代码是
1 |
<h1 class="core_title_txt " title="纯原创我心中的NBA2014-2015赛季现役50大" style="width: 396px">纯原创我心中的NBA2014-2015赛季现役50大</h1> |
所以我们想提取
标签中的内容,同时还要指定这个 class 确定唯一,因为 h1 标签实在太多啦。 正则表达式如下
1
<h1 class="core_title_txt.*?>(.*?)</h1>
1 |
<h1 class="core_title_txt.*?>(.*?)</h1> |
所以,我们增加一个获取页面标题的方法
1 |
#获取帖子标题 |
2)提取帖子页数
同样地,帖子总页数我们也可以通过分析页面中的共?页来获取。所以我们的获取总页数的方法如下
1 |
#获取帖子一共有多少页 |
3)提取正文内容
审查元素,我们可以看到百度贴吧每一层楼的主要内容都在
标签里面,所以我们可以写如下的正则表达式
1 |
<div id="post_content_.*?>(.*?)</div> |
相应地,获取页面所有楼层数据的方法可以写成如下方法
1 |
#获取每一层楼的内容,传入页面内容 |
好,我们运行一下结果看一下
真是醉了,还有一大片换行符和图片符,好口怕!既然这样,我们就要对这些文本进行处理,把各种各样复杂的标签给它剔除掉,还原精华内容,把文本处理写成一个方法也可以,不过为了实现更好的代码架构和代码重用,我们可以考虑把标签等的处理写作一个类。 那我们就叫它 Tool(工具类吧),里面定义了一个方法,叫 replace,是替换各种标签的。在类中定义了几个正则表达式,主要利用了 re.sub 方法对文本进行匹配后然后替换。具体的思路已经写到注释中,大家可以看一下这个类
1 |
import re |
在使用时,我们只需要初始化一下这个类,然后调用 replace 方法即可。 现在整体代码是如下这样子的,现在我的代码是写到这样子的
1 |
__author__ = 'CQC' |
我们尝试一下,重新再看一下效果,这下经过处理之后应该就没问题了,是不是感觉好酸爽! 
4)替换楼层
至于这个问题,我感觉直接提取楼层没什么必要呀,因为只看楼主的话,有些楼层的编号是间隔的,所以我们得到的楼层序号是不连续的,这样我们保存下来也没什么用。 所以可以尝试下面的方法:
1.每打印输出一段楼层,写入一行横线来间隔,或者换行符也好。 2.试着重新编一个楼层,按照顺序,设置一个变量,每打印出一个结果变量加一,打印出这个变量当做楼层。
这里我们尝试一下吧,看看效果怎样 把 getContent 方法修改如下
1 |
#获取每一层楼的内容,传入页面内容 |
运行一下看看效果
嘿嘿,效果还不错吧,感觉真酸爽!接下来我们完善一下,然后写入文件
4.写入文件
最后便是写入文件的过程,过程很简单,就几句话的代码而已,主要是利用了以下两句
file = open(“tb.txt”,”w”) file.writelines(obj)
这里不再赘述,稍后直接贴上完善之后的代码。
5.完善代码
现在我们对代码进行优化,重构,在一些地方添加必要的打印信息,整理如下
1 |
__author__ = 'CQC' |
现在程序演示如下
完成之后,可以查看一下当前目录下多了一个以该帖子命名的 txt 文件,内容便是帖子的所有数据。 抓贴吧,就是这么简单和任性!



























































回去之后,我一直对这件事念念不忘,西少爷肉夹馍能这么成功?我得去一探究竟。上网扒了一些相关的资料,算是对它有了一定的了解吧。趁这个机会,我把它记录下来。西少爷的创始人叫孟兵,和他一起创业的伙伴们都是来自腾讯、阿里、百度等知名公司的,也是一些IT界人士了,大家可能会纳闷,他们都进了这么大的公司了为什么还辞职卖肉夹馍呢?只能说他们有自己的想法和追求,具体原因,我也不详谈了。话说回来,他们为什么把自己的生意做得这么火爆?可以概括地这么说吧,他们利用了互联网的思维来经营自己的肉夹馍产品。 肉夹馍作为一个传统得不能再传统的餐饮行业,西少爷在它中间注入了互联网思维模式,一切都变得让人不可想象。可以说西少爷不仅仅是在做一个肉夹馍,他们在做一个产品,一个项目,而他们的公司则可以定位成一家互联网公司而不单单是一家餐饮公司。之前有一篇宣传故事叫《我为什么要辞职去卖肉夹馍》,里面写道创始人孟兵一开始就想去做肉夹馍,但其实不是这样。孟兵在北上广深四个一线城市都呆过一段时间,他通过对路边的小吃摊观察后发现,像驴肉火烧这种有地方特色的小吃是比较难流通到其他城市的,而像米粉啊、鸡蛋饼啊等等这种普遍性的产品才适合去经营。不过,要经营必须要结合自身的优势做出一款更好的有特色的产品来,在同行业的竞争中才能显出自己的优势。最后,孟兵通过与家乡陕西的特色小吃相对比,找出了一个最适合的产品,那就是肉夹馍。为什么?肉夹馍也作为陕西的特色小吃,同时也是全国的一项普遍性的产品,另外选择肉夹馍不仅仅是他对自己家乡的热爱,更重要愿望是想把具有陕西特色的肉夹馍带给大众的愿望。可以说,这些观察,这些思考,这些抉择,首先找准了产品路线的定位目标。 那么大多数人如果是确定了方向之后,就直接开始干了吧。孟兵呢?他没有这么做。目标找到了,但是设计理念上怎样呢?毕竟从陕西学到的肉夹馍的制作方法只是能让陕西人喜欢而已,但是能够做到所有人都喜欢吗?在产品研发上,这也是PM(产品经理)所需要考虑的问题。产品当然要做到让大多数人满意,只有一小部分人说好那不叫好,百分之八九十的人说好那才是真正的好。所以,半年的时间,孟兵和其他创始人没有做别的,他们把精力放在了产品(肉夹馍)的内测上,同时生产流程等等要做相应的优化,怎样保持松脆,怎样保持好的口感,都是他们需要考虑的问题。有两个创始人在百度呆过,他们知道搜索引擎这个东西是需要一定的计算公式的,而算法工程师也是要不断调整这个公式的变量来做到网站排名的优化,巧妙的是,他们把这套理念应用到了肉夹馍上,这也是一个学习和应用的过程。他们为肉夹馍放盐的多少、切肉的厚度、肉夹馍的厚度、肉夹馍的直径等等建立了一套计算公式,通过微调来调整口感,并且通过用户的反馈信息来不断进行优化。这种设计理念,这种设计思路,如果你没有相关的经验,如果你没有创新的思维,可以想到吗?孟兵说:”一个肉夹馍的研发绝对不亚于一个搜索引擎。而这种利用公式来制作肉夹馍的做法,一方面是我们的心血创造,但另一方面也很感谢百度这样的大公司为我们带来的视野与格局,也才能如此跨界。”那么他们是怎么测试的呢?可以归结如下: