1.背景

之前的文章中已经介绍过猫眼TOP100的电影信息爬取案例,网页每页有10条电影信息,通过翻页发现URL变化规律构造循环爬取10页100条全部电影信息。但是豆瓣电影分类排行榜的网页情况就所不同,打开恐怖片分类下的排行榜:

假如要爬当前页面的电影名,按之前的套路分析网页:

爬取代码如下:

import requests

from bs4 import BeautifulSoup

url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action='

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}

response = requests.get(url,headers = headers)

print(response.status_code)#用于测试给服务器发送的请求是否成功。如果返回200则成功,返回其他状态码都不成功

html = response.text

soup = BeautifulSoup(html,'lxml')

names = soup.find_all('span',class_="movie-name-text")

print(names)

运行结果如下:

状态码为200,说明请求服务器成功,但是却没抓到name的数据,列表为空。看来这个网页有点特殊,想进一步分析网页URL,找到翻页规律,滑动鼠标滚轮发现,网页每次都加载一部分的电影信息,但只要继续往下滑会不断有新的电影信息加载出来,地址栏的URL也不会发生变化,像这样子:

其实这就是采用异步加载技术(Ajax)的网页,也是本案例要介绍的主题。

2.AJAX介绍

AJAX(Asynchronouse JavaScript And XML)即异步JavaScript和XML。这种技术可以利用JavaScript使网页实现异步更新,也就是实现不重新加载页面也可以对网页的部分内容进行更新。传统上的网页(没有使用ajax技术的网页)与ajax网页最大的区别就是更新的范围,哪怕只是需要更新网页中的很小的范围也必须重新加载整个页面,当网页比较复杂数据量较大的时候这会使得网页加载速度慢,用户体验差,而且每次请求都加载了重复的数据,造成宽带的浪费。

举个例子,不是太恰当,有那么个意思。。。你一个人去川菜馆点了两个菜,服务员等厨师两个菜都做好后再一起给你上,由于菜比较少所以等待的时间和一个菜的差距不是很大。但如果你们一群人去吃饭,点了很多菜如果服务员还等厨师全部都做好再上,是不是要等到花儿都谢了。。。传统网页就是那个等厨师把菜全部做好一次性上,AJAX技术的网页就是那个一点一点给你上菜的方式。AJAX网页的异步加载其实就是在后台与服务器进行了少量的数据交互,获取数据后再利用JavaScrip改变网页内容,实现小范围的网页更新。

正是AJAX技术有着这么多的优点,所以目前的趋势就是采用ajax技术的网页越来越多,如果不了解这种技术就要面临着没有数据可爬,继续努力学习新知识吧!

目前要爬取这种异步加载网页的方法有两种:一种就是通过浏览器审查元素找到包含所需信息网页的真实地址,另一种就是通过selenium模拟浏览器的方法,之前采取cookie模拟登录网页那篇文章也有提到这个selenium模拟登录,看来这个技术也是必须要学了,不过很可惜还不是今天,先用第一种方法解决今天的问题吧。

3.案例应用

通过背景介绍和ajax技术的介绍,可知通过一般的爬虫套路去爬ajax技术的网页是爬不到任何数据的,这是因为原始的网页只是一个框架不包含所需数据的,这个原始页面加载完还要在后台发送一个ajax请求,获取数据后才能把数据呈现在网页上实现网页的局部更新。为了证明ajax原始网页中是不包含所需数据的再和普通的网页做个对比,豆瓣top250网页不是采用异步加载技术的网页:

用谷歌浏览器打开网页页面按右键查看网页源代码,再从源代码中用CTRL+F查找网页中的数据,比如查找第一部电影的名字“肖申克的救赎”:

在源代码中找到了这个信息,其实我们爬虫要做的工作就是发送请求返回网页的源代码然后再从源代码中解析出所需要的信息,但是同样的操作,再来看看豆瓣分类排行榜的情况,继续以恐怖片排行榜为例,在源代码中寻找第一步电影的名字“惊魂记”:

可以发现网页源代码搜索的关键信息不存在,可以肯定的就是分类排行榜就是ajax技术网页,下面要做的工作就是采用爬取异步加载网页的第一种方法:通过浏览器审查元素找到包含所需信息网页的真实地址,找到真实地址后就可以用一般的爬虫套路来爬取所需信息了。下面来介绍ajax分析的套路:

①打开“检查”功能。打开恐怖片分类排行榜右击鼠标选“检查”,得到如下界面:

②找到真实的数据地址。选择页面中的Network选项,刷新网页就可以在左侧看到浏览器从服务器获取到的数据,下滑鼠标会不断有新的数据加载,在这些异步加载的数据中肯定也包含要找的电影名称信息。一般这些数据都是json格式,需要在在XML中查找,选中preview可以对返回的数据进行查看,如下图:

可以看到preview中返回的20条电影信息。关于对json的介绍可以参考这里:http://json.cn中,可以清楚看到json结构,总共20条电影信息:

找到了电影信息,选择response可以查看具体json内容,选择header可以查看请求头信息,如下图:

从header信息中可以找到真实的请求URL还有请求方式,本案例是get请求方式,不过大多数网站都是post请求方式。下滑页面在左面请求到的数据中寻找,发现连续几页的真实URL:

这种URL之前见得比较多了,start参数后面跟的应该就是就是首页页码,从start参数可以找出翻页规律:初始为0,间隔为20

真实的URL获取到了,可以用之前的爬虫套路了。

③利用真实URL请求数据,代码如下:

import requests

#请求第一页数据

url = 'https://movie.douban.com/j/chart/top_list?type=20&interval_id=100%3A90&action=&start=0&limit=20'

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}

response = requests.get(url,headers = headers)

print(response.text)

运行结果如下:

经对比和response中的json数据是一样的证明请求数据成功。前面文章中爬取的都是HTML文件,可以借用BeautifulSoup库来对请求的数据进行解析,现在的数据是json,该怎么解析呢?主要通过json方法将响应的json类型字符串转换为列表,剩下的工作就好办了,代码如下:

import requests

import time

for i in range(0,100,20):#爬取前5页100条电影信息

url = 'https://movie.douban.com/j/chart/top_list?type=20&interval_id=100%3A90&action=&start={}&limit=20'.format(i)

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}

response = requests.get(url,headers = headers)

items = response.json()#利用json()函数把json转换为列表,列表中的每个元素都是字典形式,一个字典包含一部电影的信息

time.sleep(2)

for item in items:

rank = item.get('rank')#通过字典的get方法返回key对应的value值

name = item.get('title')#通过字典的get方法返回key对应的value值

print(rank,name)

运行结果如下:

可以看到前100条电影信息已经成功抓取。

总结

AJAX技术的网页爬取跟以往的不同之处:

一是,地址栏的URL不是真正包含重要信息的地址,需要通过浏览器审查元素找到包含所需信息网页的真实地址;

二是,通过requests请求到的数据大都是json格式,不是以往的HTML,不需要BeautifulSoup库来解析网页,而是先用json()方法把json格式转换为列表形式再获取需要的信息。

#本案例的网页是最基本的AJAX网页,包含所需信息网页的真实地址比较好找,大多数网页没有JS功底的话真实地址较难获取,只能通过selenium模拟浏览器的方法爬取。

python提取ajax异步加载数据_python爬取豆瓣电影分类排行榜引出的异步加载(AJAX)问题...相关推荐

  1. Python爬虫实战003:爬取豆瓣电影分类排行榜

    import requests import jsonif __name__ == '__main__':url = "https://movie.douban.com/j/chart/to ...

  2. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  3. python大规模获取豆瓣影评_python爬取豆瓣电影排行榜(requests)

    ''' 爬取豆瓣电影排行榜 设计思路: 1.先获取电影类型的名字以及特有的编号 2.将编号向ajax发送get请求获取想要的数据 3.将数据存放进excel表格中 ''' 环境部署: 软件安装: 模块 ...

  4. python爬取豆瓣电影并分析_Python爬取豆瓣电影的短评数据并进行词云分析处理

    前言 对于爬虫很不陌生,而爬虫最为经典的案例就是爬取豆瓣上面的电影数据了,今天小编就介绍一下如果爬取豆瓣上面电影影评,以<我不是药神>为例. 基本环境配置 版本:Python3.6 相关模 ...

  5. python爬虫猫眼电影票房_python爬取猫眼电影top100排行榜

    爬取猫眼电影TOP100(http://maoyan.com/board/4?offset=90) 1). 爬取内容: 电影名称,主演, 上映时间,图片url地址保存到mariadb数据库中; 2). ...

  6. 按15分钟取数据_Python爬取猫眼电影《飞驰人生》4万多条评论并对其进行数据分析...

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Yura不说数据说 ,PYuraL PS:如有需要Python学习资 ...

  7. python爬取豆瓣电影top250_Python 爬取豆瓣电影Top250排行榜,爬虫初试

    from bs4 import BeautifulSoup import openpyxl import re import urllib.request import urllib.error # ...

  8. python爬取网页json数据_python爬取json数据库

    手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. [二. ...

  9. Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题

      比如我们今天的案例,豆瓣电影分类页面.根本没有什么翻页,需要点击"加载更多"新的电影信息,前面的黑科技瞬间被秒--   又比如知乎关注的人列表页面:   我复制了其中两个人昵称 ...

最新文章

  1. 我当了二十几年总经理,总结出这10条经验,看懂了你将少走些弯路
  2. linux 软件集成工具箱,在PB中动态修改SQL语句
  3. pytorch Spawning 子线程
  4. html文件div盒子浮动,css基础03-盒模型、网站布局思想、浮动以及浮动带来的影响...
  5. 经典类与新式类的继承顺序
  6. LeetCode每日一题:N叉树的层序遍历(No.429)
  7. PAT (Basic Level) Practice (中文)1001 害死人不偿命的(3n+1)猜想 (15 分)
  8. java跟python对比_【多年的Java程序员总结Java与Python的对比 】
  9. Android之通过用户名和密码连接指定wifi热点(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1问题)
  10. java 类型转换 安全_JAVA 类型转换指令
  11. java ajax 定时刷新_用ajax技术实现无闪烁定时刷新页面
  12. 类的别名java,类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:typeAliases typeAlias ali...
  13. 操作系统实战45讲01:运行HelloOS
  14. 用TensorFlow训练一个目标检测器(手把手教学版)
  15. Java 垃圾回收机制原理
  16. 英尺英寸和厘米的换算_英尺米换算(英尺英寸与厘米换算器)
  17. Win7安装CENTOS
  18. matlab 多变量最小值,【求助】用fmincon求含有多组变量的目标函数的最小值问题...
  19. 苹果内存不够怎么办_内存硬盘不够用怎么办?手把手教你给自己的笔记本更换,超实用!...
  20. UOS 加锁文件夹/文件之解锁

热门文章

  1. 【Matlab】Romberg求积公式求积分
  2. WebSocket的简单使用
  3. 狙击P7!阿里大佬亲授“Java性能调优技术宝典”,太完整了!
  4. 8.17 婚礼上的小杉 1533
  5. SQL注入漏洞,攻防必杀技!
  6. 黑作坊风光大师完美破解版
  7. Flexbuild主要功能介绍(基于LS1028ARDB)
  8. 复现贪吃蛇程序——构造小蛇
  9. c#超火表白程序(详细版)
  10. ASCII、ISO8859-1、GB2312、GBK、GB18030、BIG5、UNICODE、UTF-8、ANSI等字符集编码的讲解与特点