python正则表达式爬取【豆瓣电影top250】(新手向)

最近在学崔大的《网络爬虫开发与实战》,学到正则表达式那块儿,便迎来了自己的第一个实战项目。话不多说,正式进入正文。

本次爬虫工具使用的是pycharm,已经提前安装好了所有包(安装方式:file-Settings-Project Interpreter-“+”-搜索想要安装的包

首先导入本次爬虫所需要的三个库:requests,re,json。requests的作用是为了爬取网页的html内容,re是为了引入正则表达式,json是为了爬完后将文件保存至本地。

在这里插入图片描述
导入以后,首先用requests.get方法得到html,get方法需要两个参数,url和headers,所以我们需要先定义好这两个变量。

headers的查找方法:任意网页,鼠标右键点击,选择检查,找到Network,单击第一个文件,就能看到headers了。

python正则表达式爬取【豆瓣电影top250】(新手向)_第1张图片
红框中的User-Agent就是我们要找的目标了。不过注意,headers要求的是字典形式,所以还要把找到的内容修改一下,User-Agent作为key,冒号后面作为value。

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

在这里插入图片描述
好,现在我们可以提取html了。

在这里插入图片描述
记住,这里html的提取一定要在结尾加text转化成字符串格式,不然后面进行正则式提取的时候不识别。

获得html后,就可以用正则表达式的findall方法提取了。

这里最难的是构造正确的正则式子。由于是新手,构造错了很多次,很多书上也没讲方法。这里提一下自己的经验吧。

  • 把要构造的html的片段摘取下来
  • 一点一点的构造,测试
  • 找到标志元素

我一开始构造正则式都是一上来构造完要提取的全部元素,结果每次都返回不出结果,而且还不知道自己错哪儿。

后来想明白了,既然结构是重复的,完全可以提取一串静止的元素,小范围内实验。譬如这里要提取的top250,我们完全可以把第一个电影的元素截取下来测试。

python正则表达式爬取【豆瓣电影top250】(新手向)_第2张图片
这样的好处在于我们可以一步一步尝试,每增加一个要提取的元素就验证一遍,工作量小,也知道自己错在哪里。

构建正则表达式时还要注意找到标志元素,我理解的是,这就跟路标一样,它只有识别了,才能找到要提取的元素在哪儿。作为新手,不要过分地使用非贪婪,有时候多一点标志,会让元素更好地找到路径。

这里有一个小技巧,善用浏览器中的查看元素功能,它能让html元素与界面元素对应。从而避免我们盲目提取以及找不到元素在哪儿的问题。

python正则表达式爬取【豆瓣电影top250】(新手向)_第3张图片
通过这样的方法,我构造出了这个页面的正则表达。
re.S是为了匹配换行
到此,单页面的内容爬取就可以结束了。下面进行多页面。

仔细观察url,会发现第二个页面,第三个页面和第一个页面仅仅是参数的差距,以25为单位递增。

那我们就可以构造一个循环:

在这里插入图片描述
我们可以把之前单页的提取放在循环下面,就能提取所有页面的内容:

python正则表达式爬取【豆瓣电影top250】(新手向)_第4张图片
提取内容完成后,就要把内容保存到本地。我们先把内容转化成字典,再以json格式保存至txt文本中。由于我对构造函数不是太擅长,崔大书里讲的生成器方法用不了,所以我自己想了个比较笨的方法。先把results里的result由元祖变成列表,再构造一个新的列表,然后用zip把列表合成字典:

在这里插入图片描述
提取的元素中有一些空格,用strip()去掉了。

在这里插入图片描述

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

ensure_ascii=False是为了输出中文
完整代码如下:

python正则表达式爬取【豆瓣电影top250】(新手向)_第5张图片

你可能感兴趣的:(python正则表达式爬取【豆瓣电影top250】(新手向))