2.3 使用Requests和正则表达式爬取猫眼电影Top 100排行榜

打开猫眼电影网站,进入到榜单页面,观察发现每页有10个电影,点击下一页时网站地址会添加一个参数offset,参数值为10,20,30, ... , 100: 如http://maoyan.com/board/4?offset=20

以此为入口地址,首先进行单页解析。按照如下步骤进行获取网站基本信息。

  1. 使用Chrome浏览器打开榜单页面http://maoyan.com/board/4

  2. 鼠标右键检查,可以查看网络元素与浏览器渲染结果

  3. 选中Network标签,刷新网站,观察到浏览器与服务器之间有很多请求与响应,包括主要页面与cssjs文件等等

  4. 从服务器的主要Response中获取Request headers信息,用于爬虫中构造headers

  1. Network页签下的Response页获取服务器的原始响应信息,一定要从此处获取而不是Element处获取,因为Element中的源码可能经过 JavaScript 的操作而和原始请求的不同。在Response中页签中找到需要获取的信息,如:电影名,海报链接,演员,上映时间地点,排名,打分

观察到每个电影均以<dd>...</dd>标签来包含。

  1. 利用正则表达式(.*?)过滤出各个元素.

解析一下这个正则表达式:

  • <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