本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HTML 的解析库不是很了解,所以本节我们选用正则表达式来作为解析工具。
1. 本节目标
本节我们要提取出猫眼电影 TOP100 榜的电影名称、时间、评分、图片等信息,提取的站点 URL 为:http://maoyan.com/board/4,提取的结果我们以文件形式保存下来。
2. 准备工作
在本节开始之前请确保已经正确安装好了 Requests 库,如果没有安装可以参考第一章的安装说明。
3. 抓取分析
本节我们需要抓取的目标站点为:http://maoyan.com/board/4,打开之后便可以查看到榜单的信息,如图 3-11 所示:
图 3-11 榜单信息
排名第一的电影是霸王别姬,页面中显示的有效信息有影片名称、主演、上映时间、上映地区、评分、图片等信息。
网页下滑到最下方可以发现有分页的列表,我们点击一下第二页观察一下页面的URL和内容发生了怎样的变化,如图 3-12 所示:
图 3-12 页面 URL 变化
可以发现页面的 URL 变成了:http://maoyan.com/board/4?off…,相比之前的URL多了一个参数,那就是 offset=10,而目前显示的结果是排行 11-20 名的电影,初步推断这是一个偏移量的参数,我们再点击下一页,发现页面的 URL 变成了:http://maoyan.com/board/4?off…,参数 offset 变成了 20,而显示的结果是排行 21-30 的电影。
由此我们可以总结出规律,offset 代表了一个偏移量值,如果偏移量为 n,则显示的电影序号就是 n+1 到 n+10,每页显示 10 个。所以我们如果想获取 TOP100 电影,只需要分开请求 10 次,而 10 次的 offset 参数设置为 0,10,20,…,90 即可,这样我们获取不同的页面结果之后再用正则表达式提取出相关信息就可以得到 TOP100 的所有电影信息了。
4. 抓取首页
接下来我们用代码实现这个过程,首先抓取第一页的内容,我们实现一个 get_one_page() 方法,传入 url 参数,然后将抓取的页面结果返回,然后再实现一个 main() 方法调用一下,初步代码实现如下:
import requests
def get_one_page(url):
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
def main():
url = '[http://maoyan.com/board/4](http://maoyan.com/board/4)'
html = get_one_page(url)
print(html)
main()
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
这样运行之后我们就可以成功获取首页的源代码了,获取源代码之后我们就需要对页面进行解析,提取出我们想要的信息。
5. 正则提取
接下来我们回到网页看一下页面的真实源码,在开发者工具中 Network 监听,然后查看一下源代码,如图 3-13 所示:
图 3-13 源代码
注意这里不要在 Elements 选项卡直接查看源码,此处的源码可能经过 JavaScript 的操作而和原始请求的不同,我们需要从Network选项卡部分查看原始请求得到的源码。
查看其中的一个条目的源代码如图 3-14 所示:
图 3-14 源代码
可以看到一部电影信息对应的源代码是一个 dd 节点,我们用正则表达式来提取这里面的一些电影信息,首先我们需要提取它的排名信息,而它的排名信息是在 class 为 board-index 的 i 节点内,所以所以这里利用非贪婪匹配来提取 i 节点内的信息,正则表达式写为:
<dd>.*?board-index.*?>(.*?)</i>
随后我们需要提取电影的图片,可以看到在后面有个 a 节点