爬虫技术实验报告
作者:mmseoamin日期:2023-12-20

一、实验目的

1、通过实验和分析,评估不同的等待机制在Python动态网页爬虫中的使用效果和性能差异。

2、通过对比不同等待机制的优缺点,可以更好地了解何时使用何种等待机制,并选择最适合自己需求的方法。

3、对于网页进行请求,然后抓取所需的内容,最后存储数据,可以了解爬取的过程。

二、实验内容和要求

Exercise 1

1、利用实际的Python动态网页爬虫为例,来了解3种等待(Waits) 机制

2、详细的实作内容可以参考以下的GitHub网址

https://github.com/mikekul116/pythonpchome-scraper

Exercise 2

比较三种等待机制,各自的优缺点

Exercise 3

1、实验分析三种等待机制,各自适用的数据量状态与应用

2、跑一支任意程序,针对不同的等待,连续三次,纪录时间,做成图

Exercise 4

https://www.webscrapingpro.tw/what-is-web-scraping/

实际范例演练

三、实验环境

Python

四、实验方法和步骤

1、利用实际的Python动态网页爬虫为例,来了解3种等待(Waits) 机制

由于提供的代码中的selenium库版本较低,而新版本的selenium库可以不必设置driver.exe路径。如果不修改代码则需要降低selenium库的版本,或者修改代码。我下面的代码都是修改代码,而不是降低selenium库的版本。

(1)强制等待(sleep)

a、导入所需的库

爬虫技术实验报告,在这里插入图片描述,第1张

b、创建一个Chrome浏览器的实例

爬虫技术实验报告,在这里插入图片描述,第2张

c、browser.get()方法打开目标网站

爬虫技术实验报告,在这里插入图片描述,第3张

d、设置强制等待等待时间,等待页面加载完成

爬虫技术实验报告,在这里插入图片描述,第4张

e、使用find_element()方法找到需要的元素,并执行相应的操作

爬虫技术实验报告,在这里插入图片描述,第5张

(2)明确等待(explicit)

a、导入所需的库

爬虫技术实验报告,在这里插入图片描述,第6张

b、创建一个Chrome浏览器的实例

爬虫技术实验报告,在这里插入图片描述,第7张

c、browser.get()方法打开目标网站

爬虫技术实验报告,在这里插入图片描述,第8张

d、设置明确等待等待时间,等待页面加载完成

爬虫技术实验报告,在这里插入图片描述,第9张

e、定位到需要的元素,并执行相应的操作

爬虫技术实验报告,在这里插入图片描述,第10张

(3)隐含等待(implicit)

a、导入所需的库

爬虫技术实验报告,在这里插入图片描述,第11张

b、创建一个Chrome浏览器的实例

爬虫技术实验报告,在这里插入图片描述,第12张

c、browser.get()方法打开目标网站

爬虫技术实验报告,在这里插入图片描述,第13张

d、设置隐含等待等待时间,等待页面加载完成

爬虫技术实验报告,在这里插入图片描述,第14张

e、使用find_element()方法找到需要的元素,并执行相应的操作

爬虫技术实验报告,在这里插入图片描述,第15张

2、比较三种等待机制,各自的优缺点

强制等待(sleep):

优点:实现简单,直接暂停程序执行指定的时间。

缺点:不灵活,等待时间固定,无法根据页面加载情况来调整等待时间。如果页面加载较快,等待时间过长导致浪费;如果页面加载较慢,等待时间过短导致找不到元素而报错。

例子:你在家里等朋友来拜访,但你不知道他们什么时候会到达。于是你决定在指定的时间等待一段时间,比如说你决定等待10分钟。在这10分钟内,你无论朋友们是否到达,你都会一直等待。就是说你在指定的时间段内等待,无论条件如何,这个就是强制等待。

隐式等待(Implicit):

优点:全局设置,适用于整个测试用例,不需要在每个操作中都添加等待时间。

缺点:只能等待元素可见或不可见,不能精确控制等待的条件和时间。如果页面加载较慢,等待时间较长;如果页面加载较快,可能会导致找不到元素而报错。

例子:比如你点了一道菜。告诉你这道菜需要15分钟准备好。你可以在这15分钟内做其他事情。如果菜在15分钟内准备好了,你就可以立即享用。但如果菜需要更长的时间,你可以继续等待。这就是隐式等待,你等待一段时间,但不需要一直关注等待的条件。

显式等待(Explicit):

优点:可以根据具体的条件和时间来等待,非常灵活。可以等待元素可见、可点击、存在、消失等多种条件。

缺点:需要在每个等待的操作中明确指定条件和时间,相对来说稍微繁琐一些。

例子:比如去机场接机。你知道飞机将在特定的时间降落,但你不知道具体什么时候。你可以使用手机上的APP获得航班信息,从而获取飞机的准确位置和预计到达时间。你可以根据这些信息决定何时出发去接机。这就是显式等待,你根据特定的条件和时间来等待,直到满足条件后再执行下一步操作。

3、跑一支任意程序,针对不同的等待,连续三次,纪录时间,做成图,并进行分析

代码思路:在Chrome浏览器中打开百度网站,并进行四种不同的等待方法(循环方式)的测试。通过记录开始时间和结束时间,计算出每种等待方法的耗时,并保存在列表中。最后使用matplotlib模块绘制出各种等待方法的耗时图。

a.导入所需的库

爬虫技术实验报告,在这里插入图片描述,第16张

导入matplotlib模块用于绘图;导入selenium的webdriver模块用于创建浏览器驱动;导入time模块用于计时;导入warnings模块用于消除警告;通过matplotlib相关参数设置中文字体为SimHei,消除坐标轴负号显示问题。

b.创建浏览器驱动

爬虫技术实验报告,在这里插入图片描述,第17张

c.定义等待方法的时间列表和名称列表

爬虫技术实验报告,在这里插入图片描述,第18张

d.执行搜索并记录时间(循环4次(无等待、强制等待、隐含等待、明确等待))

爬虫技术实验报告,在这里插入图片描述,第19张

e.关闭浏览器驱动

爬虫技术实验报告,在这里插入图片描述,第20张

f.通过matplotlib进行绘图

爬虫技术实验报告,在这里插入图片描述,第21张

g.绘图结果

1、等待时间为2秒

爬虫技术实验报告,在这里插入图片描述,第22张

2、等待时间为30秒

爬虫技术实验报告,在这里插入图片描述,第23张

3、等待时间为一分钟(60秒)

爬虫技术实验报告,在这里插入图片描述,第24张

4、实际范例演练https://www.webscrapingpro.tw/what-is-web-scraping/

由于范例中的爬取的网站无法在国内登录,所以我选择更改爬取的网址。

代码思路:通过使用Python的requests库来向特定URL发送HTTP请求,从网页上获取信息。然后,使用BeautifulSoup库对HTML进行解析,提取出所需的信息。最后,将提取到的信息按照CSV格式写入到指定的文件中。

(1)导入所需的库

爬虫技术实验报告,在这里插入图片描述,第25张

(2)使用BeautifulSoup来解析网页内容

爬虫技术实验报告,在这里插入图片描述,第26张

(3)找到最近更新小说列表的父元素和列表项

爬虫技术实验报告,在这里插入图片描述,第27张

(4)创建csv文件并且写入标题行,遍历每个小说的列表项,提取信息并写入CSV文件

爬虫技术实验报告,在这里插入图片描述,第28张爬虫技术实验报告,在这里插入图片描述,第29张

(5)查看csv文件

爬虫技术实验报告,在这里插入图片描述,第30张

爬虫技术实验报告,在这里插入图片描述,第31张

五、实验结果

1、第一题结果截图

a.强制等待运行截图

爬虫技术实验报告,在这里插入图片描述,第32张

b.明确等待运行截图

爬虫技术实验报告,在这里插入图片描述,第33张

c.隐含等待运行截图

爬虫技术实验报告,在这里插入图片描述,第34张

2、第三题结果截图

a.等待时间为2秒

爬虫技术实验报告,在这里插入图片描述,第35张

b.等待时间为30秒

爬虫技术实验报告,在这里插入图片描述,第36张

c.等待时间为一分钟(60秒)

爬虫技术实验报告,在这里插入图片描述,第37张

3、第四题结果截图

爬虫技术实验报告,在这里插入图片描述,第38张

爬虫技术实验报告,在这里插入图片描述,第39张

六、实验总结

本次实验主要是通过实际的Python动态网页爬虫的例子,来了解三种等待机制:强制等待、隐含等待和明确等待。在实验中,我们使用了selenium库来模拟浏览器操作,以及time库来实现等待功能。

在强制等待中,我们使用time库的sleep方法来暂停程序的执行,等待指定的时间。这种方法简单直接,但是不灵活,等待时间固定,无法根据页面加载情况来调整等待时间。

在隐含等待中,我们使用selenium库的implicitly_wait方法来设置全局的等待时间,等待页面加载完成。这种方法适用于整个测试用例,不需要在每个操作中都添加等待时间,但是只能等待元素可见或不可见,不能精确控制等待的条件和时间。

在明确等待中,我们使用selenium库的WebDriverWait和expected_conditions方法来实现等待功能。这种方法可以根据具体的条件和时间来等待,非常灵活。可以等待元素可见、可点击、存在、消失等多种条件,但是需要在每个等待的操作中明确指定条件和时间,相对来说稍微繁琐一些。

通过比较三种等待机制的优缺点,我们可以得出以下结论:

强制等待(sleep):实现简单,直接暂停程序执行指定的时间,但是不灵活,等待时间固定,无法根据页面加载情况来调整等待时间。

隐含等待(Implicit):全局设置,适用于整个测试用例,不需要在每个操作中都添加等待时间,但是只能等待元素可见或不可见,不能精确控制等待的条件和时间。

明确等待(Explicit):可以根据具体的条件和时间来等待,非常灵活,可以等待元素可见、可点击、存在、消失等多种条件,但是需要在每个等待的操作中明确指定条件和时间,相对来说稍微繁琐一些。

还有,通过跑一支任意程序,针对不同的等待机制连续三次,纪录时间并绘制成图,可以进一步分析不同等待机制的性能差异。

最后,我们通过实例对于网页进行请求,然后抓取所需的内容,最后存储数据。