python爬虫使用指南_如何使用Python构建Web爬虫[分步指南]

python爬虫使用指南

在我自学的编程之旅中 ,我的兴趣在于机器学习(ML)和人工智能(AI),并且我选择精通的语言是Python。

我的Python基本技能,因此,如果您在编码方面的技能不多,希望本指南可以帮助您获得更多知识和理解。

完美的初学者项目

要为ML,AI或数据科学项目获取数据,您通常会依赖数据库,API或现成的CSV数据集。 但是,如果找不到想要使用和分析的数据集怎么办? 这就是Web刮板进来的地方。

项目工作对于巩固您所学到的知识至关重要。 当我开始这个项目时,我有点不知所措,因为我真的什么都不知道。

坚持下去,找到有关Stack Overflow的问题的答案,以及大量的反复试验帮助我真正地了解了编程的工作原理-网页如何工作,如何使用循环以及如何构建函数并保持数据干净。 对于使用Python入门的人来说,它使构建一个Web爬虫成为了理想的入门项目。

我们将介绍的内容

本指南将带您了解HTML网页,使用Python构建网络抓取工具以及使用pandas创建DataFrame。 它涵盖了数据质量,数据清理和数据类型转换—完全分步进行,并附有说明,代码和对每一部分工作原理的解释。 希望您编码并喜欢!

免责声明

网站可以限制或禁止从其网站抓取数据。 用户可能会受到法律后果的影响,具体取决于您尝试在何处以及如何尝试收集信息。 网站通常会在其使用条款和网站上的robots.txt文件中对此进行描述,该文件通常看起来像这样: www.example.com/robots.txt 。 因此,请负责任地进行抓取,并尊重robots.txt。

什么是网络爬虫?

Web抓取包括收集网站上可用的数据。 这可以由人类手动或通过机器人来完成。

机器人程序是您构建的程序,可帮助您比人的手和眼睛更快地提取所需的数据。

我们要刮什么?

从一开始就确定您的抓取目标至关重要。 我们不想刮除我们实际上不需要的任何数据。

对于此项目,我们将从IMDb的“前1,000名”电影 (尤其是此页面中前50名电影)中抓取数据。 这是我们将从每个电影列表中收集的信息:

  • 标题
  • 发行年份
  • 电影多长时间
  • IMDb对电影的评分
  • 电影的Metascore
  • 电影获得了多少票
  • 电影的美国总收入

Web爬网程序如何工作?

Web抓取器以与人类相同的方式收集网站数据:他们进入网站的网页,获取相关数据,然后继续浏览下一个网页-速度要快得多。

每个网站都有不同的结构。 这些是构建网络刮板时要考虑的一些重要事项:

  • 包含您要查找的数据的网页的结构是什么?
  • 我们如何到达那些网页?
  • 您是否需要从下一页收集更多数据?

网址

首先,让我们看一下我们要抓取的页面URL

这是我们在URL中看到的:

我们注意到有关URL的一些信息:

  1. ?   充当分隔符—指示URL资源路径的结尾和参数的开头
  2. groups=top_1000   指定页面的内容
  3. &ref_adv_prv   带我们到下一页或上一页。 参考是我们当前所在的页面。 adv_nxtadv_prv是两个可能的值-转换为前进到下一页前进到上一页。

在页面之间来回导航时,您会注意到只有参数发生了变化。 请牢记此结构,因为在构建刮板时了解这一点很有帮助。

HTML

HTML代表超文本标记语言,大多数网页都是使用超文本标记语言编写的。 从本质上讲,HTML是在互联网上两台电脑如何相互说话,网站是他们在说什么

当您访问URL时,计算机会将请求发送到承载该站点的服务器。 该服务器(JavaScript,Ruby,Java等)上可以运行任何技术来处理您的请求。 最终,服务器将响应返回给您的浏览器; 通常,该响应将以HTML页面的形式显示,供您的浏览器显示。

HTML在语义上描述了网页的结构,并且最初包含了有关文档外观的提示。

检查HTML

Chrome,Firefox和Safari用户可以通过右键单击鼠标并按“检查”选项来检查任何页面HTML结构。

菜单将显示在页面的底部或右侧,其中列出了显示在浏览器窗口中的信息的所有HTML标签的一长串列表。 如果您使用的是Safari(上图),则需要按一下搜索栏左侧的按钮,该按钮看起来像是目标。 如果您使用的是Chrome或Firefox,则会在左上角有一个小框,上面带有箭头图标,供您检查。

单击后,如果将光标移到页面的任何元素上,您会注意到它会与相关菜单中HTML标签一起突出显示,如上所示。

了解如何读取页面HTML页面的基本结构很重要,因此我们可以使用Python来帮助我们从页面提取HTML。

工具类

我们将使用的工具是:

  • 复制   (可选的)   是通过您的Web浏览器使用的简单的交互式计算机编程环境。 如果您还没有IDE,我建议仅将其用于代码。 如果您使用Repl,请确保您使用的是Python环境。
  • 请求将使我们能够发送HTTP请求以获取HTML文件
  • 美丽汤   将帮助我们解析HTML文件
  • 熊猫将帮助我们将数据组装到DataFrame中进行清理和分析
  • NumPy将增加对用于数组的数学函数和工具的支持

现在,让我们编码

您可以在Repl环境或IDE中进行以下操作,也可以在此处直接转到整个代码 。 玩得开心!

导入工具

首先,我们将导入所需的工具,以便可以使用它们来帮助我们构建抓取工具并获取所需的数据。

英文电影

当我们运行代码来刮擦其中的某些电影时,很有可能会将电影名称翻译成电影起源国的主要语言。

使用此代码来确保我们从所抓取的所有电影中获得英文翻译的标题:

请求URL的内容

通过请求URL获取我们正在查看的页面的内容:

细分URL请求:

  • url   是我们创建的变量,并将URL分配给
  • results是我们创建的用于存储request.get操作的变量
  • requests.get(url, headers=headers)是我们用来获取URL内容的方法。
  • headers部分告诉我们的抓取工具根据之前的代码行为我们带来英语。

使用BeautifulSoup

使用BeautifulSoup,使我们抓取的内容易于阅读:

分解BeautifulSoup:

  • soup是我们创建的变量,用于将BeatifulSoup方法分配给该方法,该方法使用HTML解析器指定所需的结果格式-这允许Python读取页面的组件,而不是将其视为一个长字符串
  • print(soup.prettify())   将打印   我们抓住了什么   以更结构化的树格式,使其更易于阅读

打印结果看起来将更加有序,如下所示:

初始化您的存储

当我们编写代码提取数据时,我们需要在某个地方存储该数据。 为要提取的每种数据类型创建变量,并为其分配一个空列表,用方括号[] 。 记住我们想从较早的每部电影中获取的信息列表:

您的代码现在应该看起来像这样。 请注意,我们可以删除print功能,直到需要再次使用它为止。

找到合适的div容器

现在是时候在我们的网页上查看HTML代码了。

转到我们正在抓取的网页,对其进行检查,然后将其完整地悬停在单个电影上,如下所示:

我们需要弄清楚这些区别与我们看到的其他div容器之间的区别。

您会在右边看到div元素列表,其中的class属性具有两个值: lister-itemmode-advanced

如果您单击其中的每个,都会注意到它会高亮显示页面左侧的每个电影容器,如上所示。

如果我们在inspect中进行快速搜索(按Ctrl + F并键入lister-item mode-advanced ),我们将在单个页面上看到50个匹配项,代表50部电影。 现在,我们知道我们寻求的所有信息都位于该特定的div标签内。

查找所有lister-item mode-advanced div

我们的下一步是告诉我们的抓取工具找到所有这些列表项模式高级div:

打破 find_all 下来:

  • movie_div是用于存储所有div容器的变量,该容器具有lister-item mode-advanced
  • find_all() 方法从我们存储在变量汤中的内容中提取所有具有lister-item mode-advanced的class属性的div容器。

准备提取每个项目

如果我们看清单上的第一部电影:

我们缺少总收入! 如果您看第二部电影,他们会把它放在那里。

构建Web爬网程序时始终要考虑的一个想法是,并非您所搜集到的所有信息都可以供您收集。

在这些情况下,我们需要确保我们的网络抓取工具不会在丢失数据时停止工作或中断,并围绕我们只是不知道是否会发生的想法而建立。

进入每个lister-item mode-advanced div

当我们在单个lister-item mode-advanced div容器中抓取我们需要的每个项目时,我们需要刮板循环到下一个lister-item mode-advanced div容器并抓取这些电影项目。 然后需要循环到下一个,依此类推-每页50次。 为了执行此操作,我们需要将刮板包装在for循环中

分解for循环:

  • for   循环   用于迭代序列。 我们的序列是我们存储在movie_div每个lister-item mode-advanced div容器
  • container   是输入每个div的变量的名称。 您可以随意命名( xloopbananacheese ),它不会改变循环的功能。

可以这样阅读:

提取电影的标题

从电影的名称开始,让我们通过使用inspect并单击标题来找到其相应HTML行。

我们看到该名称包含在锚标记<a> 。 该标签嵌套在标题标签<h3><h3>标记嵌套在<div>标记内。 此<div>是嵌套在第一部电影的容器中的div的三分之一。

分解标题:

  • name是用于存储找到的标题数据的变量
  • container是我们for循环中使用的container -每次都用于迭代。
  • h3.a是属性符号,并告诉抓取器访问这些标签中的每个标签。
  • text告诉刮板获取嵌套在<a>标记中的文本
  • titles.append(name)告诉titles.append(name)器获取我们发现并存储在name中的内容,并将其添加到我们在开头创建的名为titles.append(name)的空列表中

提取发行年份

让我们使用检查并单击年份来查找电影的年份及其相应HTML行。

我们看到此数据存储在<a>标记下的<span>标记内,该标记包含电影的标题。 我们用于查找标题数据( .h3.a )的点符号.h3.a ,是因为它是h3标签之后的第一个<a>标签。 由于我们想要的<span>标记是第二个<span>标记,因此我们必须使用其他方法。

相反,我们可以告诉我们的搜寻器以第二个<span>的独特标记进行搜索。 我们将使用find() 方法 ,该方法类似于find_all()只是它只返回第一个匹配项。

分解年份:

  • year是用于存储发现的年份数据的变量
  • container是我们在for循环中使用的container -每次都用于迭代。
  • h3是属性符号,它告诉抓取器访问该标签。
  • find()是一种用于访问此特定<span>标记的方法
  • 'span', class_ = 'lister-item-year' )是我们想要的独特<span>标签
  • years.append(year)告诉years.append(year)器获取我们在year中发现并存储的内容,并将其添加到名为years.append(year)我们在开始时创建的)的空列表中

提取电影的长度

通过使用检查并单击总分钟来找到电影的长度及其对应HTML行。

我们需要的数据可以在带有运行时类的<span>标记中找到。 就像我们对year所做的一样,我们可以做类似的事情:

分解时间:

runtime是用于存储发现的时间数据的变量

  • container   是我们在for循环中使用的-每次都用于迭代。
  • find()是一种用于访问此特定<span>标记的方法
  • 'span',class_ ='runtime' )是我们想要的独特的<span>标记
  • if container.p.find('span', class_='runtime') else '-'   说如果那里有数据,请抓住它-但是如果数据丢失,则在此处放一个破折号。
  • text告诉抓取工具在<span>标记中抓取该文字
  • time.append(runtime)告诉time.append(runtime)器获取在运行时中找到并存储的内容,并将其添加到名为time(我们在开始时创建的空列表)中

提取IMDb评分

通过使用检查并单击IMDb等级来查找电影的IMDb等级及其相应HTML行。

现在,我们将专注于提取IMDb评级。 我们需要的数据可以在<strong>标记中找到。 由于我看不到任何其他<strong>标记,因此我们可以使用属性符号(点符号)来获取此数据。

分解IMDb评级:

  • imdb是用于存储它发现的IMDB评级数据的变量
  • container是我们在for循环中使用的container -每次都用于迭代。
  • 表示刮板访问该标签的属性符号strong
  • text告诉刮板抓取该文字
  • float() 方法将我们找到的文本转换为浮点数(十进制)
  • imdb_ratings.append(imdb)告诉imdb_ratings.append(imdb)器获取我们发现并存储在imdb ,并将其添加到名为imdb_ratings的空列表中(我们在开头创建)。

提取Metascore

通过使用检查并单击Metascore编号,找到电影的Metascore等级及其相应HTML行。

我们需要的数据可以在<span>标记中找到,该标记具有一个表示metascore favorable的类。

在我们确定这一点之前,您应该注意到,“寄生虫”的96当然具有良好的评价,但是其他评价是否令人满意? 如果突出显示下一部电影的Metascore,您会看到“ JoJo Rabbit”具有一个说metascore mixed的类。 由于这些标记不同,因此可以安全地告诉刮板在刮板时仅使用类metascore

分解Metascores:

  • m_score是我们将用来存储其找到的Metascore评分数据的变量
  • container是我们在for循环中使用的container -每次都用于迭代。
  • find()是一种用于访问此特定<span>标记的方法
  • 'span', class_ = 'metascore' )是我们想要的独特的<span>标签。
  • text告诉刮板抓取该文字
  • if container.find('span', class_='metascore') else '-'表示那里有数据,请抓住它-但是如果数据丢失,则在其中加一个破折号
  • int() 方法将我们找到的文本转换为整数
  • metascores.append(m_score)告诉metascores.append(m_score)器获取我们发现并存储在m_score ,并将其添加到称为metascores的空列表中(我们在开头创建)

提取票数和总收入

我们终于进入了我们需要提取的最后两个项目,但是我们保留了最后一个最困难的项目。

这是有些棘手的地方。 如前所述,您应该已经注意到,当我们查看此列表中的第一部电影时,我们看不到总收入数字。 当我们查看列表中的第二部电影时,我们可以看到两者。

让我们看一下第二部电影HTML代码,然后从那里开始。

选票和总票数都在右侧突出显示。 看了电影#2的票数和毛额后,您注意到了什么?

如您所见,这两个标签都位于<span>标记中,该标记的name属性等于nvdata-value属性则包含我们每个data-value唯一编号的值。

如果第一个的搜索参数相同,我们如何获取第二个的数据? 我们如何告诉我们的刮板跳过第一个刮板而第二个刮板呢?

这个人花了很多时间去动脑筋,喝大量的咖啡,并花了几个深夜才弄清楚。 这是我的做法:

破票和毛额下降:

  • nv是一个全新的变量,我们将使用它来同时容纳票数和<span>标记
  • container是我们在for循环中每次迭代所使用的container
  • find_all()是我们用来抓取两个<span>标记的方法
  • 'span', attrs = 'name' : 'nv' )是我们如何获取特定标签的属性。
  • vote是用于存储在nv标签中找到的投票的变量
  • nv[0]告诉抓取工具进入nv标签并获取列表中的第一个数据-之所以投票,是因为投票在我们HTML代码中排在第一位(计算机以二进制计数-它们从0开始计数,而不是1)。
  • text告诉刮板抓取该文字
  • votes.append(vote)告诉votes.append(vote)器获取我们发现并存储在vote ,并将其添加到称为votes的空列表中(这是我们在开始时创建的)
  • grosses是用于存储在nv标签中找到的Gross的变量
  • nv[1]告诉抓取工具进入nv标签并获取列表中的第二个数据-这很重要,因为Gross在我们HTML代码中排第二
  • nv[1].text if len(nv) > 1 else '-'表示如果nv的长度大于1,则查找存储的第二个数据。 但是,如果存储在nv的数据不大于一个(即,如果缺少总值),则在此处添加一个破折号。
  • us_gross.append(grosses)告诉us_gross.append(grosses)器获取我们发现并存储在grosses ,并将其添加到名为us_grosses的空列表中(我们在开头创建)

您的代码现在应如下所示:

让我们看看我们到目前为止

既然我们已经告诉了刮板要刮哪些元素,就让我们使用打印功能打印出每个列表,然后将刮数据发送到:

我们的清单看起来像这样

['Parasite', 'Jojo Rabbit', '1917 ', 'Knives Out', 'Uncut Gems', 'Once Upon a Time... in Hollywood', 'Joker', 'The Gentlemen', 'Ford v Ferrari', 'Little Women', 'The Irishman', 'The Lighthouse', 'Toy Story 4 ', 'Marriage Story', 'Avengers: Endgame', 'The Godfather', 'Blade Runner 2049 ', 'The Shawshank Redemption', 'The Dark Knight', 'Inglourious Basterds', 'Call Me by Your Name', 'The Two Popes', 'Pulp Fiction', 'Inception', 'Interstellar', 'Green Book', 'Blade Runner', 'The Wolf of Wall Street', 'Gone Girl', 'The Shining', 'The Matrix', 'Titanic', 'The Silence of the Lambs', 'Three Billboards Outside Ebbing, Missouri', "Harry Potter and the Sorcerer's Stone" , 'The Peanut Butter Falcon', 'The Handmaiden', 'Memories of Murder', 'The Lord of the Rings: The Fellowship of the Ring', 'Gladiator', 'The Martian', 'Bohemian Rhapsody', 'Watchmen', 'Forrest Gump', 'Thor: Ragnarok', 'Casino Royale', 'The Breakfast Club', 'The Godfather: Part II', 'Django Unchained', 'Baby Driver']
['( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '(I) ( 2019 )', '( 2019 )', '( 2019 )', '( 2019 )', '( 1972 )', '( 2017 )', '( 1994 )', '( 2008 )', '( 2009 )', '( 2017 )', '( 2019 )', '( 1994 )', '( 2010 )', '( 2014 )', '( 2018 )', '( 1982 )', '( 2013 )', '( 2014 )', '( 1980 )', '( 1999 )', '( 1997 )', '( 1991 )', '( 2017 )', '( 2001 )', '( 2019 )', '( 2016 )', '( 2003 )', '( 2001 )', '( 2000 )', '( 2015 )', '( 2018 )', '( 2009 )', '( 1994 )', '( 2017 )', '( 2006 )', '( 1985 )', '( 1974 )', '( 2012 )', '( 2017 )']
[' 132 min', ' 108 min', ' 119 min', ' 131 min', ' 135 min', ' 161 min', ' 122 min', ' 113 min', ' 152 min', ' 135 min', ' 209 min', ' 109 min', ' 100 min', ' 137 min', ' 181 min', ' 175 min', ' 164 min', ' 142 min', ' 152 min', ' 153 min', ' 132 min', ' 125 min', ' 154 min', ' 148 min', ' 169 min', ' 130 min', ' 117 min', ' 180 min', ' 149 min', ' 146 min', ' 136 min', ' 194 min', ' 118 min', ' 115 min', ' 152 min', ' 97 min', ' 145 min', ' 132 min', ' 178 min', ' 155 min', ' 144 min', ' 134 min', ' 162 min', ' 142 min', ' 130 min', ' 144 min', ' 97 min', ' 202 min', ' 165 min', ' 113 min']
[ 8.6 , 8.0 , 8.5 , 8.0 , 7.6 , 7.7 , 8.6 , 8.1 , 8.2 , 8.0 , 8.0 , 7.7 , 7.8 , 8.0 , 8.5 , 9.2 , 8.0 , 9.3 , 9.0 , 8.3 , 7.9 , 7.6 , 8.9 , 8.8 , 8.6 , 8.2 , 8.1 , 8.2 , 8.1 , 8.4 , 8.7 , 7.8 , 8.6 , 8.2 , 7.6 , 7.7 , 8.1 , 8.1 , 8.8 , 8.5 , 8.0 , 8.0 , 7.6 , 8.8 , 7.9 , 8.0 , 7.9 , 9.0 , 8.4 , 7.6 ]
[' 96        ', ' 58        ', ' 78        ', ' 82        ', ' 90        ', ' 83        ', ' 59        ', ' 51        ', ' 81        ', ' 91        ', ' 94      ', ' 83        ', ' 84        ', ' 93        ', ' 78        ', ' 100        ', ' 81        ', ' 80        ', ' 84        ', ' 69        ', ' 93 ', ' 75        ', ' 94        ', ' 74        ', ' 74        ', ' 69        ', ' 84        ', ' 75        ', ' 79        ', ' 66        ', ' 73        ', ' 75        ', ' 85        ', ' 88        ', ' 64        ', ' 70        ', ' 84        ', ' 82        ', ' 92        ', ' 67        ', ' 80        ', ' 49   ', ' 56        ', ' 82        ', ' 74        ', ' 80        ', ' 62        ', ' 90        ', ' 81        ', ' 86        ']
[' 282 , 699 ', ' 142 , 517 ', ' 199 , 638 ', ' 195 , 728 ', ' 108 , 330 ', ' 396 , 071 ', ' 695 , 224 ', ' 42 , 015 ', ' 152 , 661 ', ' 65 , 234 ', ' 249 , 950 ', ' 77 , 453 ', ' 160 , 180 ', ' 179 , 887 ', ' 673 , 115 ', ' 1 , 511 , 929 ', ' 414 , 992 ', ' 2 , 194 , 397 ', ' 2 , 176 , 865 ', ' 1 , 184 , 882 ', ' 178 , 688 ', ' 76 , 291 ', ' 1 , 724 , 518 ', ' 1 , 925 , 684 ', ' 1 , 378 , 968 ', ' 293 , 695 ', ' 656 , 442 ', ' 1 , 092 , 063 ', ' 799 , 696 ', ' 835 , 496 ', ' 1 , 580 , 250 ', ' 994 , 453 ', ' 1 , 191 , 182 ', ' 383 , 958 ', ' 595 , 613 ', ' 34 , 091 ', ' 92 , 492 ', ' 115 , 125 ', ' 1 , 572 , 354 ', ' 1 , 267 , 310 ', ' 715 , 623 ', ' 410 , 199 ', ' 479 , 811 ', ' 1 , 693 , 344 ', ' 535 , 065 ', ' 555 , 756 ', ' 330 , 308 ', ' 1 , 059 , 089 ', ' 1 , 271 , 569 ', ' 398 , 553 ']
['-', '$ 0.35 M', '-', '-', '-', '$ 135.37 M', '$ 192.73 M', '-', '-', '-', '-', '$ 0.43 M', '$ 433.03 M', '-', '$ 858.37 M', '$ 134.97 M', '$ 92.05 M', '$ 28.34 M', '$ 534.86 M', '$ 120.54 M', '$ 18.10 M', '-', '$ 107.93 M', '$ 292.58 M', '$ 188.02 M', '$ 85.08 M', '$ 32.87 M', '$ 116.90 M', '$ 167.77 M', '$ 44.02 M', '$ 171.48 M', '$ 659.33 M', '$ 130.74 M', '$ 54.51 M', '$ 317.58 M', '$ 13.12 M', '$ 2.01 M', '$ 0.01 M', '$ 315.54 M', '$ 187.71 M', '$ 228.43 M', '$ 216.43 M', '$ 107.51 M', '$ 330.25 M', '$ 315.06 M', '$ 167.45 M', '$ 45.88 M', '$ 57.30 M', '$ 162.81 M', '$ 107.83 M']

到目前为止还不错,但是我们还没有到那儿。 我们需要稍微整理一下数据。 看起来我们的数据中有一些不需要的元素:美元符号,女士,分钟,逗号,括号和Metascores中的多余空格。

用熊猫构建一个DataFrame

接下来的工作是用熊猫构建一个DataFrame来将我们拥有的数据很好地存储在一个表中,以真正了解正在发生的事情。

这是我们的方法:

分解数据框:

  • movies就是我们要命名的DataFrame
  • pd.DataFrame是我们如何使用熊猫初始化pd.DataFrame的创建的方法
  • 左侧的键是列名称
  • 右边的值是我们抓取的数据列表

查看我们的数据框

我们只需在程序底部使用DataFrame上的打印功能(我们称为电影)就可以看到一切:

我们的熊猫DataFrame看起来像这样

资料品质

在开始这样的项目之前,您必须知道数据质量标准是什么-意味着数据应遵循哪些规则或约束。 这里有些例子:

  • 数据类型约束:列中的值必须是特定的数据类型:数字,布尔值,日期等。
  • 强制性约束 :某些列不能为空
  • 正则表达式模式:必须为特定模式的ext字段,例如电话号码

什么是数据清理?

数据清理是检测和更正或删除数据集中损坏或不准确的记录的过程。

在进行数据分析时,确保我们使用正确的数据类型也很重要。

检查数据类型

我们可以通过在程序底部运行以下打印功能来检查数据类型:

我们的数据类型结果

让我们分析一下:   我们的电影数据类型是一个对象,它与字符串相同,考虑到它们是电影的标题,这是正确的。 我们的IMDb分数也是正确的,因为在此列中有浮点数(十进制数)。

但是我们的yeartimeMinmetascorevotes显示它们是整数数据类型时是对象,而us_grossMillions   是一个对象,而不是float数据类型。 这怎么发生的?

最初,当我们告诉抓取器从每个HTML容器中获取这些值时,我们是在告诉它从字符串中获取特定值。 字符串表示的文本而不是数字-它是由一组可以包含数字字符组成。

例如, cheese一词和phrase I ate 10 blocks of cheese这两个词都是字符串。 如果我们要摆脱一切的除了10I ate 10 blocks of cheese串,它仍然是一个字符串-但现在它是一个只说10

用熊猫清理数据

现在,我们对数据的状态有了清晰的了解,是时候开始清理数据了。

这可能是一个繁琐的任务,但这是非常重要的。

清洁年数据

要从年份数据中删除括号并将对象转换为整数数据类型,我们将执行以下操作:

分解清洁年数据:

  • movies['year']告诉熊猫在我们的DataFrame进入列年份
  • .str.extract('(\d+')此方法: ('(\d+')表示提取字符串中的所有数字
  • .astype(int) 方法将结果转换为整数

现在,如果我们在程序的底部运行print(movies['year'])以查看年份数据,结果如下:

您应该看到没有任何括号的年份列表。 现在显示的数据类型是整数。 我们的年度数据已被正式清理。

清洁时间数据

我们将只抓取数字并将数据类型转换为整数,从而完全按照上面的方法将年份数据清除为时间数据。

清理Metascore数据

我们在这里需要做的唯一清除工作就是将对象数据类型转换为整数:

清洁票

通过投票,我们需要删除逗号并将其转换为整数数据类型:

分解清洁票:

  • DataFrame movies['votes']是电影DataFrame票数数据。 我们正在将新的清理数据分配给票数DataFrame
  • .str.replace(' , ' , '')抓取字符串并使用replace 方法将逗号替换为空引号(无)
  • .astype(int) 方法将结果转换为整数


清理总数据

总数据涉及一些障碍。 我们需要做的是从数据中删除美元符号和Ms,然后将其转换为浮点数。 方法如下:

分解清洁总量:

顶部清洁代码:

  • movies['us_grossMillions']是电影DataFrame总数据。 我们将把新的清理数据分配给us_grossMillions列。
  • movies['us_grossMillions']告诉熊猫进入column us_grossMillions中的DataFrame column us_grossMillions
  • .map() 函数为可迭代项的每个项目调用指定的函数
  • lambda x: x是Python中的匿名函数(一个没有名称的函数)。 正常功能是使用def关键字定义的。
  • lstrip('$').rstrip('M')是我们的函数参数。 这告诉我们函数从左侧剥离$并从右侧剥离M

底部转换代码:

  • movies['us_grossMillions']被剥离movies['us_grossMillions']了我们不需要的元素,现在我们将为其分配转换代码数据以完成操作
  • pd.to_numeric是一种方法 ,我们可以使用此列更改为浮动。 我们之所以使用它,是因为此列中有很多破折号,并且不能仅使用.astype(float)将其转换为浮点型-这会捕获错误。
  • errors='coerce'会将非数字值(破折号)转换为NaN   (非数字)值   因为我们用破折号代替了丢失的数据

查看清理和转换后的代码

让我们看看我们是如何做到的。 运行打印功能以查看我们的数据和我们拥有的数据类型:

我们清理的数据的结果

我们的数据类型的结果

看起来挺好的!

最终完成代码

这是单页网页抓取器的最终代码:

将数据保存到CSV

如果我们无法将其保存以用于将来的任何项目或分析,那么这些数据的用途是什么? 您可以在程序底部添加以下代码,以将数据保存到CSV文件中:

分解CSV文件:

  • movies.to_csv('movies.csv')

为了使此代码成功运行,您需要创建一个空文件并将其命名为任意名称-确保它具有.csv   延期。 我将其命名为movies.csv  如您在上方看到的,但是可以随便命名。 只要确保更改上面的代码以使其匹配即可。

如果您位于Repl中,则可以通过将鼠标悬停在“文件”附近并单击“添加文件”选项来创建一个空的CSV文件。 为其命名,并以.csv扩展名保存。 然后,将代码添加到程序的末尾:

movies.to_csv('the_name_of_your_csv_here.csv')

您的所有数据都应填充到CSV中。 将其下载到计算机上/打开后,文件将如下所示:

结论

从请求网页HTML内容到清理整个DataFrame,我们已经走了很长一段路。 现在,您应该知道如何使用上面显示HTML和URL结构来抓取网页。 以下是我们已完成的工作的摘要:

下一步

希望您玩得开心!

如果您想以自己学到的东西为基础,请尝试以下一些想法:

  • 获取该列表上所有1,000部电影的电影数据
  • 刮刮有关每部电影的其他数据,例如流派,导演,主演或电影摘要
  • 查找其他网站以吸引您的兴趣

在我的下一篇文章中,我将解释如何遍历此IMDb列表的所有页面以获取全部1,000部电影,这将涉及对此处最终代码的一些改动。

编码愉快!

先前发布在https://medium.com/better-programming/the-only-step-by-step-guide-youll-need-to-build-a-web-scraper-with-python-e79066bd895a

翻译自: https://hackernoon.com/how-to-build-a-web-scraper-with-python-step-by-step-guide-jxkp3yum

python爬虫使用指南

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值