Python和Scrapy构建网路爬虫的新手指南


原文地址:Python和Scrapy构建网路爬虫的新手指南

本教程将是您学习使用Python编程语言进行Web抓取的终极指南。首先,我将引导您完成一些基本示例,以使您熟悉Web抓取。然后我们将使用该知识从Livescore.cz提取足球比赛的数据。

自成立以来,网站一直用于共享信息。无论是维基百科文章,YouTube频道,Instagram帐户还是Twitter句柄。它们都包含有趣的数据,可供访问Internet和Web浏览器的每个人使用。

但是,如果我们想以编程方式获取任何特定数据怎么办?

有两种方法可以做到这一点:

  1. 使用官方API
  2. 网页抓取

引入了API(应用程序编程接口)的概念,以标准方式在不同系统之间交换数据。但是,在大多数情况下,网站所有者不提供任何API。在这种情况下,我们只能使用网络抓取来提取数据。

基本上,每个网页都是以HTML格式从服务器返回的,这意味着我们的实际数据很好地包装在HTML元素内。它使检索特定数据的整个过程变得非常容易和直接。

入门

为使我们入门,您将需要使用启动一个新的Python3项目并安装Scrapy(用于Python的网络抓取和网络抓取库)。我在本教程中使用pipenv,但您可以使用pip和venv或conda。

pipenv install scrapy

至此,您已经有了Scrapy,但是您仍然需要创建一个新的Web抓取项目,为此,scrapy为我们提供了一个为我们完成工作的命令行。

现在,通过使用scrapy cli创建一个名为web_scraper的新项目。

如果您像我一样使用pipenv,请使用:

pipenv run scrapy startproject web_scraper

否则,请从您的虚拟环境中使用:

scrapy startproject web_scraper

这将在当前目录中创建具有以下结构的基本项目:

Python和Scrapy构建网路爬虫的新手指南

使用XPath查询构建我们的第一个Spider

我们将以一个非常简单的示例开始我们的Web抓取教程。首先,我们将在HTML内找到Live Code Stream网站的徽标。并且我们知道,这只是文本,而不是图像,因此我们将简单地提取此文本。  

代码示例

首先,我们需要为此项目创建一个新的蜘蛛。我们可以通过创建一个新文件或使用CLI来做到这一点。

既然我们已经知道了所需的代码,我们将在此路径/web_scraper/spiders/live_code_stream.py中创建一个新的Python文件。 

这是此文件的内容。

Python和Scrapy构建网路爬虫的新手指南

代码说明:

  • 首先,我们导入了Scrapy库,因为我们需要它的功能来创建Python网络蜘蛛。然后,将使用此蜘蛛爬网指定的网站并从中提取有用的信息。
  • 我们创建了一个类并将其命名为LiveCodeStreamSpider。基本上,它是从scrapy.Spider继承的,这就是我们将其作为参数传递的原因。
  • 现在,重要的一步是使用名为name的变量为蜘蛛定义一个唯一的名称。请记住,不允许您使用现有蜘蛛的名称。同样,您不能使用此名称来创建新的蜘蛛。在整个项目中,它必须是唯一的。
  • 之后,我们使用start_urls列表传递了网站URL。
  • 最后,创建一个名为parse()的方法,该方法将在HTML代码中定位徽标并提取其文本。在Scrapy中,有两种方法可以在源代码中查找HTML元素。这些在下面提到。
  • CSS
  • XPath

您甚至可以使用一些第三方库。

例如BeautifulSoup和lxml。但是,在此示例中,我们使用了XPath。
确定任何HTML元素的XPath的快速方法是在Chrome DevTools中打开它。现在,只需右键单击该元素的HTML代码,将鼠标光标悬停在刚出现的弹出菜单内的“复制”上。最后,单击“复制XPath”菜单项。

请看下面的屏幕截图,以更好地理解它。

Python和Scrapy构建网路爬虫的新手指南

顺便说一下,我在元素的实际XPath之后使用了/text(),以只检索该元素的文本,而不是整个元素代码。

注意:上面提到的变量、列表或函数不允许使用任何其他名称。这些名称是在Scrapy库中预定义的。所以,你必须如实使用它们。否则,程序将不能按预期工作。

蜘蛛运行:

因为我们已经在命令提示符中的web_scraper文件夹中了。让我们使用下面的代码执行爬行器并将结果填充到一个新文件lcs.json中。

pipenv run scrapy crawl lcs -o lcs.json
scrapy crawl lcs -o lcs.json

结果:

执行以上代码后,我们将在项目文件夹中看到一个新文件 lcs.json 

这是此文件的内容。

[
{"logo": "Live Code Stream"}
]

另一个带有CSS查询选择器的Spider

我们大多数人都喜欢运动,就足球而言,这是我个人的最爱。

足球比赛在世界各地频繁组织。有几个网站可以在比赛过程中实时提供比赛结果。但是,这些网站大多数都不提供任何官方API。

反过来,它为我们创造了一个使用我们的网络抓取技巧并通过直接抓取他们的网站来提取有意义的信息的机会。

例如,让我们看一下Livescore.cz网站。  

他们在他们的主页上很好地显示了锦标赛和他们将在今天(您访问网站的日期)进行的比赛。

我们可以检索以下信息:

  • 比赛名称
  • 比赛时间
  • 第1队的名称(例如国家/地区,足球俱乐部等)
  • 团队1进球
  • 第2队的名称(例如国家/地区,足球俱乐部等)
  • 团队2进球
  • 等等

在我们的代码示例中,我们将提取今天匹配的锦标赛名称。

编码

让我们在项目中创建一个新的Spider来检索锦标赛名称。我将此文件命名为livecore_t.py 

这是您需要在/web_scraper/web_scraper/spiders/livescore_t.py中输入的代码

Python和Scrapy构建网路爬虫的新手指南

代码的解释:

像往常一样引入Scrapy。

创建一个继承scrapy.Spider的属性和功能的类。

给我们的蜘蛛一个唯一的名字。在这里,我使用LiveScoreT,因为我们将只提取比赛的名字。

下一步是提供Livescore.cz的URL。

最后,parse()函数遍历所有匹配的包含竞赛名称的元素,并使用yield将其连接在一起。最后,我们会收到今天有比赛的所有比赛名称。需要注意的一点是,这次我使用了CSS选择器而不是XPath。

运行新创建的蜘蛛:

现在该看看我们的蜘蛛在行动了。运行以下命令,使Spider抓取Livescore.cz网站的主页。然后,Web抓取结果将以JSON格式添加到名为ls_t.json的新文件中。 

pipenv run scrapy crawl LiveScoreT -o ls_t.json

结果:

这是我们的网络蜘蛛于2020年11月18日从Livescore.cz中提取的内容。请记住,输出可能每天都会更改。  

Python和Scrapy构建网路爬虫的新手指南

更高级的用例

在本节中,我们将继续研究并获得比赛及其比赛的完整详细信息,而不只是获取比赛名称。

创建一个新的文件中/ web_scraper/web_scraper/spiders/并将它命名为livescore.py。现在,在其中输入以下代码。   

Python和Scrapy构建网路爬虫的新手指南

代码的解释:

该文件的代码结构与前面的示例相同。在这里,我们只是用一个新功能更新了parse()方法。

基本上,我们从页面中提取了所有HTML 元素。然后,我们对它们进行循环,以确定它是锦标赛还是比赛。如果它是一个锦标赛,我们提取它的名字。在匹配的情况下,我们提取它的“时间”、“状态”和“两队的名称和得分”。

运行示例:

在控制台中键入以下命令并执行它。

pipenv run scrapy crawl LiveScore -o ls.json

结果:

以下是检索到的样本:

Python和Scrapy构建网路爬虫的新手指南

现在有了这些数据,我们可以做任何我们想做的事情,例如用它来训练我们自己的神经网络来预测未来的比赛。

结论

数据分析师经常使用网络抓取,因为它可以帮助他们收集数据以预测未来。同样,企业使用它从网页提取电子邮件,因为它是潜在客户产生的有效方法。我们甚至可以使用它来监视产品的价格。  

换句话说,网络抓取具有许多用例,Python完全能够做到这一点。  

那你还在等什么?立即尝试抓取您喜欢的网站。

评论

登录后评论

服务器优惠活动

Top