大家不要看到代码就觉得头疼或是特别困难,其实Web爬虫是非常简单的。Python是面向对象的语言,而且与其他语言相比,类和对象都更容易操作,所以是Python Web爬虫最简单的入门方法之一。此外,还有许多库能简化Python Web爬虫工具的构建流程。
这次会概述入门所需的知识,包括如何从页面源获取基于文本的数据以及如何将这些数据存储到文件中并根据设置的参数对输出进行排序。最后,还会介绍Python Web爬虫的高级功能。按照今天所介绍的按部就班的学习就能学会Web爬虫哟。
另外,所介绍的教程适用于所有操作系统。但是,在安装学习Python所用的环境和在正式开发环境的配置可能会稍有不同。
准备工作
这次为大家介绍的教程选用了3.8.3版本的Python,也适用于所有3.4+的版本。下面跟着小Oxy一起学习吧!
Windows系统安装Python时,选 “PATH installation”,PATH安装将可执行文件添加到默认的Windows命令提示符,执行文件搜索。Windows将识别诸如“pip”或“python”之类的命令,不需用户将其指向可执行文件的目录(例如C://tools/python//python.exe)。如果已经安装了Python,但是没有选中复选框,只需重新运行安装并选择modify。在第二个屏幕上选择“添加到环境变量”。
安装库
系统安装后,还要使用三个重要的库– BeautifulSoup v4,Pandas和Selenium。
BeautifulSoup广泛用于解析HTML文件;
Pandas用于结构化数据的创建;
Selenium用于浏览器自动化;
安装库需启动操作系统的终端。输入:
每一次安装都需要几秒钟到几分钟的时间。如果遇到终端死机、在下载或解压安装软件包时卡住或其他问题,只要电脑尚未完全卡机,那么可以使用CTRL+C中止安装。
下一步教程默认安装软件以及库的操作已完成。如果收到“NameError:name*is not defined”消息,很可能其中某个库安装失败。
Web驱动和浏览器
Web爬虫要通过浏览器连接到目标URL地址。出于测试目的,建议使用常规浏览器(或非无头浏览器),尤其是新手。看到代码与应用程序交互就能进行简单的故障排除和调试,也有助于更好地理解整个过程。
无头浏览器处理复杂任务效率更高,后续可使用。本教程使Chrome网页浏览器,若选用Firefox浏览器,过程也相差无几。
首先,搜索“ Chrome浏览器的网络驱动程序”(或Firefox),下载适用版本。
选择适用的软件包下载并解压缩。将驱动程序的可执行文件复制到易于访问的目录。进行之后的步骤才能知道下载安装的操作正确与否。
编码环境
在编程之前还需最后一步:良好的编码环境。包括从简单的文本编辑器到功能齐全的IDE(集成开发环境)等,其中,在简单的文本编辑器中只需创建一个* .py文件并直接写代码即可。
如果已经安装Visual Studio Code,则选择IDE最为简单。如果没有,建议新手使用PyCharm,入门简单且界面直观。接下来教程以 PyCharm为例。
在PyCharm中右键单击项目区域,单击“新建-> Python文件”,再命名。
导入库并使用
安装的软件和程序开始派上用场:
PyCharm会自动标记未使用的库(显示为灰色)。不建议删除未使用的库。
从定义浏览器开始,根据在“ web驱动和浏览器”中选择的web驱动,应输入:
选择URL
在进行第一次测试运行前请选择URL。小Oxy希望创建基本应用程序,因此建议选择简单的目标URL:
✔️不要将数据隐藏在Javascript元素中。有时候需要特定操作来显示所需的数据。从Javascript元素中删除数据则需要更复杂的操作。
✔️不要爬取图像,直接利用Selenium即可。
✔️在进行网页爬虫之前,确保对象是公共数据,并且不侵犯第三方权益。另外,要查看robots.txt文件获得指导。
选择要访问的登录页面,将URL输入到driver.get(‘URL’)参数中。Selenium要求提供连接协议。因此,始终需要在URL上附加“ http://”或“ https://”。
单击右下角的绿色箭头进行测试。
如果收到错误消息表明文件丢失,再次检查驱动程序“ webdriver.*”中提供的路径是否与webdriver可执行文件的位置匹配。如果收到消息表明版本不匹配,重新下载正确的webdriver可执行文件。
确定对象,建立Lists
Python允许程序员在不指定确切类型的情况下设计对象。只需键入对象的标题并指定一个值即可。
Python中的列表(Lists)有序可变,并且可重复。sets、dictionaries等集合也可使用,当然Lists更容易些。接下来,继续学习!
在进行下一步之前,回顾一下到目前为止代码应该是什么样子的:
重新运行应用程序,此时不应有错误提示。如出现任何问题,上文已介绍了一些故障排除的情况。
提取数据
有趣而困难的部分–从HTML文件中提取数据。几乎在所有情况下,都是从页面的不同部分中取出一小部分,再将其存储到列表中。所以应先处理每个较小的部分,再将其添加到列表中:
“soup.findAll”可接受的参数范围广泛。本教程仅使用“arts”(属性),可设置“如果属性等于X为true,则……”,缩小搜索范围,这样就很容易找到并使用类。
在继续下一步学习之前,在浏览器中访问选定的URL。CTRL + U(Chrome)或右键单击打开页面源,选择“查看页面源”。找到嵌套数据“最近”的类。也可以按F12打开DevTools,选择“元素选取器”。例如,它可以嵌套为:
属性“class”将是“title”。如果选择简单的目标,则在大多数情况下,数据将以与示例类似的方式嵌套。复杂的目标可能需要更复杂繁多的操作。回归到编码部分,并添加源代码中的类:
现在,循环将遍历页面源中所有带有“title”类的对象。接下来是处理每一个的过程:
循环如何遍历HTML:
第一条语句(在循环中)查找所有与标记匹配的元素,这些标记的“类”属性包含“标题”。然后在该类中执行另一个搜索。下一个搜索将找到文档中的所有<a>标记(包括<a>,不包括<span>之类的部分匹配项)。最后,将对象赋值给变量“name”。
然后可以将对象名称分给先前创建的列表数组“results”,但是这样会将带有文本的<ahref…>标记带到一个元素中。大多数情况下,只需要文本本身而不需任何其他标签。
循环将遍历整个页面源,找到上面列出的所有类,然后将嵌套数据追加到列表中:
注意,循环后的两个语句是缩进的。循环需要用缩进来表示嵌套。没有缩进的循环将输出“IndentationError”,并用“arrow”指出有问题的语句。
输出数据
即使在运行程序时没有出现语法或运行错误,也仍然可能存在语义错误。应该检查实际上是否有分配给正确对象的数据,并正确地移动到数组。
检查在前面步骤中采集数据是否正确的最简单方法之一是“打印”。数组有许多不同的值,通常使用简单的循环将每个条目分隔到输出中的单独一行:
在这一点上,“print”和“for”都是可行的。启动循环只是为了快速测试和调试。所以,直接打印结果是完全可行的:
到目前为止,编码应该如下所示:
现在运行程序应不会显示任何错误,并且会在调试器窗口中显示获取的数据。尽管“打印”非常适合用于测试,但对于解析和分析数据而言却并非如此。
到目前为止,“import pandas”仍为灰色,最后要充分利用该库。因为将执行类似的操作,所以建议暂时删除“print”循环,将数据结果输入到csv文件中。
两个新语句依赖于pandas库。第一条语句创建变量“ df”,并将其对象转换为二维数据表。“Names”是列的名称,“results”是要打印的列表。pandas可以创建多列,但目前没有足够的列表来利用这些参数。
第二条语句将变量“df”的数据移动到特定的文件类型(在本例中为“ csv”)。第一个参数为即将创建的文件和扩展名分配名称。因为“pandas”输出的文件不带扩展名,所以需要手动添加扩展名。“index”可用于为列分配特定的起始编号。“encoding”用于以特定格式保存数据。UTF-已经几乎适用于所有情况。
现在任何导入都不应显示为灰色,并且能在项目目录中输出“names.csv”运行应用程序。如果仍有“Guessed At Parser”的警告,可通过安装第三方解析器将其删除。但考虑到本教程目的,默认HTML选项即可。
更多的Lists
许多Web爬虫操作需获取几组数据。例如,仅提取电子商务网站上项目标题用处不大。为了收集有意义的信息并从中得出结论,至少需要两个数据点。
当然,小Oxy还将介绍一些稍有不同的方法。因为从同一类中获取数据仅意味着附加到另一个列表,所以应尝试从另一类中提取数据,但同时要维持表的结构。
显然,需要另一个列表来储存数据。
由于要从HTML的不同部分提取额外的数据点,所以需要额外的循环。如有必要还可添加另一个“If”条件来控制重复条目:
最后,需要更改数据表的形成方式:
到目前为止,我们代码的最新迭代应如下所示:
幸运的话,运行此代码时不会输出错误。但在某些情况下,“pandas”将输出“ValueError:arrays must be same length”消息。简而言之,列表“results”和“other_results”的长度是不相等的,因此pandas不能创建二维表。
有很多方法可以解决此问题,比如用“empty”值填充最短列表或创建字典,再创建两个序列并将它们列出。现在,有第三个方法:
列表的长度不一,则不会匹配数据,如果需要两个数据点,则创建两个序列是最简单的解决方法。最终代码应该如下:
创建一个名为“names”的csv文件,其中包括两列数据,然后再运行。
高级功能
现在,Web爬虫应该可以正常使用了。当然,这个爬虫非常基础简单,需要升级才能执行复杂的数据采集。在学习更复杂的教程之前,建议尝试其他功能:创建循环从而创建长度相等的列表,匹配数据提取。
✔️很多方法能一次爬取数个URL。最简单的方法之一是重复上面的代码,每次都更改URL,但这种操作很烦。所以,构建循环和要访问的URL数组即可。
✔️创建多个数组存储不同的数据集,并将其输出到不同行的文件中。一次收集几种不同类型的信息对电子商务获取数据而言很重要。
✔️Web爬虫工具自动运行,无需操作。采用Chrome或Firefox浏览器的无头版本,减少加载时间。
✔️创建爬虫模式。思考普通用户如何浏览互联网并尝试自动化的过程。这肯定需要新的库。用“import time”和“from random import randint”创建页面之间的等待时间。添加“scrollto()”或使用特定的键控制滚动条。创建爬虫模式时,几乎不可能列出所有可能的选项。
✔️创建监控流程。某些网站上的数据可能对时间(甚至用户)敏感。创建长时间循环,重新检查某些url并按设置的间隔爬取数据,确保数据的时效性。
✔️最后,将代理集成到web爬虫,通过特定位置的使用许可获取可能无法访问的数据。