网页抓取是一种主要的技能,常常在许多不同的环境中利用,尤其是数据科学和数据挖掘。 Python在很大程度上被认为是网络抓取的首选措辞,其缘故原由在于Python的内嵌电池特性。 利用Python,您可以在大约15分钟内利用不到100行代码创建一个大略的抓取脚本。 因此,无论何种用场,网页抓取都是每个Python程序员必须具备的技能。
在我们开始动手之前,我们须要退后一步,考虑什么是网页抓取,什么时候该当利用它,何时避免利用它。
如您所知,网页抓取是一种用于从网站自动提取数据的技能。 主要的是要理解,网页抓取是一种从各种来源(常日是网页)中提取数据的粗略技能。 如果网站的开拓职员足够年夜方地供应API来提取数据,那么访问数据将是一种更加稳定和健壮的办法。 因此,根据履历,如果网站供应API以编程办法检索其数据,请利用它。 如果API不可用,则只能利用网络抓取。

请务必遵守有关您利用的每个网站的网页抓取的任何规则或限定,由于有些网站不许可这样做。 有了这个清楚的认识,让我们直接进入教程。
在本教程中,我们将抓取http://quotes.toscrape.com/,这是一个列出着名作家名言的网站。
网页抓取管道
我们可以将web-scraping理解为包含3个组件的管道:
下载:下载HTML网页
解析:解析HTML并检索我们感兴趣的数据
存储:以特定格式将检索到的数据存储在本地打算机中
下载HTML
从网页中提取任何数据,从逻辑上讲,我们首先要下载它。 我们有两种方法可以做到这一点:
1.利用浏览器自动化库
您可以利用Selenium等浏览器自动化库从网页下载HTML。 Selenium许可您打开浏览器,比方说Chrome,并根据须要掌握它。 您可以在浏览器中打开网页,然后利用Selenium自动获取该页面的HTML代码。
但是,这种方法有一个很大的缺陷 - 它明显变慢。 缘故原由是运行浏览器并在浏览器中呈现HTML的开销。 此方法仅运用于分外情形 - 我们要抓取的内容在浏览器中利用JavaScript代码,或者哀求我们单击按钮/链接以获取数据,Selenium可以为我们实行此操作。
2.利用HTTP库
与第一种方法不同,HTTP库(例如Requests模块或Urllib)许可您发送HTTP要求,完备不须要打开任何浏览器。 这种方法该当始终是首选,由于它比Selenium快得多。
现在让我见告您如何利用Selenium和Requests库实现管道这个组件:
利用Requests
利用以下命令安装Requests模块:
现在您可以在代码中利用它,如下所示:
这里,对URL进行HTTP GET要求,这险些与下载网页同义。 然后,我们可以通过访问requests.get方法返回的结果工具来获取页面的HTML源代码。
利用Selenium
您可以通过pip安装selenium模块:
在这里,我们首先创建一个表示浏览器的webdriver工具。 这样做会在运行代码的打算机上打开Chrome浏览器。 然后,通过调用webdriver工具的get方法,我们可以打开URL。 末了,我们通过访问webdriver工具的page_source属性来获取源代码。
在这两种情形下,URL的HTML源都作为字符串存储在page变量中。
解析HTML和提取数据
不必深入打算机科学理论,我们可以将解析定义为剖析字符串的过程,以便我们可以理解其内容,从而轻松访问个中的数据。
在Python中,有两个库可以帮助我们解析HTML:BeautifulSoup和Lxml。 Lxml是一个比BeautifulSoup更低级的框架,我们可以在BeautifulSoup中利用Lxml作为后端,因此对付大略的HTML解析,BeautifulSoup将是首选的库。
但在我们深入剖析之前,我们必须剖析网页的HTML,看看我们想要抓取的数据是如何构建和定位的。只有当我们节制了这些信息时,我们才能从解析的HTML中获取我们想要的信息。但幸运的是,我们不必在编辑器中打开源代码,并手动理解每个HTML元素并将其与渲染页面中的相应数据干系联。大多数浏览器都供应了一个检讨器,比如Chrome的开拓职员工具,它使我们只需单击它们即可快速查看任何元素的HTML代码。
要在Chrome中实行此操作,请在Chrome中打开网页,然后右键单击要抓取的数据,然后选择“检讨”。在Firefox中,此选项称为Inspect Element - 这是在做相同的事情,但只是名称不同。
您会把稳到Chrome窗口底部打开了一个窗格,个中包含您单击的元素的源代码。 浏览一下源代码,理解我们想要抓取的数据是如何在HTML代码中构建的。
经由一些检讨后你可以理解,http://quotes.toscrape.com/上的每个引用都包含在一个带有class =“quote”属性的div中。 在该div中,引用的文本在class =“text”的范围内,作者的名称在class =“author”的小标签中。 当我们实际解析HTML并提取数据时,将须要此信息。
现在,让我们开始利用BeautifulSoup解析HTML页面。 但首先,我们必须安装它:
安装好之后,可以像下面这样在代码中调用:
首先,我们通过将页面通报给BeautifulSoup类布局函数来创建页面的解析版本。 如您所见,我们还将第二个参数html.parser通报给布局函数。 这是Beautiful Soup将用于解析通报给它的字符串的解析器的名称。 你可以利用我们之前谈到过的解析器lxml,由于你已经安装了Lxml库。
然后,我们提取包含class =“quote”的页面中的所有div标签,由于我们知道这些是包含引用的div。 为此,Beautiful Soup 4供应了find_all功能。 我们将标记名称和类名称通报给find_all函数,并返回知足条件的所有标记,即包含引用的标记。
这里须要把稳的一件主要事情是,我们在这里利用树构造。 变量soup以及引用的每个元素都是树。 在某种程度上,引用的元素是较大的soup树的一部分。 无论如何,为避免进入不同的谈论,让我们连续。
我们知道引用的文本是带有class =“text”的span标记,而作者是带有class =“author”的小标记。 要从quote元素中提取它们,我们再次利用类似的函数find。 find函数利用与find_all函数相同的参数。 唯一的差异是它返回知足条件的第一个标记,而find_all返回标记列表。 此外,我们希望访问返回工具的text属性,该工具包含该标记中包含的文本。
因此,正如您在代码中看到的那样,我们遍历列表引用的所有元素,并提取引用文本和作者名称,将它们存储在名称为scraped的列表。 在掌握台上打印时,已抓取的列表如下所示:
存储检索的数据
一旦我们得到了数据,我们就可以以任何我们想要的格式存储它,例如CSV文件,SQL数据库或NoSQL数据库。 严格来说,这一步不应算作抓取过程的一部分,但为了完全起见,我将简要先容它。
我想说最盛行的存储抓取数据的方法是将它们存储为CSV电子表格,以是我将简要先容如何做到这一点。 我不会详细先容,由于您该当参考官方的Python文档。 以是,不用多说,让我们看看代码。
我们可以看到,代码非常明显。 我们从打开的quotes.csv文件创建一个CSV编写器工具,然后利用writerow函数逐个写入引用。 很明显,writerow函数接管一个列表作为输入,然后将其作为一行写入CSV。
结论和后续步骤
本教程该当帮助您理解在学习自己实现大略的scraper时基本上是什么。 这种抓取该当足以实现大略的自动化或小规模数据检索。 但是如果你想有效地提取大量数据,你该当研究一下抓取框架,特殊是Scrapy。 它可以帮助您利用几行代码编写非常快速,高效的scraper。 无论你利用什么样的框架,在那个闪亮的表面下面,框架也利用这些非常基本的抓取原则,以是理解本教程该当可以帮助你为开始抓取的探险建立根本知识。
英文原文:https://stackabuse.com/introduction-to-web-scraping-with-python/ 译者:javylee