2.3 使用Requests和正则表达式爬取猫眼电影Top 100排行榜
打开猫眼电影网站,进入到榜单页面,观察发现每页有10个电影,点击下一页时网站地址会添加一个参数offset,参数值为10,20,30, ... , 100: 如http://maoyan.com/board/4?offset=20
以此为入口地址,首先进行单页解析。按照如下步骤进行获取网站基本信息。
使用Chrome浏览器打开榜单页面
http://maoyan.com/board/4鼠标右键检查,可以查看网络元素与浏览器渲染结果
选中
Network标签,刷新网站,观察到浏览器与服务器之间有很多请求与响应,包括主要页面与css、js文件等等从服务器的主要Response中获取
Request headers信息,用于爬虫中构造headers

从
Network页签下的Response页获取服务器的原始响应信息,一定要从此处获取而不是Element处获取,因为Element中的源码可能经过 JavaScript 的操作而和原始请求的不同。在Response中页签中找到需要获取的信息,如:电影名,海报链接,演员,上映时间地点,排名,打分。
观察到每个电影均以<dd>...</dd>标签来包含。
利用正则表达式
(.*?)过滤出各个元素.
解析一下这个正则表达式:
<dd>.*?board-index表示找到以<dd>开头的字符串后,继续往后匹配,.*?表示匹配任意个任意字符,直到第一次(问号表示的非贪婪模式)遇到board-index字符串后结束这段匹配。.*?">(.*?)</i>表示的是,在前面的匹配找到后,继续进行匹配任意个任意字符,直到第一次遇到">字符串,通过(.*?)</i>匹配提取括号中的任意个任意字符串,直到第一次遇到</i>字符串。
上面的这两段能够匹配出
<dd> <i class="board-index board-index-21">21</i>,提取出排名21字符串。
继续匹配,后面的正则表达式
.*?title="(.*?)"表示匹配任意个任意字符,直到第一次遇到title="字符串,将"符号后面的字符串使用(.*?)"进行匹配,提取第二个"之前的字符串。
即能匹配提取
title="黑客帝国"中的黑客帝国。
继续匹配,
.*?data-src="(.*?)",表示匹配任意个任意字符,直到第一次遇到data-src="字符串,使用(.*?)提取其后面的字符串。后续匹配类似,即使用
.*?匹配任意个任意字符,并使用非贪婪模式,需要提取的字符串使用()括起来。
基于上面的分析,可以编写网页获取函数与解析函数。
Last updated