第7章-异步加载与请求头课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第7章-异步加载与请求头课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 异步 加载 请求 课件
- 资源描述:
-
1、Python Crawler Development Python Crawler Development 极客学院极客学院 JJ互联网互联网+职业技能系列职业技能系列PythonPython爬虫开发爬虫开发 从入门从入门到实战(微课版)到实战(微课版)人民邮电出版社人民邮电出版社谢乾坤谢乾坤著著第第7 7章章 异步异步加载与请求头加载与请求头 如果如果读者在本世纪初就接触过互联网,那么应该会记得,那个读者在本世纪初就接触过互联网,那么应该会记得,那个时候每单击一个链接,浏览器就会短暂地时候每单击一个链接,浏览器就会短暂地“白屏白屏”一两秒,然后才一两秒,然后才会进入一个新的页面。不同的页面,
2、网址也是不一样的。会进入一个新的页面。不同的页面,网址也是不一样的。随着随着技术的不断进步,现在不少网站已经引入了异步加载技术,技术的不断进步,现在不少网站已经引入了异步加载技术,单击新的链接以后,几乎看不到单击新的链接以后,几乎看不到“白屏白屏”的现象了。而且更神奇的的现象了。而且更神奇的是,单击了链接,网页的内容已经发生了改变,但是网址竟然没有是,单击了链接,网页的内容已经发生了改变,但是网址竟然没有变变。通过通过这一章的学习,你将会掌握如下知识。这一章的学习,你将会掌握如下知识。(1)抓取异步加载的数据。)抓取异步加载的数据。(2)伪造)伪造HTTP请求头。请求头。(3)模拟浏览器获取网
3、站数据。)模拟浏览器获取网站数据。7 7.1.1 异步加载异步加载7.1.1 AJAX7.1.1 AJAX技术介绍技术介绍 AJAX是是Asynchronous JavaScript And XML的首字母缩写,意的首字母缩写,意为异步为异步JavaScript与与XML。使用使用AJAX技术,可以在不刷新网页的情况下更新网页数据。使技术,可以在不刷新网页的情况下更新网页数据。使用用AJAX技术的网页,一般会使用技术的网页,一般会使用HTML编写网页的框架。编写网页的框架。在打开网页的时候,首先加载的是这个框架。剩下的部分将会在在打开网页的时候,首先加载的是这个框架。剩下的部分将会在框架加载完
4、成以后再通过框架加载完成以后再通过JavaScript从后台加载。从后台加载。如何如何判断一个网页有没有使用判断一个网页有没有使用AJAX技术呢?请访问技术呢?请访问http:/exercise.kingname.info/exercise_ajax_1.html,这个页面用浏览器,这个页面用浏览器访问的结果如图访问的结果如图7-1所示。所示。但是但是如果检查它的源代码,会发现源代码里面并没有网页上如果检查它的源代码,会发现源代码里面并没有网页上面显示的这两段文字,如图面显示的这两段文字,如图7-2所示。所示。图图7-1 异步加载异步加载练习页面练习页面1 图图7-2 使用异步加载技术的网页,
5、数据不在源代码中使用异步加载技术的网页,数据不在源代码中7.1.2 JSON7.1.2 JSON介绍与应用介绍与应用 JSON的全称是的全称是JavaScript Object Notation,是一种轻量级的,是一种轻量级的数据交换格式。网络之间使用数据交换格式。网络之间使用HTTP方式传递数据的时候,绝大多方式传递数据的时候,绝大多数情况下传递的都是字符串。数情况下传递的都是字符串。因此,当需要把因此,当需要把Python里面的数据发送给网页或者其他编程里面的数据发送给网页或者其他编程语言的时候,可以先将语言的时候,可以先将Python的数据转化为的数据转化为JSON格式的字符串,格式的字
6、符串,然后将字符串传递给其他语言,其他语言再将然后将字符串传递给其他语言,其他语言再将JSON格式的字符串格式的字符串转换为它自己的数据格式。转换为它自己的数据格式。为了为了直观地观察一个直观地观察一个JSON格式的字符串,先在格式的字符串,先在Python中初中初始化一个字典:始化一个字典:person=basic_info:name:kingname,age:24,sex:male,merry:False,work_info:salary:99999,position:engineer,department:None 不仅不仅是字典,是字典,Python中的列表或者包含字典的列表,也可中的
7、列表或者包含字典的列表,也可以转换为以转换为JSON格式的字符串,如图格式的字符串,如图7-3所示。所示。如果如果要把要把JSON格式的字符串转换为格式的字符串转换为Python的字典或者列表,的字典或者列表,只需要使用一行代码即可:只需要使用一行代码即可:person_dict=json.loads(person_json_indent)这里这里得到的得到的person_dict就是一个字典,可以像使用普通字就是一个字典,可以像使用普通字典一样来使用它,如图典一样来使用它,如图7-4所示。所示。图图7-3 将包含字典的列表转换为将包含字典的列表转换为JSON格式的字符串格式的字符串 图图7-
8、4 把把JSON格式的格式的字符串转换为字典字符串转换为字典7.1.3 7.1.3 异步异步GETGET与与POSTPOST请求请求 使用使用异步加载技术的网站,被加异步加载技术的网站,被加载的内容是不能在源代码中找到的。载的内容是不能在源代码中找到的。对于这种情况,应该如何抓取被加载对于这种情况,应该如何抓取被加载的内容呢?的内容呢?为了为了解决这个问题,就需要使用解决这个问题,就需要使用GoogleChrome浏览器的开发者模式。浏览器的开发者模式。在网页上单击右键,选择在网页上单击右键,选择“检查检查”命命令,然后定位到令,然后定位到“Network”选项卡,选项卡,如图如图7-5所示所
9、示。图图7-5 打开打开Google Chrome开发者工具开发者工具 接下来接下来需要刷新网页。在需要刷新网页。在Windows下,下,按按F5键或者单击地址栏左边的键或者单击地址栏左边的“刷新刷新”按按钮,在钮,在MacOS下,按下,按Shift+Command+R组组合键或者单击地址栏左边的合键或者单击地址栏左边的“刷新刷新”按钮。按钮。刷新以后,可以看到刷新以后,可以看到“Network”选项卡选项卡下面出现了一些内容,如图下面出现了一些内容,如图7-6所示。所示。图图7-6 刷新网页以后,刷新网页以后,“Network”选项卡下出现的内容选项卡下出现的内容 单击单击“Network”
10、选项卡下面出现的选项卡下面出现的“ajax_1_backend”和和“ajax_1_postbackend”,并定位到,并定位到“Response”选项卡,可以选项卡,可以看到这里出现了网页上面的内容,如图看到这里出现了网页上面的内容,如图7-7和图和图7-8所示。所示。图图7-7 被异步加载的数据之一,使用被异步加载的数据之一,使用GET方式方式 图图7-8 被异步加载的数据之二,使用被异步加载的数据之二,使用POST方式方式 再再选择选择“Headers”选项卡,可以看到这个请求使用选项卡,可以看到这个请求使用GET方式,方式,发送到发送到http:/exercise.kingname.i
11、nfo/ajax_1_backend,其头部,其头部信息如图信息如图7-9所示。所示。于是于是,尝试使用,尝试使用requests发送这个请求,即可成功获取到网发送这个请求,即可成功获取到网页上的第页上的第1条内容,如图条内容,如图7-10所示。所示。图图7-9 使用使用GET方式的异步请求的头部信息方式的异步请求的头部信息 图图7-10 使用使用requests获得被异步加载的信息获得被异步加载的信息 对于对于网页中的第网页中的第2条内容,查看条内容,查看“Headers”选项卡,可以看到,这是选项卡,可以看到,这是使用使用POST方式向方式向http:/exercise.kingname.
12、info/ajax_1_postbackend发送请发送请求,并以求,并以JSON格式提交数据,其头部信息如图格式提交数据,其头部信息如图7-11所示。所示。使用使用requests发送这个请求,也成功地获取了网页上面的第发送这个请求,也成功地获取了网页上面的第2条信息。条信息。通过修改请求的数据内容,还能够修改网页的返回内容,如图通过修改请求的数据内容,还能够修改网页的返回内容,如图7-12所示。所示。图图7-11 使用使用POST方式的异步请求的头部方式的异步请求的头部信息信息图图7-12 使用使用requests模拟发送模拟发送POST请求获取第请求获取第2条异步加载内容条异步加载内容7
13、.1.4 7.1.4 特殊的异步加载特殊的异步加载 7.1.3小节中介绍的是最常见、最小节中介绍的是最常见、最简单的异步加载情况,但并非所有的简单的异步加载情况,但并非所有的异步加载都会向后台发送请求。打开异步加载都会向后台发送请求。打开AJAX的第的第2个练习页面,可以看到页个练习页面,可以看到页面上有图面上有图7-13所示的内容。所示的内容。图图7-13 异步加载练习页面异步加载练习页面2 分析分析Chrome开发者工具的开发者工具的“Network”选项卡下面的内容,可以看到整个页面的选项卡下面的内容,可以看到整个页面的打开过程并没有尝试请求后台的行为。其打开过程并没有尝试请求后台的行为
14、。其中的中的exercise_ajax_2.html就是这个页面自就是这个页面自身,而身,而jquery-3.2.1.min.js是是jQuery的库,的库,都不是对后台的请求。打开网页源代码可都不是对后台的请求。打开网页源代码可以看到,确实没有以看到,确实没有“天王盖地虎天王盖地虎”这几个这几个汉字,如图汉字,如图7-14所示。所示。图图7-14 网页源代码中确实没有网页中的内容网页源代码中确实没有网页中的内容 那么这个页面上的汉字到底是从哪里加载进来的?这种情况称那么这个页面上的汉字到底是从哪里加载进来的?这种情况称为伪装成异步加载的后端渲染。数据就在源代码里,但却不直接显为伪装成异步加载
15、的后端渲染。数据就在源代码里,但却不直接显示出来。注意,源代码最下面的示出来。注意,源代码最下面的JavaScript代码,其中有一段:代码,其中有一段:code:u884cu52a8u4ee3u53f7uff1au5929u738bu76d6u5730u864e 其外形看起来有点像其外形看起来有点像JSON格式的字符串。尝试使用格式的字符串。尝试使用Python去去解析,发现可以得到网页上面的内容,如图解析,发现可以得到网页上面的内容,如图7-15所示。所示。图图7-15 解析解析JSON字符串得到网页上显示的内容字符串得到网页上显示的内容 这种这种假的异步加载页面,其处理思路一般是使用正则
16、表达假的异步加载页面,其处理思路一般是使用正则表达式从页面中把数据提取出来,然后直接解析。对于异步加载练式从页面中把数据提取出来,然后直接解析。对于异步加载练习页面习页面2,完整的处理代码为:,完整的处理代码为:importjson importrequests importre url=http:/exercise.kingname.info/exercise_ajax_2.html html=requests.get(url).content.decode()code_json=re.search(secret=(.*?),html,re.S).group(1)code_dict=json
17、.loads(code_json)print(code_dictcode)运行运行后的结果如图后的结果如图7-16所示。所示。图图7-16 获取假异步加载的数据获取假异步加载的数据7.1.5 7.1.5 多次请求的异步加载多次请求的异步加载图图7-17 7-17 异步加载练习页面异步加载练习页面3 3 还有一些网页,显示在页面上还有一些网页,显示在页面上的内容要经过多次异步请求才能得的内容要经过多次异步请求才能得到。第到。第1个个AJAX请求返回的是第请求返回的是第2个请求的参数,第个请求的参数,第2个请求的返回内个请求的返回内容又是第容又是第3个请求的参数,只有得到个请求的参数,只有得到了上
18、一个请求里面的有用信息,才了上一个请求里面的有用信息,才能发起下一个请求。能发起下一个请求。打开异步加载练习页打开异步加载练习页3,页面内,页面内容如图容如图7-17所示。所示。通过通过分析分析Chrome开发者工具的请求,不难发现这一条信息是通开发者工具的请求,不难发现这一条信息是通过向过向http:/exercise.kingname.info/ajax_3_postbackend这个地址发送这个地址发送POST请求得到的,如图请求得到的,如图7-18所示。所示。图图7-18 通过通过Chrome开发者工具找到页面信息的来源开发者工具找到页面信息的来源 其中其中,返回的,返回的JSON格式
19、的字符串经过格式的字符串经过Python解析,可以得解析,可以得到页面上的文字,如图到页面上的文字,如图7-19所示。所示。图图7-19 使用使用Python解析发现请求返回的内容确实是页面内容解析发现请求返回的内容确实是页面内容 在在“Headers”选项卡查看这个选项卡查看这个POST请求的具体参数,在请求的具体参数,在body里面发现两个里面发现两个奇怪的参数奇怪的参数secret1和和secret2,如图,如图7-20所示。所示。图图7-20 分析请求的分析请求的body信息发现两信息发现两个个奇怪奇怪参数参数secret1和和secret2 到目前为止,一切看起来都和到目前为止,一切
20、看起来都和7.1.3小小节中的节中的POST请求一样。但是在请求一样。但是在7.1.3小节小节里面提交的参数是可以随便修改的,那么里面提交的参数是可以随便修改的,那么在这里如果随便修改会怎么样呢?尝试修在这里如果随便修改会怎么样呢?尝试修改改secret1和和secret2,发现,发现POST请求无法请求无法得到想要的结果,如图得到想要的结果,如图7-21所示。所示。图图7-21 修改修改secret1或者或者secret2发现不能得到想要的结果发现不能得到想要的结果 打开打开这个练习页的源代码,在源代码中可以找到这个练习页的源代码,在源代码中可以找到secret_2,如图如图7-22所示。虽
21、然在所示。虽然在POST参数中,名字是参数中,名字是secret2,而源代码,而源代码中的名字是中的名字是secret_2,不过从值可以看出这就是同一个参数。,不过从值可以看出这就是同一个参数。图图7-22 在源代码中找到在源代码中找到secret_2 源代码源代码里面没有里面没有secret1,因此就要考虑这个参数是不是来自,因此就要考虑这个参数是不是来自于另一个异步请求于另一个异步请求。继续继续在开发者工具中查看其他请求,可以成功找到在开发者工具中查看其他请求,可以成功找到secret1,如图如图7-23所示。注意,它的名字变为了所示。注意,它的名字变为了“code”,但是从值可以,但是从
22、值可以看出这就是看出这就是secret1。不少网站也会使用这种改名字的方式来迷。不少网站也会使用这种改名字的方式来迷惑爬虫开发者。惑爬虫开发者。图图7-23 在另一个异步请求里面发现了在另一个异步请求里面发现了secret1 这这一条请求就是一个不带任何参数的一条请求就是一个不带任何参数的GET请求,请求的头部请求,请求的头部信息如图信息如图7-24所示。所示。对于对于这种多次请求才能得到数据的情况,解决办法就是逐这种多次请求才能得到数据的情况,解决办法就是逐一请求,得到返回结果以后再发起下一个请求。具体到这个例一请求,得到返回结果以后再发起下一个请求。具体到这个例子中,那就是先从源代码里面获
23、得子中,那就是先从源代码里面获得secret2,再通过,再通过GET请求得到请求得到secret1,最后使用,最后使用secret1和和secret2来获取页面上显示的内容。来获取页面上显示的内容。使用使用Python来实现这个过程,代码和运行结果如图来实现这个过程,代码和运行结果如图7-25所示。所示。图图7-24 获得获得secret1的请求的头部信息的请求的头部信息 图图7-25 使用使用Python模拟多次异步请求并获得页面上的值模拟多次异步请求并获得页面上的值7.1.6 7.1.6 基于异步加载的简单登录基于异步加载的简单登录 网站的登录方式有很多种,其中有一种比较简单的方式,就是使
24、用网站的登录方式有很多种,其中有一种比较简单的方式,就是使用AJAX发送请求来进行登录。请打开发送请求来进行登录。请打开AJAX第第4个练习页个练习页http:/exercise.kingname.info/exercise_ajax_4.html,这个页面实现了简单的登录功能。,这个页面实现了简单的登录功能。页面打开以后的效果如图页面打开以后的效果如图7-26所示。所示。根据输入框中的提示,使用用户名根据输入框中的提示,使用用户名“kingname”和密码和密码“genius”进进行登录,可以看到登录成功以后弹出图行登录,可以看到登录成功以后弹出图7-27所示的提示框。所示的提示框。图图7-
25、26 使用异步加载实现的登录页面使用异步加载实现的登录页面 图图7-27 登录成功后弹出的提示框登录成功后弹出的提示框 对于对于这种简单的登录功能,可以这种简单的登录功能,可以使用抓取异步加载网页的方式来进行使用抓取异步加载网页的方式来进行处理。在处理。在Chrome开发者工具中可以发开发者工具中可以发现,当单击现,当单击“登录登录”按钮时,网页向按钮时,网页向后台发送了一条请求,如图后台发送了一条请求,如图7-28所示。所示。图图7-28 登录过程实际上是一个异步的请求登录过程实际上是一个异步的请求 这这条请求返回的内容就是条请求返回的内容就是“通通关口令关口令”。再来看看这个请求发送。再来
展开阅读全文