点击关注我哦
一篇文章带你了解Python爬虫
数据科学只有通过数据才能实现,而在现实世界中,数据通常不会有现成的.csv文件等你使用。你必须去自己寻找。这就是为什么爬虫对数据科学非常重要的原因。
但是如果你是一个初学者的话,抓取信息本身看起来就有点复杂了。如果你想要开始抓取信息,想要知道如何用一种简单、快速的方式写出你的第一个爬虫,这篇文章就是为你准备的。
在本文中,我们将使用 quotes.toscrape.com 网站作为一个例子。这个网站包含了数百条名言,它们的作者,以及描述每一句名言的标签。这是我们要收集的信息。此外,您可以从网站名称推断,它是用于爬虫的。但并不是每个网页都是这样的,所以在开始之前确保你正在搜集的网站允许你这样做。
具体实现
对于我们将在本文中编写的爬虫,我们需要下面三个库:
· Pandas,用于数据处理,如果你对使用python的数据分析有一定了解,那么你可能已经熟悉它了;
· Urllib,打开并读取网页信息
· BeautifulSoup,解析 HTML,使得提取数据更加容易。
BeautifulSoup 是唯一需要手动安装的库。只需要使用运行以下命令通过pip进行安装:
pip install beautifulsoup4
安装了所有的库之后,我们就可以导入了。用urllib获取URL,然后用 BeautifulSoup 解析网页源代码。
import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = 'https://quotes.toscrape.com'
page = urlopen(url)
soup = BeautifulSoup(page, 'html.parser')
Going After the Data
如果你在网站上按下键盘上的 F12键,你就会看到它的源代码。在这里小编希望大家能够仔细的研究下,这对爬虫是很有帮助的。当然也可以通过 组合键Ctrl + shift + c 来审查页面上的每个元素。
在此过程中,我们注意到所有的名言都存储在 div标签下,名为“ quote”的类中 ,如下代码所示。我们需要做的就是抓住这些元素。
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
<div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
...</div>
选择元素一点都不难是,soup几乎包含了我们要用的任何功能。例如,如果这里的目标是获取页面的标题,那么只需要简单的一行代码:
print(soup.title)
它的输出结果就是:
<title>Quotes to Scrape</title>
如果只想得到标题中的文本,那么只需要对代码做一些小小的改动:
print(soup.title.text)
然而,由于源代码中有许多 div 标签,我们不能直接使用这种方法。但是我们可以使用 find _ all 方法。该方法能够检索页面上符合我们要求的所有元素。这里我们使用标签名和类名来检索:
quotes = soup.find_all('div', class_='quote')
上面的代码也可以改成如下所示:
quotes = soup.find_all('div', {'class': 'quote'})
使用这种语法,我们甚至可以指定更多的类进行筛选:
quotes = soup.find_all('div', {'class': {'quote', 'tags'}})
我们还可以使用 limit 参数来限制要检索的元素的数量。
现在我们已经获得了所有的quotes元素,在网页源码中打开其中一个元素,我们会看到:
<span class="text" itemprop="text">“The text is here.”</span>
<span>by <small class="author" itemprop="author">Albert Einstein</small>
<a href="/author/Albert-Einstein">(about)</a>
</span>
<div class="tags">
Tags:
<meta class="keywords" itemprop="keywords" content="change,deep-thoughts,thinking,world">
<a class="tag" href="/tag/change/page/1/">change</a>
<a class="tag" href="/tag/deep-thoughts/page/1/">deep-thoughts</a>
<a class="tag" href="/tag/thinking/page/1/">thinking</a>
<a class="tag" href="/tag/world/page/1/">world</a>
</div>
我们需要爬取的所有信息都在这里了,我们要做的是准确的找到它。我们要爬取的名言就在类名为“text”的span标签中。在small的标签中有一个“author”类,它存储着作者的名字信息。
然后我们循环解析每一个元素,就可以获取到所有的名言和它的作者。
for quote in quotes:
text = quote.find('span', class_='text').text
author = quote.find('small', class_='author').text
下面我们在循环中继续使用find_all方法爬取a标签中所有类名为“tag”的文本信息。
然后将每个标签的文本存储在列表中:
tags = quote.find('div', class_='tags').find_all('a')
tags_list = []
for tag in tags:
tags_list.append(tag.text)
存储数据
现在我们已经成功的爬到了想要的数据,但是我想你对只能在控制台中通过打印显示的数据并不感兴趣,下面我们将把数据存储在一个文件中,以便以后使用。
有几种方法可以做到这一点。最简单的方法是将列表中的每个引用的数据附加到另一个列表中。然后,我们可以轻松地将列表转换为一个DataFrame,并将其导出为.csv文件。
single_quote = [text, author, tags_list]
all_quotes.append(single_quote)
# Outside the loop
df = pd.DataFrame(all_quotes, columns=['quote', 'author', 'tags'])
df.to_csv('quotes.csv', index=False)
抓取更多数据
尽管每一页只有十个名言,但我们想爬取到更多的。要获得更多名言,我们需要跳转到下一页。同样,有不止一种方法可以做到这一点。
在本文爬取的网站上,我们可以将URL设置为
“https://quotes.toscrape.com/page/1/”而不是
“ https://quotes.toscrape.com”,这样我们就可以通过for循环更改网址的页码来循环爬取。
下面就是我们爬取到的前100个名言!
更多的挑战!更多的工具!
然而,并不是所有的网站都如同quotes.toscrape.com一样方便大家爬取。
当你开始爬取其他复杂网站的时候,将会遇到其他的挑战。你必须防止你的代码出错,这样它就不会在爬取成百上千网页时崩溃。你将不得不处理由 JavaScript 渲染的页面,这些页面 BeautifulSoup 无法解析,甚至还要处理交互式内容,这些内容会根据用户的操作改变页面。
幸运的是,您还将遇到新的工具来应对这些挑战。熟悉 request 库很重要,因为它比 urllib 更强大; Selenium 是 在遇到JavaScript 渲染页面时的一个更好的选择,因为它实际上可以打开并自动化浏览器来获取所有内容并与页面交互; 你也可以使用代理,比如 Infatica,来避免你的 IP 被加入黑名单。
随着目标的发展,希望你的工具也在发展。
· END ·
HAPPY LIFE