数据科学引论-Python之道 第5课数据收集 一、Python网络爬虫实践样例一 我们将通过使用Python编写一个爬虫脚本,从网页上爬取数据集,这需要 综合地使用Python所涉及的基本语法,然后同时也掌握一些爬虫的技巧。 首先,我们需要了解爬虫是什么,包括理解URL、爬虫机制、网页HTML的 基本概念。我们在浏览网页的时候,肯定会希望得到网页中的一些关键内容和一 些有趣的图片,你想把它们直接批量下载下来,这就是需要爬虫来支持。爬虫 crawler,即网络爬虫Spider,是一个能够自动化地访问互联网并将网站内容下载 下来的的程序或脚本。 在爬取之前,我们需要定位网址,也就是URL,我们要通过URL选择要爬取 的网页。URL可以理解为网址,它是一个路径,一个指向网页的路径。我们将通 过指定很多个网页路径的方式来对网页进行批量爬取。爬虫任务会使用到一些 Python的类、列表、字典、循环等基础语法。 我们的任务是从名人名言的网站爬取其前两页。我们可以点击进去看一下这 个网页的内容。该网页分为了好几部分,有好几条名言,每一条名言都会显示其 内容,作者和标签。我们的任务就是爬取每一条名言当中的文字内容、作者以及 标签,并且以SON格式保存到文件中,那么我们需要关注什么呢?
数据科学引论-P瀌瀇濻瀂瀁 之道 第 5 课 数据收集 一、P瀌瀇濻瀂瀁 网络爬虫实践 样例一 我们将通过使用 P瀌瀇濻瀂瀁 编写一个爬虫脚本,从网页上爬取数据集,这需要 综合地使用 P瀌瀇濻瀂瀁 所涉及的基本语法,然后同时也掌握一些爬虫的技巧。 首先,我们需要了解爬虫是什么,包括理解 URL、爬虫机制、网页 HTML 的 基本概念。我们在浏览网页的时候,肯定会希望得到网页中的一些关键内容和一 些有趣的图片,你想把它们直接批量下载下来,这就是需要爬虫来支持。爬虫 濶瀅濴瀊濿濸瀅,即网络爬虫 S瀃濼濷濸瀅,是一个能够自动化地访问互联网并将网站内容下载 下来的的程序或脚本。 在爬取之前,我们需要定位网址,也就是 URL,我们要通过 URL 选择要爬取 的网页。URL 可以理解为网址,它是一个路径,一个指向网页的路径。我们将通 过指定很多个网页路径的方式来对网页进行批量爬取。爬虫任务会使用到一些 P瀌瀇濻瀂瀁 的类、列表、字典、循环等基础语法。 我们的任务是从名人名言的网站爬取其前两页。我们可以点击进去看一下这 个网页的内容。该网页分为了好几部分,有好几条名言,每一条名言都会显示其 内容,作者和标签。我们的任务就是爬取每一条名言当中的文字内容、作者以及 标签,并且以 JSON 格式保存到文件中,那么我们需要关注什么呢?
→C⊙quotes.toscrape,com/page.2l Quotes to Scrape "This life is what you make it.No matter what,you're going to sometimes,it's a universal truth.But the good part is you get t how you're going to mess it up.Girls will be your friends-they anyway.But just remember,some come,some go.The ones t 我们使用的是Scrapy爬虫,它使用Python编写的爬虫,其中最主要的是 scrapy..spider类,它有两个方法需要我们关注,一个是init初始化方法,一个是 parse解析方法,分别代表了爬取过程中的两个步骤。在init方法中,我们需要 设置网站列表和保存文件的路径,前者决定了需要爬取哪些网站,后者确定了爬 取内容的保存方式。parse则指明了在每一个网页上需要爬取哪些内容,以及如 何进行爬取。下图显示了爬虫工作的过程: 机构 投资总数最新投资事件 Secur htps://www.itjuzi.com/ Scrapy 25 IDG资本 725 品生医学 3经纬中国 602 皇包车 URL HTML TOOL FORMAT 地址 网页原内容 工具 格式 统一资源定位 网页内容编码 爬虫工具 统化格式 符网址) 根据urd指定 我们要从中 访问网页并 得到信息将 需要爬取的 提取我们需 从html解析 数据整理成 网页 要的关键信 信息的具体 统一格式导 息 工具,如 出 Scrapy 在init的方法中,我们需要关注两个变量,一个是self.urls,表示待爬取网站 的列表;另一个是sef.fle,表示的是用于输出的文件对象。 parse方法针对每一个URL,决定了在网页内容爬取下来之后,如何解析它 们,即如何从中提取到一些关键的内容。这里需要使用一些Scrapy的选择器, 选择器的语法其实很多。在这里,我们这个样例中只用到了很小的一部分,如果 你想去深入地了解,那么我们可以点击notebook上的链接,它是一个很全面的
我们使用的是 S濶瀅濴瀃瀌 爬虫,它使用 P瀌瀇濻瀂瀁 编写的爬虫,其中最主要的是 瀆濶瀅濴瀃瀌.瀆瀃濼濷濸瀅 类,它有两个方法需要我们关注,一个是 濼瀁濼瀇 初始化方法,一个是 瀃濴瀅瀆濸 解析方法,分别代表了爬取过程中的两个步骤。在 濼瀁濼瀇 方法中,我们需要 设置网站列表和保存文件的路径,前者决定了需要爬取哪些网站,后者确定了爬 取内容的保存方式。瀃濴瀅瀆濸 则指明了在每一个网页上需要爬取哪些内容,以及如 何进行爬取。下图显示了爬虫工作的过程: 在 濼瀁濼瀇 的方法中,我们需要关注两个变量,一个是 瀆濸濿濹.瀈瀅濿瀆,表示待爬取网站 的列表;另一个是 瀆濸濿濹.濹濼濿濸,表示的是用于输出的文件对象。 瀃濴瀅瀆濸 方法针对每一个 URL,决定了在网页内容爬取下来之后,如何解析它 们,即如何从中提取到一些关键的内容。这里需要使用一些 S濶瀅濴瀃瀌 的选择器, 选择器的语法其实很多。在这里,我们这个样例中只用到了很小的一部分,如果 你想去深入地了解,那么我们可以点击 瀁瀂瀇濸濵瀂瀂濾 上的链接,它是一个很全面的
教程。 回到我们的笔记上来,重点解释下面这一串代码在干什么。 class NySpider(serapy.Spider): name -"spider" def_init_〔elf)r aelf.file open('demol_quotes.json','w'); 来设置特爬取网站列表 ae1f,ur1s=【1 for i in range(1,3): self.urls.append('http://quotes.toscrape.com/page/'+str(i) 初始化效果效果等同 self.urls=[ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', print(self.urla) e(urlul,callbaek-aeif-paree) 米提飘名言列表 quotes response.css("div.quote"); coCegoeteat1etocttnti ote.c88(".tags .tag::text").extract(); oF,text,) ·c网址可以当做爬取进度来特,与程序逻无关 (self.file) print("over:"+response.url) 首先是iit方法,第一步先指定了需要把文件输出到哪里,我们将会输出到 一个名为demo1_quotes.json的文件中,这个文件和你的这个笔记位于相同的目 录中。然后,我们使用一个循环来得到待爬取网站的列表,如果想要爬取多页, 可以把这边的3改成其他值。for循环等同于注释掉的语句,只不过其写法更加 优雅。 我们可以到要爬取的网站上去看看,可以看到其地址中有一个page,后面跟 着/1。当我们点击next也就是下一页的时候,1会变成了2。我们通过观察发现 这些网页的规律,其URL最后的数字就表示第几页。我们爬起前3页就是/1
教程。 回到我们的笔记上来,重点解释下面这一串代码在干什么。 首先是 濼瀁濼瀇 方法,第一步先指定了需要把文件输出到哪里,我们将会输出到 一个名为 濷濸瀀瀂1_瀄瀈瀂瀇濸瀆.濽瀆瀂瀁 的文件中,这个文件和你的这个笔记位于相同的目 录中。然后,我们使用一个循环来得到待爬取网站的列表,如果想要爬取多页, 可以把这边的 3 改成其他值。濹瀂瀅 循环等同于注释掉的语句,只不过其写法更加 优雅。 我们可以到要爬取的网站上去看看,可以看到其地址中有一个 瀃濴濺濸,后面跟 着/1。当我们点击 瀁濸瀋瀇 也就是下一页的时候,1 会变成了 2。我们通过观察发现 这些网页的规律,其 URL 最后的数字就表示第几页。我们爬起前 3 页就是/1
/2、3,爬取两页就是/1、/2。 start_request函数我们不用去深究,这是涉及到Scrapy语法的问题。如果你 有兴趣去修改,可以去参考其教程。 我们回到爬虫当中最复杂也就是最关键的一部分,就是专门负责如何去解析 的parser函数,它有一个参数叫做response,其中包含的就是从网页上爬取下 来的所有HTML代码,然后我们将分条目从里面获取到我们想要的信息。 首先,我们看到的是quotes=response.css(div.quote"),这条语句的意思是 提取出名言列表。什么是名言列表?网页爬虫的工作过程是跟网页密切相关的。 我们回到第一页,可以看到其中包含好几条名言,爬虫实际解析的是HTML代 码,我们可以看右边HTML代码中有好几个div,每一个class为quotes的div 就是一条名言。 t年50.451,2 arm The world as we have created it is a process of our thinking.It cannot be changed without changing our thinking." by Albert Einstein (about) Tags:chanpe deep-thoughts thinking world "It is our choices,Harry,that show what we truly are,far more than our abilities." by J.K.Rowling (about) dlv ctass-"tags"/div Tags:abities choices e ty=htp/ sdmagentyoe-http/ "There are only two ways to live your life.One is as though nothing is a miracle.The other is as though everything is a miracle. 我们通过选择器把名言一条一条地区分开来,然后再从中展开得到里面的名 言信息。第一条语句的含义就是将HTML代码中的所有div的class等于quote 的名言以列表形式一条一条全部提取出来。一旦这条语句执行完,我们就会提取 到每条已经分隔开的名言了。然后,我们要对每一条名言提取关键内容,即名言 内容,作者以及标签的提取,代码中的for循环就是对每一条名言进行这样的操
/2、/3,爬取两页就是/1、/2。 瀆瀇濴瀅瀇_瀅濸瀄瀈濸瀆瀇 函数我们不用去深究,这是涉及到 S濶瀅濴瀃瀌 语法的问题。如果你 有兴趣去修改,可以去参考其教程。 我们回到爬虫当中最复杂也就是最关键的一部分,就是专门负责如何去解析 的 瀃濴瀅瀆濸瀅 函数,它有一个参数叫做 瀅濸瀆瀃瀂瀁瀆濸,其中包含的就是从网页上爬取下 来的所有 HTML 代码,然后我们将分条目从里面获取到我们想要的信息。 首先,我们看到的是 瀄瀈瀂瀇濸瀆 = 瀅濸瀆瀃瀂瀁瀆濸.濶瀆瀆("濷濼瀉.瀄瀈瀂瀇濸"), 这条语句的意思是 提取出名言列表。什么是名言列表?网页爬虫的工作过程是跟网页密切相关的。 我们回到第一页,可以看到其中包含好几条名言,爬虫实际解析的是 HTML 代 码,我们可以看右边 HTML 代码中有好几个 濷濼瀉,每一个 濶濿濴瀆瀆 为 瀄瀈瀂瀇濸瀆 的 濷濼瀉 就是一条名言。 我们通过选择器把名言一条一条地区分开来,然后再从中展开得到里面的名 言信息。第一条语句的含义就是将 HTML 代码中的所有 濷濼瀉 的 濶濿濴瀆瀆 等于 瀄瀈瀂瀇濸 的名言以列表形式一条一条全部提取出来。一旦这条语句执行完,我们就会提取 到每条已经分隔开的名言了。然后,我们要对每一条名言提取关键内容,即名言 内容,作者以及标签的提取,代码中的 濹瀂瀅 循环就是对每一条名言进行这样的操
作。在循环中,我们先提取每条名言中的作者名,在每个quote对象上调用css 函数,找到HTML中的smal.author,提取其中的文本内容。由于一条名言可能 包含多条smal.author,所以我们使用extract_first()提取第一条。接下来,我们再 提取名言的文字内容,就是class=text中的文本内容,并且提取第一条信息。最 后,我们要提取tags,tags有一点特殊,因为每条名言都有好几个tag,我们希 望都能提取出来,所以提取它时不是调用extract_first(),而是调用extract0,这 时会返回一个列表。 最终,当我们得到三项关键信息之后,我们需要做一个整合,并输出整合的 内容。因为我们目标是JSON格式,并且Python提供将字典直接转换成JSON的 功能,所以我们先要把这三个变量转换成字典,然后将字典转换成JSON,最后 写入到文件。最后两条语句是为了及时SON字符串写入文件,如果不写它们, 写入就会在缓满了或其他适当条件满足时才触发。我们暂时不用去深究这两条语 句的含义。 每一个parser只针对一个网页,因为我们之前指定了两个网页,所以它会分 别对两个网页都执行一遍,把所有的数据都爬取下来,并且输出到一个文件中。 之后,我们就要执行一下这个爬虫来看看效果。 前面的代码只是在定义爬虫任务,然后我们要如何真正执行任务呢?就需要 让Scrapy去执行process..start)(,我们可以看到它输出的一些调试信息, 执行爬虫任务 启动后,将执行My9pde,这御分的代码块,如果确实非常了解scrapy的运行机制,那么可以做定制,否测不建议自行修改。 In [2]:from scrapy.cravler import CrawlerProcess process.crawl(MySpider) process..start()这句代码就是开始了整个泥虫过程,会输出一大维信息,可以无规 我们可以从目录中找到写出的SON文件,使用文本编辑器打开,就可以发
作。在循环中,我们先提取每条名言中的作者名,在每个 瀄瀈瀂瀇濸 对象上调用 濶瀆瀆 函数,找到 HTML 中的 瀆瀀濴濿濿.濴瀈瀇濻瀂瀅,提取其中的文本内容。由于一条名言可能 包含多条 瀆瀀濴濿濿.濴瀈瀇濻瀂瀅,所以我们使用 濸瀋瀇瀅濴濶瀇_濹濼瀅瀆瀇()提取第一条。接下来,我们再 提取名言的文字内容,就是 濶濿濴瀆瀆=瀇濸瀋瀇 中的文本内容,并且提取第一条信息。最 后,我们要提取 瀇濴濺瀆,瀇濴濺瀆 有一点特殊,因为每条名言都有好几个 瀇濴濺,我们希 望都能提取出来,所以提取它时不是调用 濸瀋瀇瀅濴濶瀇_濹濼瀅瀆瀇(),而是调用 濸瀋瀇瀅濴濶瀇(),这 时会返回一个列表。 最终,当我们得到三项关键信息之后,我们需要做一个整合,并输出整合的 内容。因为我们目标是 JSON 格式,并且 P瀌瀇濻瀂瀁 提供将字典直接转换成 JSON 的 功能,所以我们先要把这三个变量转换成字典,然后将字典转换成 JSON,最后 写入到文件。最后两条语句是为了及时 JSON 字符串写入文件,如果不写它们, 写入就会在缓满了或其他适当条件满足时才触发。我们暂时不用去深究这两条语 句的含义。 每一个 瀃濴瀅瀆濸瀅 只针对一个网页,因为我们之前指定了两个网页,所以它会分 别对两个网页都执行一遍,把所有的数据都爬取下来,并且输出到一个文件中。 之后,我们就要执行一下这个爬虫来看看效果。 前面的代码只是在定义爬虫任务,然后我们要如何真正执行任务呢?就需要 让 S濶瀅濴瀃瀌 去执行 瀃瀅瀂濶濸瀆瀆.瀆瀇濴瀅瀇(),我们可以看到它输出的一些调试信息, 我们可以从目录中找到写出的 JSON 文件,使用文本编辑器打开,就可以发
现以JSON格式存储的数据。 {"author":"Albert Einstein","text":"\u201cThe world as we have created it is a process of our t {"author":"J.K.Rowling","text":"\u201cIt is our choices,Harry,that show what we truly are,f "author":"Jane Austen","text": {"author": 'Marilyn Monroe". text":"\u201cImperfection is beauty,madness is genius and it's bet {"author":"Albert Einstein","text":"\u201cTry not to become a man of success.Rather become a m {"author":"Andr\u00e9 Gide","text":"\u201cIt is better to be hated for what you are than to be {"author":"Thomas A.Edison","text":"\u201cI have not failed.I've just found 10,000 ways that {"author":"Eleanor Roosevelt" ("author":"Steve "text":"u201cA woman is like a tea bag;you never know how stron roees at you ake Noatert,you're Martin", with u know,night.\u201d" 12 {"author": "J.K.Rowling", \u201cIt takes a great deal of bravery to stand up to our enem {"author":"Albert Einstein","text":"\u201cIf you can't explain it to a six year old,you don't 14 15 acm8r:6eger8,t-202Yueonene,n6eEpenaitrcaLema5sygvs {"author":"Douglas Adams","text":"\u201cI may not have gone where I intended to go,but i think author":"Elie Wiesel","text": \u201cThe opposite of love is not h nate,it's indiffe nce The "author": "Friedrich Nietzsche", u201cIt is not a lack of love,but a lack of friendshi tauthor "Mark Twain","text":"\u201cGood friends,good books,and a sleepy conscience:this is 2 {"author":"Allen Saunders","text":"\u201cLife is what happens to us while we are making other p 21 二、Python网络爬虫实践样例二 这一次我们将会通过一个更加复杂但非常贴近实际的爬虫例子来进行说明。 要爬取的内容来自于T桔子网站,这是一个非常流行的提供有关新公司投资融 资等最新信息的网站。我们目的就是从URL中爬取它的前10页,这个网页相对 来说比前一个笔记爬取的网页要复杂得多。我们要爬取的信息包括每一家公司的 成立时间、地点、最新融资情况。 import os elass MySpider(scrapy.Spider): name -"spider" def init encoding='GBK self.csvwriter csv.DictNriter( self.tile,tieldnames=['name','type','date','province'l) #设置待恋职网咕列表 self.uris [ wuw.itjuzi.com/company?mortby=foundtimespage='+str(i)) dof start reguests(self): Beif.init uri8() for url in self.urls: yield scrapy.Request(url-url,callback-self.parse) 这里的UL和前面的例子不太一样,它长了许多,所以我们先要确定页码的 分布情况,即页码的规律是怎么样的。例如,我们点击第2页,发现pge=2, 所以基本可以确认,在自动翻页时,只需要改变URL中“page=”后面的数字就
现以 JSON 格式存储的数据。 二、P瀌瀇濻瀂瀁 网络爬虫实践 样例二 这一次我们将会通过一个更加复杂但非常贴近实际的爬虫例子来进行说明。 要爬取的内容来自于 IT 桔子网站,这是一个非常流行的提供有关新公司投资融 资等最新信息的网站。我们目的就是从 URL 中爬取它的前 10 页,这个网页相对 来说比前一个笔记爬取的网页要复杂得多。我们要爬取的信息包括每一家公司的 成立时间、地点、最新融资情况。 这里的 URL 和前面的例子不太一样,它长了许多,所以我们先要确定页码的 分布情况,即页码的规律是怎么样的。例如,我们点击第 2 页,发现 瀃濴濺濸=2, 所以基本可以确认,在自动翻页时,只需要改变 URL 中“瀃濴濺濸=”后面的数字就
可以了。至此,URL确认过程就结束了。 现在,我们要去网页中提取内容。提取时,我们要排除掉许多的无关信息, 例如上面的标题以及边上的选项等都不能爬取进来,我们要爬取公司名、成立时 间、省份以及最新融资情况,最终以cSV格式保存到文件。 米Ppar#e方法会在每个regueet收到reapoase之后谓用 def parse(aelf,response): print(reaponae.body) 幸提取公司列 response.css(".list-main-icnset.company-list-ul li") ·从一开始是为了端过网页内的表格标圆栏 or9”3装oea79: 三unat1aoa0 解析公司大类 98美aat1.eret4eW 折得rp1acat,").cepiace('\n',.replace(',) date date.replace('t,).replace('\n',).replace(',) 单解析省份 province company.css('.cell.place::text").extract_first() provinceprovince.replace('\t',').replace( ).replace(,) e type,"date":date 以csv格式写入文件 self.csvWriter.writerov(item)
可以了。至此,URL 确认过程就结束了。 现在,我们要去网页中提取内容。提取时,我们要排除掉许多的无关信息, 例如上面的标题以及边上的选项等都不能爬取进来,我们要爬取公司名、成立时 间、省份以及最新融资情况,最终以 濶瀆瀉 格式保存到文件