第7章-异步加载与请求头课件.pptx

上传人(卖家):晟晟文业 文档编号:4907175 上传时间:2023-01-24 格式:PPTX 页数:82 大小:7.09MB
下载 相关 举报
第7章-异步加载与请求头课件.pptx_第1页
第1页 / 共82页
第7章-异步加载与请求头课件.pptx_第2页
第2页 / 共82页
第7章-异步加载与请求头课件.pptx_第3页
第3页 / 共82页
第7章-异步加载与请求头课件.pptx_第4页
第4页 / 共82页
第7章-异步加载与请求头课件.pptx_第5页
第5页 / 共82页
点击查看更多>>
资源描述

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 登录过程实际上是一个异步的请求登录过程实际上是一个异步的请求 这这条请求返回的内容就是条请求返回的内容就是“通通关口令关口令”。再来看看这个请求发送。再来

26、看看这个请求发送了哪些数据,如图了哪些数据,如图7-29所示。所示。图图7-29 登录请求发送的数据登录请求发送的数据 这这就是使用就是使用POST方式的最简单的方式的最简单的AJAX请求。使用获取请求。使用获取POST方式的方式的AJAX请求的代码,就能成功获取请求的代码,就能成功获取到到登录以后返回的内容,登录以后返回的内容,如图如图7-30所示。所示。图图7-30 使用使用AJAX请求获得登录返回的内容请求获得登录返回的内容7.2 7.2 请求头(请求头(HeadersHeaders)7.2.1 7.2.1 请求头的作用请求头的作用 使用计算机网页版外卖网站的读者应该会发现这样一个现象:

27、第使用计算机网页版外卖网站的读者应该会发现这样一个现象:第一次登录外卖网页的时候会让你选择当前所在的商业圈,一旦选定好一次登录外卖网页的时候会让你选择当前所在的商业圈,一旦选定好之后关闭浏览器再打开,网页就会自动定位到先前选择的商业圈。之后关闭浏览器再打开,网页就会自动定位到先前选择的商业圈。又比如,例如携程的网站,使用计算机浏览器打开的时候,页面又比如,例如携程的网站,使用计算机浏览器打开的时候,页面看起来非常复杂多样,如图看起来非常复杂多样,如图7-31所示。所示。但同一个网址,使用手机浏览器打开时,网址会自动发生改变,但同一个网址,使用手机浏览器打开时,网址会自动发生改变,而且得到的页面

28、竟然完全不同,如图而且得到的页面竟然完全不同,如图7-32所示。所示。图图7-31 计算机网页版携程首页计算机网页版携程首页 图图7-32 手机版携程首页手机版携程首页 网站网站怎么知道现在是计算机浏览器还是手机浏览器在访问这个怎么知道现在是计算机浏览器还是手机浏览器在访问这个页面呢?网站怎么能记住地理位置呢?这就要归功于页面呢?网站怎么能记住地理位置呢?这就要归功于Headers了了。Headers称为请求头,浏览器可以将一些信息通过称为请求头,浏览器可以将一些信息通过Headers传递传递给服务器,服务器也可以将一些信息通过给服务器,服务器也可以将一些信息通过Headers传递给浏览器。电

29、传递给浏览器。电商网站常常应用的商网站常常应用的Cookies就是就是Headers里面的一个部分。里面的一个部分。7.2.2 7.2.2 伪造请求头伪造请求头 打开练习页打开练习页http:/exercise.kingname.info/exercise_headers.html,使,使用用Chrome的开发者工具监控这个页面的网页请求,可以看到图的开发者工具监控这个页面的网页请求,可以看到图7-33所示所示的内容。的内容。图图7-33 请求头练习页请求头练习页 页面页面看起来像是发起了一个普通的看起来像是发起了一个普通的GET方式的异步请求给方式的异步请求给http:/exercise.k

30、ingname.info/exercise_headers_backend。使用。使用requests尝试获取这个网址的返回信息,结果如图尝试获取这个网址的返回信息,结果如图7-34所示。所示。图图7-34 使用使用requests访问请求头练习页面失败访问请求头练习页面失败 使用使用浏览器访问网站的时候,网站可以看到一个名称为浏览器访问网站的时候,网站可以看到一个名称为Headers(请求头)的东西,它的内容如图(请求头)的东西,它的内容如图7-35所示。所示。图图7-35 使用浏览器访问网站后台显示的使用浏览器访问网站后台显示的Headers信息信息 如果如果使用使用requests访问,

31、请求头的内容如图访问,请求头的内容如图7-36所示。所示。图图7-36 使用使用requests访问网站,后台显示的访问网站,后台显示的Headers信息信息 为了为了解决这个问题,就需要给爬虫解决这个问题,就需要给爬虫“换头换头”。把浏览器的。把浏览器的头安装到爬虫的身上,这样网站就不知道谁是谁了。要换头,头安装到爬虫的身上,这样网站就不知道谁是谁了。要换头,首先就需要知道浏览器的头是什么样的。因此需要在首先就需要知道浏览器的头是什么样的。因此需要在Chrome浏浏览器开发者工具的览器开发者工具的“Network”选项卡的选项卡的RequestHeaders里面观里面观察这一次请求的请求头,

32、如图察这一次请求的请求头,如图7-37所示。所示。图图7-37 浏览器发起的请求的头部信息浏览器发起的请求的头部信息 在在requests里面,设置请求头的参数名称为里面,设置请求头的参数名称为“headers”,它,它的值是一个字典。带有请求头的请求,使用的值是一个字典。带有请求头的请求,使用requests的发送格式为:的发送格式为:html=requests.get(url,headers=字典字典).content.decode()html=requests.post(url,json=xxx,headers=字典字典).content.decode()代码代码中的字典就对应了浏览器中

33、的请求头。在爬虫里面创建中的字典就对应了浏览器中的请求头。在爬虫里面创建一个字典,将一个字典,将Chrome的请求头的内容复制进去,并调整好格式,的请求头的内容复制进去,并调整好格式,发起一个带有发起一个带有Chrome请求头的爬虫请求,可以发现请求获得成功,请求头的爬虫请求,可以发现请求获得成功,如图如图7-38所示。所示。图图7-38 更换了更换了Chrome头部以后爬虫访问成功头部以后爬虫访问成功 虽然虽然对于某些网站,在请求头里面对于某些网站,在请求头里面只需要设置只需要设置User-Agent就可以正常访问了,就可以正常访问了,但是为了保险起见,还是建议把所有项但是为了保险起见,还是

34、建议把所有项目都带上,这样可以让爬虫更目都带上,这样可以让爬虫更“像像”浏浏览器。例如本练习,如果仅仅设置览器。例如本练习,如果仅仅设置User-Agent的话,会得到图的话,会得到图7-39所示的返回信所示的返回信息。息。图图7-39 仅仅修改仅仅修改User-Agent是不能骗过练习网站的是不能骗过练习网站的7.3 7.3 模拟浏览器模拟浏览器 有一些有一些网站在发起网站在发起AJAX请求的时候,会带上特殊的字符串请求的时候,会带上特殊的字符串用于身份验证。这种字符串称为用于身份验证。这种字符串称为Token。为了简单起见,请打开。为了简单起见,请打开练习页面,这个页面在发起练习页面,这个

35、页面在发起AJAX请求的时候会在请求的时候会在Headers中带上中带上一个参数一个参数ReqTime;在;在POST发送的数据中会有一个参数发送的数据中会有一个参数sum,如,如图图7-40所示。所示。图图7-40 较为复杂的异步加载练习页面较为复杂的异步加载练习页面 多次多次刷新页面,可以发现刷新页面,可以发现ReqTime和和sum一直在变化。如果一直在变化。如果requests只固定使用某个只固定使用某个ReqTime与与sum的组合来发起请求,就的组合来发起请求,就会出现图会出现图7-41所示的返回信息。所示的返回信息。不难不难看出看出ReqTime是精确到毫秒的时间戳,即使使用是精

36、确到毫秒的时间戳,即使使用Python生成了一个时间戳,也不能得到网页上面的内容,如图生成了一个时间戳,也不能得到网页上面的内容,如图7-42所示。所示。图图7-41 如果使用固定的参数就会导致爬虫爬不到数据如果使用固定的参数就会导致爬虫爬不到数据 图图7-42 仅仅修改时间戳是不能让爬虫成功的仅仅修改时间戳是不能让爬虫成功的7.3.1 Selenium7.3.1 Selenium介绍介绍 虽然在网页的源代码中无虽然在网页的源代码中无法看到被异步加载的内容,但法看到被异步加载的内容,但是在是在Chrome的开发者工具的的开发者工具的“Elements”选项卡下却可以选项卡下却可以看到网页上的内

37、容,如图看到网页上的内容,如图7-43所示。所示。图图7-43 在开发者工具的在开发者工具的“Elements”选项卡选项卡下下可以可以看到被加载的内容看到被加载的内容7.3.2 Selenium7.3.2 Selenium安装安装 使用使用pip安装安装Selenium:pip install selenium 安装情况如图安装情况如图7-44所示。所示。图图7-44 安装安装Selenium 下载下载ChromeDriver,根据自己的系统选择合适的版本,如图,根据自己的系统选择合适的版本,如图7-45所示。所示。图图7-45 根据自己的系统选择合适的版本根据自己的系统选择合适的版本7.3

38、.3 Selenium7.3.3 Selenium的使用的使用1获取源代码获取源代码 将将chromedriver与代码放在同一个文件夹中以方便代码直与代码放在同一个文件夹中以方便代码直接调用。初始化接调用。初始化Selenium只需要两行代码,导入只需要两行代码,导入Selenium库,库,再指定再指定WebDriver,如图,如图7-46所示。所示。图图7-46 初始化初始化Selenium 第第3行代码指定了行代码指定了Selenium使用使用ChromeDriver来操作来操作Chrome解析网页,括号里的参数就是解析网页,括号里的参数就是ChromeDriver可执行文件的地址。可执

39、行文件的地址。如果如果要使用要使用PhantomJS,只需要修改第,只需要修改第3行代码即可:行代码即可:driver=webdriver.PhantomJS(./phantomjs)同样同样,需要将,需要将PhantomJS的可执行文件与代码放在一起。的可执行文件与代码放在一起。需要需要特别提醒的是,如果特别提醒的是,如果chromedriver与代码不在一起,可与代码不在一起,可以通过绝对路径来指定,例如:以通过绝对路径来指定,例如:driver=webdriver.Chrome(/usr/bin/chromedriver)使用使用Windows的读者在写这个参数的时候,要注意反斜杠的的读

40、者在写这个参数的时候,要注意反斜杠的问题。问题。“”这个符号叫作反斜杠,在这个符号叫作反斜杠,在Windows中作为路径的分中作为路径的分隔符。但是由于转义字符也是反斜杠,所以如果把隔符。但是由于转义字符也是反斜杠,所以如果把Windows下面下面的代码写为下面这样就会出问题。的代码写为下面这样就会出问题。driver=webdriver.Chrome(C:serverchromedriver.exe)因此因此,使用,使用Windows的读者可在路径字符串左引号的左边加的读者可在路径字符串左引号的左边加一个一个“r”符号,将代码写为:符号,将代码写为:driver=webdriver.Chro

41、me(rC:serverchromedriver.exe)这样这样Python就能正确处理反斜杠的问题。就能正确处理反斜杠的问题。初始化初始化完成以后,就可以使用完成以后,就可以使用Selenium打开网页了。要打开一个网打开网页了。要打开一个网页只需要一行代码:页只需要一行代码:driver.get(http:/exercise.kingname.info/exercise_advanced_ajax.html)代码代码运行以后会自动打开一个运行以后会自动打开一个Chrome窗口,并在窗口里面自动进窗口,并在窗口里面自动进入这个网址对应的页面。一旦被异步加载的内容已经出现在了这个自入这个网址

42、对应的页面。一旦被异步加载的内容已经出现在了这个自动打开的动打开的Chrome窗口中,那么此时使用下列代码:窗口中,那么此时使用下列代码:html=driver.page_source 就就能得到在能得到在Chrome开发者工具中出现的开发者工具中出现的HTML代码,如图代码,如图7-47所示所示。图图7-47 在在ChromeDriver加载页面完成以后可以得到加载以后的源代码加载页面完成以后可以得到加载以后的源代码 2等待信息出现等待信息出现 图图7-47所示的代码第所示的代码第6行设置了一个行设置了一个5s的延迟,这是由于的延迟,这是由于Selenium并不会等待网页加载完成再执行后面的

43、代码。它只是向并不会等待网页加载完成再执行后面的代码。它只是向ChromeDriver发发送了一个命令,让送了一个命令,让ChromeDriver打开某个网页打开某个网页。至于至于网页要开多久,网页要开多久,Selenium并不关心。由于被异步加载的内容会并不关心。由于被异步加载的内容会延迟出现,因此需要等待它出现以后再开始抓取。延迟出现,因此需要等待它出现以后再开始抓取。3在网页中获取元素在网页中获取元素 在在网页中寻找需要的内容,可以使用类似于网页中寻找需要的内容,可以使用类似于BeautifulSoup4的语法:的语法:element=driver.find_element_by_id(

44、passwd-id)#如果有多个符合条如果有多个符合条件的,返回第件的,返回第1个个 element=driver.find_element_by_name(passwd)#如果有多个符合如果有多个符合条件的,返回第条件的,返回第1个个 element_list=driver.find_elements_by_id(passwd-id)#以列表形式返以列表形式返回所有的符合条件的回所有的符合条件的element element_list=driver.find_elements_by_name(passwd)#以列表形式以列表形式返回所有的符合条件的返回所有的符合条件的element 也也可以

45、使用可以使用XPath:element=driver.find_element_by_xpath(/inputid=passwd-id)#如果有多个符合条件的,返回第如果有多个符合条件的,返回第1个个 element=driver.find_elements_by_xpath(/divid=passwd-id)#以列表形式返回所有的符合条件的以列表形式返回所有的符合条件的element 对于对于练习网站,使用练习网站,使用XPath获取网页的内容,运行结果如图获取网页的内容,运行结果如图7-48所示。所示。图图7-48 使用使用Selenium和和ChromeDriver获得练习网站的内容获得

46、练习网站的内容7.4 7.4 阶段案例阶段案例 在乐视网上寻找一个视频,爬取视频的评论信息。在乐视网上寻找一个视频,爬取视频的评论信息。7.4.1 7.4.1 需求分析需求分析 目标网站:目标网站:http:/。目标内容:爬取视频评论。目标内容:爬取视频评论。涉及的知识点:涉及的知识点:(1)分析网站的异步加载请求。)分析网站的异步加载请求。(2)使用)使用requests发送请求。发送请求。7.4.2 7.4.2 核心代码构建核心代码构建 在乐视网上打开一个视频,可以看到其部会评论页面如图在乐视网上打开一个视频,可以看到其部会评论页面如图7-49所示。所示。图图7-49 乐视网部分视频评论页

47、面乐视网部分视频评论页面 通过通过使用使用Chrome的开发者工具分析页面的异步加载请求,的开发者工具分析页面的异步加载请求,可以发现评论所在的请求如图可以发现评论所在的请求如图7-50所示。所示。可以可以使用使用Python来模拟这个请求,从而获取视频的评论信来模拟这个请求,从而获取视频的评论信息。息。在在请求的请求的URL里面有两个参数:里面有两个参数:vid和和pid。这两个参数在网。这两个参数在网页的源代码里面都可以找到,如图页的源代码里面都可以找到,如图7-51所示。所示。图图7-50 使用使用Chrome开发者工具观察评论的异步加载请求开发者工具观察评论的异步加载请求图图7-51

48、在网页源代码里面寻找在网页源代码里面寻找pid和和vid 爬虫爬虫首先访问视频页面,通过正则表达式获取首先访问视频页面,通过正则表达式获取vid和和pid,并将结,并将结果保存到果保存到“necessary_info”这个类属性对应的字典中。核心代码如这个类属性对应的字典中。核心代码如下:下:defget_necessary_id(self):source=self.get_source(self.url,self.HEADERS)vid=re.search(vid:(d+),source).group(1)pid=re.search(pid:(d+),source).group(1)self

49、.necessary_infoxid=vid self.necessary_infopid=pid 访问访问评论的接口,用评论的接口,用Python发起请求,获得评论数据。核发起请求,获得评论数据。核心代码如下:心代码如下:defget_comment(self):url=self.COMMENT_URL.format(xid=self.necessary_infoxid,pid=self.necessary_infopid)source=self.get_source(url,self.HEADERS)source_json=sourcesource.find():-1 comment_di

50、ct=json.loads(source_json)comments=comment_dictdata forcommentincomments:print(f发帖人:发帖人:commentuserusername,评论内容:评论内容:commentcontent)代码代码中,提前定义的中,提前定义的self.COMMENT_URL和和self.HEADERS如图如图7-52所示。所示。图图7-52 在代码中提前定义好在代码中提前定义好self.COMMENT_URL和和self.HEADERS7.4.3 7.4.3 调试与运行调试与运行 在爬虫中,带上通过在爬虫中,带上通过Chrome浏浏览

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第7章-异步加载与请求头课件.pptx)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|