前言
爬虫部分的知识算是告一段落了,又是几天过去了,感觉挺充实的。里面可能还有一些需要改进的地方,慢慢完善吧。
正文
接下来我们就说说上次遗留下来的问题,如何爬取动态数据。先告诉你一下爬取的数据中为什么没有电影信息吧:因为我们请求的是静态页面地址。如果请求的是动态资源,会从数据库中取出数据等一系列操作后动态拼凑页面的展示内容,把所有的展示内容交给WEB服务器,之后通过WEB服务器将内容发送回客户端浏览器进行解析执行。
所以,我们现在需要知道它的动态加载数据的地址,我们在浏览器调试中去找出这条地址即可。
首先我们要有一款浏览器:谷歌或者360浏览器
- 谷歌浏览器操作方法:点击页面右上角的“三点” → 更多工具 → 开发者工具
- 360浏览器操作方法:空白地方对页面单击右键 → 审查元素(如果没有,说明该页面不支持)
- 其他浏览器操作方法请自行百度
打开页面调试后,我们选择横条上的Network,刷新页面,我们就看到多条服务器响应返回的记录,接下来就是仔细去找我们需要的信息了。
接着上个实验,我们做完以上的准备工作,由于返回的记录数只有一条,那么我们就可以断定,以下就是动态加载的网址。
http://m.maoyan.com/imeituan/ajax/cinema?offset=0&_v_=yes
以下是完整代码:
import requests
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
}
res = requests.get('http://m.maoyan.com/imeituan/ajax/cinema?offset=0&_v_=yes',headers=header).json()
print(res)
抓取成功,部分结果如下:
{...'cinemas': [{...'nm': '喜满客影城', 'mark': 0, 'price': 27, 'referencePrice': '0', 'sellPrice': '27', 'tag': {'deal': 0, 'snack': 0, 'vipTag': '折扣卡', 'hallType': ['巨幕厅', '4D厅'], 'allowRefund': 0, 'sell': 1, 'hallTypeVOList': [{'name': '巨幕厅', 'url': ''}, {'name': '4D厅', 'url': ''}], 'buyout': 0, 'endorse': 1}, 'distance': '1.7km', 'showPrice': True, 'shopId': 14714361, 'id': 7285, 'score': 558.62067, 'dis': 1688.9367843113519, 'follow': 0, 'labels': [{'name': '改签', 'color': '#579daf'}, {'name': '折扣卡', 'color': '#ff9900'}, {'name': '巨幕厅', 'color': '#579daf', 'url': ''}, {'name': '4D厅', 'color': '#579daf', 'url': ''}],...}
这里我们可以发现price和sellPrice都是27元,而且和网页上的价格吻合,和referencePrice没有关系。
至此,我们的项目结......等等,27元的电影票!感觉没有优惠啊,打开美团app一看,9.9元特惠!!!
翻车!虽然没有拿到我们想要的优惠,但至少我们获取到了数据,也算是庆幸了。
小结
爬虫的优点是能让我们抛开网页框架,直面数据。企业为了维护自身的利益,还是会不断提升自己的防爬技术的。作为爬虫小白,这就需要我们不断学习新的爬虫知识,我也会继续分享爬虫经验的。
希望大家看完点个赞,不做白嫖党!