第7章--异步加载与请求头

上传人:无*** 文档编号:208971670 上传时间:2023-05-12 格式:PPTX 页数:82 大小:7.09MB
收藏 版权申诉 举报 下载
第7章--异步加载与请求头_第1页
第1页 / 共82页
第7章--异步加载与请求头_第2页
第2页 / 共82页
第7章--异步加载与请求头_第3页
第3页 / 共82页
资源描述:

《第7章--异步加载与请求头》由会员分享,可在线阅读,更多相关《第7章--异步加载与请求头(82页珍藏版)》请在装配图网上搜索。

1、Python Crawler Python Crawler Development 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编写网写网页的框架。的框架。在打开网在打开网页的的时候,首先加候,首先加载的是的是这个框架。剩下的部分将会在个框架。剩下的部分将会在框架加框架加载完成以后再通完成以后再通过J

4、avaScript从后台加从后台加载。如何如何判断一个网判断一个网页有没有使用有没有使用AJAX技技术呢?呢?请访问http:/exercise.kingname.info/exercise_ajax_1.html,这个个页面用面用浏览器器访问的的结果如果如图7-1所示。所示。但是但是如果如果检查它的源代它的源代码,会,会发现源代源代码里面并没有网里面并没有网页上上面面显示的示的这两段文字,如两段文字,如图7-2所示。所示。图7-1 异步加异步加载练习页面面1 图7-2 使用异步加使用异步加载技技术的网的网页,数据不在源代,数据不在源代码中中7.1.2 JSON7.1.2 JSON介绍与应用介

5、绍与应用 JSON的全称是的全称是JavaScript Object Notation,是一种,是一种轻量量级的的数据交数据交换格式。网格式。网络之之间使用使用HTTP方式方式传递数据的数据的时候,候,绝大多大多数情况下数情况下传递的都是字符串。的都是字符串。因此,当需要把因此,当需要把Python里面的数据里面的数据发送送给网网页或者其他或者其他编程程语言的言的时候,可以先将候,可以先将Python的数据的数据转化化为JSON格式的字符串,然格式的字符串,然后将字符串后将字符串传递给其他其他语言,其他言,其他语言再将言再将JSON格式的字符串格式的字符串转换为它自己的数据格式。它自己的数据格

6、式。为了为了直观地观察一个直观地观察一个JSON格式的字符串,先在格式的字符串,先在Python中初中初始化一个字典:始化一个字典:person=person=basic_info:name:kingname,age:24,sex:male,merry:False,work_info:salary:99999,position:engineer,department:None 不仅不仅是字典,是字典,Python中的列表或者包含字典的列表,也可以中的列表或者包含字典的列表,也可以转换为转换为JSON格式的字符串,如图格式的字符串,如图7-3所示。所示。如果如果要把要把JSON格式的字符串转换为

7、格式的字符串转换为Python的字典或者列表,的字典或者列表,只需要使用一行代码即可:只需要使用一行代码即可:person_dict=json.loads(person_json_indent)这里这里得到的得到的person_dict就是一个字典,可以像使用普通字典就是一个字典,可以像使用普通字典一样来使用它,如图一样来使用它,如图7-4所示。所示。图7-3 将包含字典的列表将包含字典的列表转换为JSON格式的字符串格式的字符串 图7-4 把把JSON格式的格式的字符串字符串转换为字典字典7.1.3 7.1.3 异步异步GETGET与与POSTPOST请求请求 使用使用异步加载技术的网站,被

8、加异步加载技术的网站,被加载的内容是不能在源代码中找到的。载的内容是不能在源代码中找到的。对于这种情况,应该如何抓取被加载对于这种情况,应该如何抓取被加载的内容呢?的内容呢?为了为了解决这个问题,就需要使用解决这个问题,就需要使用GoogleChrome浏览器的开发者模式。浏览器的开发者模式。在网页上单击右键,选择在网页上单击右键,选择“检查检查”命命令,然后定位到令,然后定位到“Network”选项卡,选项卡,如图如图7-5所示所示。图7-5 打开打开Google Chrome开开发者工具者工具 接下来接下来需要刷新网页。在需要刷新网页。在Windows下,下,按按F5键或者单击地址栏左边的

9、键或者单击地址栏左边的“刷新刷新”按按钮,在钮,在MacOS下,按下,按Shift+Command+R组组合键或者单击地址栏左边的合键或者单击地址栏左边的“刷新刷新”按钮。按钮。刷新以后,可以看到刷新以后,可以看到“Network”选项卡选项卡下面出现了一些内容,如图下面出现了一些内容,如图7-6所示。所示。图7-6 刷新网刷新网页以后,以后,“Network”选项卡下出卡下出现的内容的内容 单击单击“Network”选项卡下面出现的选项卡下面出现的“ajax_1_backend”和和“ajax_1_postbackend”,并定位到,并定位到“Response”选项卡,可以选项卡,可以看到这

10、里出现了网页上面的内容,如图看到这里出现了网页上面的内容,如图7-7和图和图7-8所示。所示。图7-7 被异步加被异步加载的数据之一,使用的数据之一,使用GET方式方式 图7-8 被异步加被异步加载的数据之二,使用的数据之二,使用POST方式方式 再再选择选择“Headers”选项卡,可以看到这个请求使用选项卡,可以看到这个请求使用GET方式,方式,发送到发送到http:/exercise.kingname.info/ajax_1_backend,其头部,其头部信息如图信息如图7-9所示。所示。于是于是,尝试使用,尝试使用requests发送这个请求,即可成功获取到网发送这个请求,即可成功获取

11、到网页上的第页上的第1条内容,如图条内容,如图7-10所示。所示。图7-9 使用使用GET方式的异步方式的异步请求的求的头部信息部信息 图7-10 使用使用requests获得被异步加得被异步加载的信息的信息 对于对于网页中的第网页中的第2条内容,查看条内容,查看“Headers”选项卡,可以看到,这是选项卡,可以看到,这是使用使用POST方式向方式向http:/exercise.kingname.info/ajax_1_postbackend发送请发送请求,并以求,并以JSON格式提交数据,其头部信息如图格式提交数据,其头部信息如图7-11所示。所示。使用使用requests发送这个请求,也

12、成功地获取了网页上面的第发送这个请求,也成功地获取了网页上面的第2条信息。条信息。通过修改请求的数据内容,还能够修改网页的返回内容,如图通过修改请求的数据内容,还能够修改网页的返回内容,如图7-12所示。所示。图7-11 使用使用POST方式的异步方式的异步请求的求的头部部信息信息图7-12 使用使用requests模模拟发送送POST请求求获取第取第2条异步加条异步加载内容内容7.1.4 7.1.4 特殊的异步加载特殊的异步加载 7.1.3小小节中介中介绍的是最常的是最常见、最、最简单的异步加的异步加载情况,但并非所有的情况,但并非所有的异步加异步加载都会向后台都会向后台发送送请求。打开求。

13、打开AJAX的第的第2个个练习页面,可以看到面,可以看到页面上有面上有图7-13所示的内容。所示的内容。图7-13 异步加异步加载练习页面面2 分析分析Chrome开开发者工具的者工具的“Network”选项卡下面的内容,可以看卡下面的内容,可以看到整个到整个页面的打开面的打开过程并没有程并没有尝试请求后求后台的行台的行为。其中的。其中的exercise_ajax_2.html就就是是这个个页面自身,而面自身,而jquery-3.2.1.min.js是是jQuery的的库,都不是,都不是对后台的后台的请求。打开求。打开网网页源代源代码可以看到,确可以看到,确实没有没有“天王盖天王盖地虎地虎”这

14、几个几个汉字,如字,如图7-14所示。所示。图7-14 网网页源代源代码中确中确实没有网没有网页中的内容中的内容 那么那么这个个页面上的面上的汉字到底是从哪里加字到底是从哪里加载进来的?来的?这种情况称种情况称为伪装成异步加装成异步加载的后端渲染。数据就在源代的后端渲染。数据就在源代码里,但却不直接里,但却不直接显示出来。注意,源代示出来。注意,源代码最下面的最下面的JavaScript代代码,其中有一段:,其中有一段:code:u884cu52a8u4ee3u53f7uff1au5929u738bu76d6u5730u864e 其外形看起来有点像其外形看起来有点像JSON格式的字符串。格式的

15、字符串。尝试使用使用Python去去解析,解析,发现可以得到网可以得到网页上面的内容,如上面的内容,如图7-15所示。所示。图7-15 解析解析JSON字符串得到网字符串得到网页上上显示的内容示的内容 这种这种假的异步加载页面,其处理思路一般是使用正则表达假的异步加载页面,其处理思路一般是使用正则表达式从页面中把数据提取出来,然后直接解析。对于异步加载练习式从页面中把数据提取出来,然后直接解析。对于异步加载练习页面页面2,完整的处理代码为:,完整的处理代码为:importjson importrequests importre url=http:/exercise.kingname.info/

16、exercise_ajax_2.html html=requests.get(url).content.decode()code_json=re.search(secret=(.*?),html,re.S).group(1)code_dict=json.loads(code_json)print(code_dictcode)print(code_dictcode)运行运行后的结果如图后的结果如图7-16所示。所示。图7-16 获取假异步加取假异步加载的数据的数据7.1.5 7.1.5 多次请求的异步加载多次请求的异步加载图图7-17 异步加载练习页面异步加载练习页面3 还有一些网有一些网页,显

17、示在示在页面上面上的内容要的内容要经过多次异步多次异步请求才能得求才能得到。第到。第1个个AJAX请求返回的是第求返回的是第2个个请求的参数,第求的参数,第2个个请求的返回内求的返回内容又是第容又是第3个个请求的参数,只有得到求的参数,只有得到了上一个了上一个请求里面的有用信息,才求里面的有用信息,才能能发起下一个起下一个请求。求。打开异步加打开异步加载练习页3,页面内面内容如容如图7-17所示。所示。通过通过分析分析Chrome开发者工具的请求,不难发现这一条信息是通开发者工具的请求,不难发现这一条信息是通过向过向http:/exercise.kingname.info/ajax_3_pos

18、tbackend这个地址发送这个地址发送POST请求得到的,如图请求得到的,如图7-18所示。所示。图7-18 通通过Chrome开开发者工具找到者工具找到页面信息的来源面信息的来源 其中其中,返回的,返回的JSON格式的字符串经过格式的字符串经过Python解析,可以得解析,可以得到页面上的文字,如图到页面上的文字,如图7-19所示。所示。图7-19 使用使用Python解析解析发现请求返回的内容确求返回的内容确实是是页面内容面内容 在在“Headers”选项卡查看这个选项卡查看这个POST请求的具体参数,在请求的具体参数,在body里面发现两个里面发现两个奇怪的参数奇怪的参数secret1

19、和和secret2,如图,如图7-20所示。所示。图7-20 分析分析请求的求的body信息信息发现两两个个奇怪奇怪参数参数secret1和和secret2 到目前到目前为止,一切看起来都和止,一切看起来都和7.1.3小小节中的中的POST请求一求一样。但是在。但是在7.1.3小小节里面提交的参数是可以随便修改的,那么里面提交的参数是可以随便修改的,那么在在这里如果随便修改会怎么里如果随便修改会怎么样呢?呢?尝试修修改改secret1和和secret2,发现POST请求无法求无法得到想要的得到想要的结果,如果,如图7-21所示。所示。图7-21 修改修改secret1或者或者secret2发现

20、不能得到想要的不能得到想要的结果果 打开打开这个练习页的源代码,在源代码中可以找到这个练习页的源代码,在源代码中可以找到secret_2,如图如图7-22所示。虽然在所示。虽然在POST参数中,名字是参数中,名字是secret2,而源代码中,而源代码中的名字是的名字是secret_2,不过从值可以看出这就是同一个参数。,不过从值可以看出这就是同一个参数。图7-22 在源代在源代码中找到中找到secret_2 源代码源代码里面没有里面没有secret1,因此就要考虑这个参数是不是来自,因此就要考虑这个参数是不是来自于另一个异步请求于另一个异步请求。继续继续在开发者工具中查看其他请求,可以成功找到

21、在开发者工具中查看其他请求,可以成功找到secret1,如图,如图7-23所示。注意,它的名字变为了所示。注意,它的名字变为了“code”,但是从值可,但是从值可以看出这就是以看出这就是secret1。不少网站也会使用这种改名字的方式来迷。不少网站也会使用这种改名字的方式来迷惑爬虫开发者。惑爬虫开发者。图7-23 在另一个异步在另一个异步请求里面求里面发现了了secret1 这这一条请求就是一个不带任何参数的一条请求就是一个不带任何参数的GET请求,请求的头部请求,请求的头部信息如图信息如图7-24所示。所示。对于对于这种多次请求才能得到数据的情况,解决办法就是逐这种多次请求才能得到数据的情况

22、,解决办法就是逐一请求,得到返回结果以后再发起下一个请求。具体到这个例子一请求,得到返回结果以后再发起下一个请求。具体到这个例子中,那就是先从源代码里面获得中,那就是先从源代码里面获得secret2,再通过,再通过GET请求得到请求得到secret1,最后使用,最后使用secret1和和secret2来获取页面上显示的内容。来获取页面上显示的内容。使用使用Python来实现这个过程,代码和运行结果如图来实现这个过程,代码和运行结果如图7-25所示。所示。图7-24 获得得secret1的的请求的求的头部信息部信息 图7-25 使用使用Python模模拟多次异步多次异步请求并求并获得得页面上的面

23、上的值7.1.6 7.1.6 基于异步加载的简单登录基于异步加载的简单登录 网站的登网站的登录方式有很多种,其中有一种比方式有很多种,其中有一种比较简单的方式,就是使用的方式,就是使用AJAX发送送请求来求来进行登行登录。请打开打开AJAX第第4个个练习页http:/exercise.kingname.info/exercise_ajax_4.html,这个个页面面实现了了简单的登的登录功能。功能。页面打开以后的效果如面打开以后的效果如图7-26所示。所示。根据根据输入框中的提示,使用用入框中的提示,使用用户名名“kingname”和密和密码“genius”进行登行登录,可以看到登,可以看到登

24、录成功以后成功以后弹出出图7-27所示的提示框。所示的提示框。图7-26 使用异步加使用异步加载实现的登的登录页面面 图7-27 登登录成功后成功后弹出的提示框出的提示框 对于对于这种简单的登录功能,可以这种简单的登录功能,可以使用抓取异步加载网页的方式来进行使用抓取异步加载网页的方式来进行处理。在处理。在Chrome开发者工具中可以发开发者工具中可以发现,当单击现,当单击“登录登录”按钮时,网页向按钮时,网页向后台发送了一条请求,如图后台发送了一条请求,如图7-28所示。所示。图7-28 登登录过程程实际上是一个异步的上是一个异步的请求求 这这条请求返回的内容就是条请求返回的内容就是“通通关

25、口令关口令”。再来看看这个请求发送。再来看看这个请求发送了哪些数据,如图了哪些数据,如图7-29所示。所示。图7-29 登登录请求求发送的数据送的数据 这这就是使用就是使用POST方式的最简单的方式的最简单的AJAX请求。使用获取请求。使用获取POST方式的方式的AJAX请求的代码,就能成功获取请求的代码,就能成功获取到到登录以后返回的内容,登录以后返回的内容,如图如图7-30所示。所示。图7-30 使用使用AJAX请求求获得登得登录返回的内容返回的内容7.2 7.2 请求头(请求头(HeadersHeaders)7.2.1 7.2.1 请求头的作用请求头的作用 使用使用计算机网算机网页版外版

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

27、示。图7-31 计算机网算机网页版携程首版携程首页 图7-32 手机版携程首手机版携程首页 网站网站怎么知道现在是计算机浏览器还是手机浏览器在访问这个怎么知道现在是计算机浏览器还是手机浏览器在访问这个页面呢?网站怎么能记住地理位置呢?这就要归功于页面呢?网站怎么能记住地理位置呢?这就要归功于Headers了了。Headers称为请求头,浏览器可以将一些信息通过称为请求头,浏览器可以将一些信息通过Headers传递传递给服务器,服务器也可以将一些信息通过给服务器,服务器也可以将一些信息通过Headers传递给浏览器。电传递给浏览器。电商网站常常应用的商网站常常应用的Cookies就是就是Head

28、ers里面的一个部分。里面的一个部分。7.2.2 7.2.2 伪造请求头伪造请求头 打开打开练习页http:/exercise.kingname.info/exercise_headers.html,使,使用用Chrome的开的开发者工具者工具监控控这个个页面的网面的网页请求,可以看到求,可以看到图7-33所示所示的内容。的内容。图7-33 请求求头练习页 页面页面看起来像是发起了一个普通的看起来像是发起了一个普通的GET方式的异步请求给方式的异步请求给http:/exercise.kingname.info/exercise_headers_backend。使用。使用requests尝试获取

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

30、s信息信息 为了为了解决这个问题,就需要给爬虫解决这个问题,就需要给爬虫“换头换头”。把浏览器的。把浏览器的头安装到爬虫的身上,这样网站就不知道谁是谁了。要换头,首头安装到爬虫的身上,这样网站就不知道谁是谁了。要换头,首先就需要知道浏览器的头是什么样的。因此需要在先就需要知道浏览器的头是什么样的。因此需要在Chrome浏览浏览器开发者工具的器开发者工具的“Network”选项卡的选项卡的RequestHeaders里面观察里面观察这一次请求的请求头,如图这一次请求的请求头,如图7-37所示。所示。图7-37 浏览器器发起的起的请求的求的头部信息部信息 在在requests里面,设置请求头的参数

31、名称为里面,设置请求头的参数名称为“headers”,它,它的值是一个字典。带有请求头的请求,使用的值是一个字典。带有请求头的请求,使用requests的发送格式为:的发送格式为:html=requests.get(url,headers=字典字典).content.decode()html=requests.post(url,json=xxx,headers=字典字典).content.decode()代码代码中的字典就对应了浏览器中的请求头。在爬虫里面创建中的字典就对应了浏览器中的请求头。在爬虫里面创建一个字典,将一个字典,将Chrome的请求头的内容复制进去,并调整好格式,的请求头的内容

32、复制进去,并调整好格式,发起一个带有发起一个带有Chrome请求头的爬虫请求,可以发现请求获得成功,请求头的爬虫请求,可以发现请求获得成功,如图如图7-38所示。所示。图7-38 更更换了了Chrome头部以后爬虫部以后爬虫访问成功成功 虽然虽然对于某些网站,在请求头里面对于某些网站,在请求头里面只需要设置只需要设置User-Agent就可以正常访问了,就可以正常访问了,但是为了保险起见,还是建议把所有项但是为了保险起见,还是建议把所有项目都带上,这样可以让爬虫更目都带上,这样可以让爬虫更“像像”浏浏览器。例如本练习,如果仅仅设置览器。例如本练习,如果仅仅设置User-Agent的话,会得到图

33、的话,会得到图7-39所示的返回信所示的返回信息。息。图7-39 仅仅修改修改User-Agent是不能是不能骗过练习网站的网站的7.3 7.3 模拟浏览器模拟浏览器 有一些有一些网站在发起网站在发起AJAX请求的时候,会带上特殊的字符串请求的时候,会带上特殊的字符串用于身份验证。这种字符串称为用于身份验证。这种字符串称为Token。为了简单起见,请打开。为了简单起见,请打开练习页面,这个页面在发起练习页面,这个页面在发起AJAX请求的时候会在请求的时候会在Headers中带上中带上一个参数一个参数ReqTime;在;在POST发送的数据中会有一个参数发送的数据中会有一个参数sum,如,如图图

34、7-40所示。所示。图7-40 较为复复杂的异步加的异步加载练习页面面 多次多次刷新页面,可以发现刷新页面,可以发现ReqTime和和sum一直在变化。如果一直在变化。如果requests只固定使用某个只固定使用某个ReqTime与与sum的组合来发起请求,就会的组合来发起请求,就会出现图出现图7-41所示的返回信息。所示的返回信息。不难不难看出看出ReqTime是精确到毫秒的时间戳,即使使用是精确到毫秒的时间戳,即使使用Python生成了一个时间戳,也不能得到网页上面的内容,如图生成了一个时间戳,也不能得到网页上面的内容,如图7-42所示。所示。图7-41 如果使用固定的参数就会如果使用固定

35、的参数就会导致爬虫爬不到数据致爬虫爬不到数据 图7-42 仅仅修改修改时间戳是不能戳是不能让爬虫成功的爬虫成功的7.3.1 Selenium7.3.1 Selenium介绍介绍 虽然在网然在网页的源代的源代码中无中无法看到被异步加法看到被异步加载的内容,但的内容,但是在是在Chrome的开的开发者工具的者工具的“Elements”选项卡下却可以卡下却可以看到网看到网页上的内容,如上的内容,如图7-43所示。所示。图7-43 在开在开发者工具的者工具的“Elements”选项卡卡下下可以可以看到被加看到被加载的内容的内容7.3.2 Selenium7.3.2 Selenium安装安装 使用使用p

36、ip安装安装Selenium:pip install selenium 安装情况如安装情况如图7-44所示。所示。图7-44 安装安装Selenium 下载下载ChromeDriver,根据自己的系统选择合适的版本,如图,根据自己的系统选择合适的版本,如图7-45所示。所示。图7-45 根据自己的系根据自己的系统选择合适的版本合适的版本7.3.3 Selenium7.3.3 Selenium的使用的使用1获取源代码获取源代码 将将chromedriver与代与代码放在同一个文件放在同一个文件夹中以方便代中以方便代码直直接接调用。初始化用。初始化Selenium只需要两行代只需要两行代码,导入入

37、Selenium库,再指定再指定WebDriver,如,如图7-46所示。所示。图7-46 初始化初始化Selenium 第第3行代码指定了行代码指定了Selenium使用使用ChromeDriver来操作来操作Chrome解析网页,括号里的参数就是解析网页,括号里的参数就是ChromeDriver可执行文件的地址。可执行文件的地址。如果如果要使用要使用PhantomJS,只需要修改第,只需要修改第3行代码即可:行代码即可:driver=webdriver.PhantomJS(./phantomjs)同样同样,需要将,需要将PhantomJS的可执行文件与代码放在一起。的可执行文件与代码放在一

38、起。需要需要特别提醒的是,如果特别提醒的是,如果chromedriver与代码不在一起,可与代码不在一起,可以通过绝对路径来指定,例如:以通过绝对路径来指定,例如:driver=webdriver.Chrome(/usr/bin/chromedriver)使用使用Windows的读者在写这个参数的时候,要注意反斜杠的的读者在写这个参数的时候,要注意反斜杠的问题。问题。“”这个符号叫作反斜杠,在这个符号叫作反斜杠,在Windows中作为路径的分中作为路径的分隔符。但是由于转义字符也是反斜杠,所以如果把隔符。但是由于转义字符也是反斜杠,所以如果把Windows下面下面的代码写为下面这样就会出问题。

39、的代码写为下面这样就会出问题。driver=webdriver.Chrome(C:serverchromedriver.exe)因此因此,使用,使用Windows的读者可在路径字符串左引号的左边加的读者可在路径字符串左引号的左边加一个一个“r”符号,将代码写为:符号,将代码写为:driver=webdriver.Chrome(rC:serverchromedriver.exe)这样这样Python就能正确处理反斜杠的问题。就能正确处理反斜杠的问题。初始化初始化完成以后,就可以使用完成以后,就可以使用Selenium打开网页了。要打开一个网打开网页了。要打开一个网页只需要一行代码:页只需要一行代

40、码:driver.get(http:/exercise.kingname.info/exercise_advanced_ajax.html)代码代码运行以后会自动打开一个运行以后会自动打开一个Chrome窗口,并在窗口里面自动进入窗口,并在窗口里面自动进入这个网址对应的页面。一旦被异步加载的内容已经出现在了这个自动打这个网址对应的页面。一旦被异步加载的内容已经出现在了这个自动打开的开的Chrome窗口中,那么此时使用下列代码:窗口中,那么此时使用下列代码:html=driver.page_sourcehtml=driver.page_source 就就能得到在能得到在Chrome开发者工具中出

41、现的开发者工具中出现的HTML代码,如图代码,如图7-47所示所示。图7-47 在在ChromeDriver加加载页面完成以后可以得到加面完成以后可以得到加载以后的源代以后的源代码 2等待信息出现等待信息出现 图图7-47所示的代码第所示的代码第6行设置了一个行设置了一个5s的延迟,这是由于的延迟,这是由于Selenium并不会等待网页加载完成再执行后面的代码。它只是向并不会等待网页加载完成再执行后面的代码。它只是向ChromeDriver发发送了一个命令,让送了一个命令,让ChromeDriver打开某个网页打开某个网页。至于至于网页要开多久,网页要开多久,Selenium并不关心。由于被异

42、步加载的内容会并不关心。由于被异步加载的内容会延迟出现,因此需要等待它出现以后再开始抓取。延迟出现,因此需要等待它出现以后再开始抓取。3在网页中获取元素在网页中获取元素 在在网页中寻找需要的内容,可以使用类似于网页中寻找需要的内容,可以使用类似于BeautifulSoup4的语法:的语法:element=driver.find_element_by_id(passwd-id)#如果有多个符合条如果有多个符合条件的,返回第件的,返回第1个个 element=driver.find_element_by_name(passwd)#如果有多个符合如果有多个符合条件的,返回第条件的,返回第1个个 el

43、ement_list=driver.find_elements_by_id(passwd-id)#以列表形式返以列表形式返回所有的符合条件的回所有的符合条件的element element_list=driver.find_elements_by_name(passwd)#以列表形式以列表形式返回所有的符合条件的返回所有的符合条件的element 也也可以使用可以使用XPath:element=driver.find_element_by_xpath(/inputid=passwd-id)#如果有多个符合条件的,返回第如果有多个符合条件的,返回第1 1个个 element=driver.fin

44、d_elements_by_xpath(/divid=passwd-id)#以列表形式返回所有的符合条件的以列表形式返回所有的符合条件的element 对于对于练习网站,使用练习网站,使用XPath获取网页的内容,运行结果如图获取网页的内容,运行结果如图7-48所示。所示。图7-48 使用使用Selenium和和ChromeDriver获得得练习网站的内容网站的内容7.4 7.4 阶段案例阶段案例 在在乐视网上网上寻找一个找一个视频,爬取,爬取视频的的评论信息。信息。7.4.1 7.4.1 需求分析需求分析 目目标网站:网站:http:/。目目标内容:爬取内容:爬取视频评论。涉及的知涉及的知识

45、点:点:(1)分析网站的异步加)分析网站的异步加载请求。求。(2)使用)使用requests发送送请求。求。7.4.2 7.4.2 核心代码构建核心代码构建 在在乐视网上打开一个网上打开一个视频,可以看到其部会,可以看到其部会评论页面如面如图7-49所示。所示。图7-49 乐视网部分网部分视频评论页面面 通过通过使用使用Chrome的开发者工具分析页面的异步加载请求,的开发者工具分析页面的异步加载请求,可以发现评论所在的请求如图可以发现评论所在的请求如图7-50所示。所示。可以可以使用使用Python来模拟这个请求,从而获取视频的评论信息。来模拟这个请求,从而获取视频的评论信息。在在请求的请求

46、的URL里面有两个参数:里面有两个参数:vid和和pid。这两个参数在网。这两个参数在网页的源代码里面都可以找到,如图页的源代码里面都可以找到,如图7-51所示。所示。图7-50 使用使用Chrome开开发者工具者工具观察察评论的异步加的异步加载请求求图7-51 在网在网页源代源代码里面里面寻找找pid和和vid 爬虫爬虫首先访问视频页面,通过正则表达式获取首先访问视频页面,通过正则表达式获取vid和和pid,并将结,并将结果保存到果保存到“necessary_info”这个类属性对应的字典中。核心代码如这个类属性对应的字典中。核心代码如下:下:def get_necessary_id(sel

47、f):def get_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.necessary_infoxid=vid self.necessary_infopid=pid 访问访问评论的接口,用评论的接口,用Python发起请求,获得评论数据。核心发起请求,获得评论数据。核心代码如下:代码如下:def get_comment(self):def get_c

48、omment(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_dict=json.loads(source_json)comments=comment_dictdata forcommentincomments:print(f发帖人:发帖人:commentuserusername,评论内容:评论内容:co

49、mmentcontent)代码代码中,提前定义的中,提前定义的self.COMMENT_URL和和self.HEADERS如图如图7-52所示。所示。图7-52 在代在代码中提前定中提前定义好好self.COMMENT_URL和和self.HEADERS7.4.3 7.4.3 调试与运行调试与运行 在爬虫中,在爬虫中,带上通上通过Chrome浏览器从器从评论页面复制而来的面复制而来的Headers再再发起起请求,可以减少爬虫被网站封求,可以减少爬虫被网站封锁的概率。的概率。爬虫的运行爬虫的运行结果如果如图7-53所示。所示。图7-53 乐视网网视频评论爬虫运行爬虫运行结果果7.5 7.5 本章

50、小结本章小结 本章本章主要介绍了使用爬虫获取异步加载网页的各种方法。对于主要介绍了使用爬虫获取异步加载网页的各种方法。对于普通的异步加载,可以使用普通的异步加载,可以使用requests直接发送直接发送AJAX请求来获取被加请求来获取被加载的内容载的内容。发送发送的请求中可能包含一些特殊的值,这些值来自网页源代码的请求中可能包含一些特殊的值,这些值来自网页源代码或者另一个或者另一个AJAX请求请求。在在发送请求时需要注意,应保持发送请求时需要注意,应保持requests提交的请求头与浏览器的请求提交的请求头与浏览器的请求头一致,这样才能更好地骗过网站服务器达到获取数据的目的。头一致,这样才能更好地骗过网站服务器达到获取数据的目的。对于对于比较复杂的异步加载,现阶段可以先使用比较复杂的异步加载,现阶段可以先使用Selenium和和ChromeDriver来直接加载网页,然后就能从被加载的网页中直接获取到需要的内容。来直接加载网页,然后就能从被加载的网页中直接获取到需要的内容。7.6 7.6 动手实践动手实践 寻找寻找并爬取一个使用异步加载技术的并爬取一个使用异步加载技术的网站。网站。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!