Semalt的教程:Python中的Web爬取

我最近访问了KinoPoisk(IMDB的俄语版本),发现多年来,我对超过1000部电影进行了评分。我认为对这些数据进行更详细的研究会很有趣:我的电影口味随着时间变化了吗?我在一年中的哪个季节看更多电影?

但是在分析和构建漂亮的图形之前,我们需要获取数据。不幸的是,许多服务没有公共API,因此您必须袖手旁观并解析html页面。

本文适用于那些总是想学习如何使用Web Scrapping但又不了解或不知道从何开始的人。

任务

我们的任务是提取有关已经看过的电影的数据:电影的标题,观看日期和时间,用户的评分。

实际上,我们的工作将分两个阶段完成:

阶段1:下载并保存html页面

第2阶段:以适合进一步分析的格式(csv,json,pandas数据框等)解析html

仪器

有很多用于发送http请求的python库。最著名和最方便的是请求。

还需要选择一个用于html解析的库。

BeatifulSoup,lxml

这是两个最流行的用于解析html的库,选择其中一个只是个人喜好。而且,这些库彼此紧密相连:BeautifulSoup开始使用lxml作为内部解析器进行加速,并在lxml中添加了汤解析器模块。为了比较这些方法,我将使用BeautifulSoup并使用模块lxml.html中的XPath选择器来解析数据。

下载资料

让我们开始下载数据。首先,让我们尝试通过url获取页面并将其保存到本地文件中。

我们打开生成的文件,发现它不是那么简单:该站点将我们视为机器人,并且不会显示数据。

让我们找出网站的运作方式

浏览器从站点获取信息没有问题。让我们看看它发送请求的方式。为此,我们使用浏览器“开发人员工具”中的“网络”面板(为此,我使用Firebug),通常,我们需要的请求是最长的。

如我们所见,浏览器还向UserAgent标头,cookie和其他一些参数发送标头。首先,我们将尝试将正确的UserAgent发送到标头。

这次我们成功了,现在我们已经获得了必要的数据。值得注意的是,有时站点还会检查cookie的有效性,在这种情况下,请求库中的会话会有所帮助。

下载所有价格

现在,我们可以保存带有费率的一页。但是通常用户的费率很高,因此有必要遍历所有页面。我们感兴趣的页码很容易直接转移到url。

从HTML收集数据

现在,让我们直接从html收集数据。了解html页面结构的最简单方法是使用浏览器中的“检查元素”功能。在这种情况下,一切都非常简单:带有费率的整个表格都在标记中。选择此节点:

从bs4导入BeautifulSoup

从lxml导入html

#美丽的汤

汤= BeautifulSoup(文字)

film_list = soup.find('div',('class':'profileFilmsList'))

#lxml

树= html.fromstring(文本)

film_list_lxml = tree.xpath('// div [@class =``profileFilmList'']')[0]

让我们学习如何提取电影的俄语标题以及到电影页面的链接(以及如何获取文本和属性值)。

如果您需要提取英文标题,只需将“ nameRus”更改为“ nameEng”即可。

结果

我们学习了如何解析网站,熟悉了Requests,BeautifulSoup和lxml库,并获得了适合进一步分析KinoPoisk上已看电影的数据。