python正则表达式爬取【豆瓣电影top250】(新手向)
最近在学崔大的《网络爬虫开发与实战》,学到正则表达式那块儿,便迎来了自己的第一个实战项目。话不多说,正式进入正文。
本次爬虫工具使用的是pycharm,已经提前安装好了所有包(安装方式:file-Settings-Project Interpreter-“+”-搜索想要安装的包)
首先导入本次爬虫所需要的三个库:requests,re,json。requests的作用是为了爬取网页的html内容,re是为了引入正则表达式,json是为了爬完后将文件保存至本地。

导入以后,首先用requests.get方法得到html,get方法需要两个参数,url和headers,所以我们需要先定义好这两个变量。
headers的查找方法:任意网页,鼠标右键点击,选择检查,找到Network,单击第一个文件,就能看到headers了。

红框中的User-Agent就是我们要找的目标了。不过注意,headers要求的是字典形式,所以还要把找到的内容修改一下,User-Agent作为key,冒号后面作为value。

至于url,就涉及到分页了,这里待会儿再讲,我们先把单页内容的提取讲完。找到豆瓣电影top250的主页,把地址栏里的地址复制下来就可以了。

好,现在我们可以提取html了。

记住,这里html的提取一定要在结尾加text转化成字符串格式,不然后面进行正则式提取的时候不识别。
获得html后,就可以用正则表达式的findall方法提取了。
这里最难的是构造正确的正则式子。由于是新手,构造错了很多次,很多书上也没讲方法。这里提一下自己的经验吧。
- 把要构造的html的片段摘取下来
- 一点一点的构造,测试
- 找到标志元素
我一开始构造正则式都是一上来构造完要提取的全部元素,结果每次都返回不出结果,而且还不知道自己错哪儿。
后来想明白了,既然结构是重复的,完全可以提取一串静止的元素,小范围内实验。譬如这里要提取的top250,我们完全可以把第一个电影的元素截取下来测试。

这样的好处在于我们可以一步一步尝试,每增加一个要提取的元素就验证一遍,工作量小,也知道自己错在哪里。
构建正则表达式时还要注意找到标志元素,我理解的是,这就跟路标一样,它只有识别了,才能找到要提取的元素在哪儿。作为新手,不要过分地使用非贪婪,有时候多一点标志,会让元素更好地找到路径。
这里有一个小技巧,善用浏览器中的查看元素功能,它能让html元素与界面元素对应。从而避免我们盲目提取以及找不到元素在哪儿的问题。

通过这样的方法,我构造出了这个页面的正则表达。

到此,单页面的内容爬取就可以结束了。下面进行多页面。
仔细观察url,会发现第二个页面,第三个页面和第一个页面仅仅是参数的差距,以25为单位递增。
那我们就可以构造一个循环:

我们可以把之前单页的提取放在循环下面,就能提取所有页面的内容:

提取内容完成后,就要把内容保存到本地。我们先把内容转化成字典,再以json格式保存至txt文本中。由于我对构造函数不是太擅长,崔大书里讲的生成器方法用不了,所以我自己想了个比较笨的方法。先把results里的result由元祖变成列表,再构造一个新的列表,然后用zip把列表合成字典:

提取的元素中有一些空格,用strip()去掉了。

最后,用‘a‘(追加写入)格式写入一个txt文件,就大功告成了。

完整代码如下:

更多推荐
所有评论(0)