作为一种面向对象的语言,Python是最简单的学习方式之一。Python的类和对象远比其他计算机语言更容易使用。此外,存在几个库,使在Python中创建一个网络刮削工具变得轻而易举。因此, 用Python步骤进行网络刮削 很可能是直接的。我打赌你的下一个问题是,什么是网络刮削? 跟着我吧!
在这篇文章中,我们将介绍:
1.什么是Web Scraping?
网络刮削被定义为从互联网上自动提取特定的数据。它有许多应用,例如为机器学习项目收集数据,开发价格比较工具,或其他需要大量数据的新想法。
虽然理论上可以手动提取数据,但互联网的浩瀚性使得这种方法在许多情况下不切实际。了解如何创建一个网络搜刮器会有帮助。
2.解决网络刮削的合法性问题
虽然搜刮是合法的,但你提取的数据可能不合法。请确保你没有干扰到以下任何一项。
2.1 有版权的内容
这种内容类型是某人的知识产权,它受法律保护,不能被简单地重复使用。
2.2 个人数据
如果你收集的信息可以用来识别一个人,它就被视为个人数据,并且很可能受到该地区的法律保护。除非你有充分的法律理由,否则最好避免存储这些数据。

一般来说,你应该在搜刮前始终阅读每个网站的条款和条件,以确保你没有违反他们的政策。如果你不确定如何继续,请联系网站的所有者并请求许可。
这篇Python网络抓取文章将介绍所有你需要知道的,以开始一个简单的应用。你将学习如何在搜刮前评估一个网站,用BeautifulSoup提取精确的数据,以及在用Selenium进行Java渲染后,将所有东西保存在一个新的CSV或JSON文件中。你将能够迅速掌握如何通过遵循下面提供的方法完成网络刮削工作。
3.用Python进行网络刮削的步骤
本文在Beautiful Soup(一个Python网络刮削库)的帮助下,讲述了网络刮削的步骤。
网络抓取包括以下步骤:
- 使用HTTP向目标URL的网页发出请求。服务器通过发回网页的HTML内容来回答。
- 检索到HTML文本后,我们必须对数据进行解析。因为大多数HTML数据是分层的,我们不能简单地通过字符串处理来提取数据。需要一个能够构建HTML数据的嵌套/树状结构的解析器。其他的HTML解析器库也可以使用,但html5lib是最先进的。
- 剩下的就是对我们生成的解析树进行导航和搜索,也就是树形遍历。将使用Beautiful Soup,一个第三方的Python包。它是一个Python库,可以从HTML和XML文件中提取数据。

3.1 安装适当的第三方库
Pip是在Python中安装外部库的最简单方法。用下面的步骤进行安装。
pip install requests
pip install html5lib
pip install bs4
3.2 从网页中提取HTML内容/文本
首先,导入request库。之后,输入你想搜刮的网页URL。向提供的URL发送请求(HTTP),并将服务器的响应保存在一个叫做r的响应对象中。使用print r.content来获取网页的HTML内容(原始的)"字符串 "类型。
import requests
URL = "https://www.skillproperty.org/what-to-do-before-selling-your-home/"
r = requests.get(URL)
print(r.content)

3.3 解析HTML内容
以此为例。
soup = BeautifulSoup(r.content, 'html5lib')
我们通过提供两个参数来制作一个BeautifulSoup对象:
- r.content。这是未经处理的HTML内容。
- html5lib。指定要使用的HTML解析器。
soup.prettify() 现在被打印出来了,它给你一个从原始HTML内容生成的解析树的视觉图片。
#This will not run on online IDE
import requests
from bs4 import BeautifulSoup
URL = "http://www.skillproperty.com/blog"
r = requests.get(URL)
soup = BeautifulSoup(r.content, 'html5lib')
# should this return any error, install html5lib or 'pip install html5lib'
print(soup.prettify())
3.4 在解析树中搜索和导航
现在我们想从HTML内容中提取一些有价值的数据。汤对象包括分层结构中的所有数据,可以通过编程方式检索。在这个例子中,我们正在处理一个充满报价的网页。因此,我们想开发一个程序来保存这些报价。
#program to scrap website and save quotes
import requests
from bs4 import BeautifulSoup
import csv
URL = "http://www.messagestogirl.com/romantic-quotes"
r = requests.get(URL)
soup = BeautifulSoup(r.content, 'html5lib')
quotes=[] # a list to store quotes
table = soup.find('div', attrs = {'id':'all_quotes'})
for row in table.findAll('div',
attrs = {'class':'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}):
quote = {}
quote['theme'] = row.h5.text
quote['url'] = row.a['href']
quote['img'] = row.img['src']
quote['lines'] = row.img['alt'].split(" #")[0]
quote['author'] = row.img['alt'].split(" #")[1]
quotes.append(quote)
filename = 'motivational_quotes.csv'
with open(filename, 'w', newline='') as f:
w = csv.DictWriter(f,['theme','url','img','lines','author'])
w.writeheader()
for quote in quotes:
w.writerow(quote)

在继续之前,建议你检查一下我们用soup.prettify()制作的网页的HTML文本,并寻找一种可以导航到引言的方法。
- 我们发现,所有的引语都包含在一个id为 "所有引语 "的div容器中。因此,我们使用find()方法来定位那个div元素(在前面的代码中被称为table)。
table = soup.find('div', attrs = {'id':'all_quotes'})
第一个参数是要搜索的HTML标签,第二个参数是一个字典型元素,用来描述与该标签相关的附加属性。find()方法返回第一个匹配的元素。你可以试着打印table.prettify()来了解这段代码的作用。
- 在表格元素中,每个报价都包含在一个具有报价类的div容器中。因此,我们要循环浏览每个带有quotation类的div容器。
在这种情况下,我们使用findAll()函数,就参数而言,它与find方法相当,但返回一个所有匹配组件的列表。现在,一个名为row的变量被用来遍历每个引号。

现在考虑这段代码。
for row in table.find_all_next('div', attrs =
{'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}):
quote = {}
quote['theme'] = row.h5.text
quote['url'] = row.a['href']
quote['img'] = row.img['src']
quote['lines'] = row.img['alt'].split(" #")[0]
quote['author'] = row.img['alt'].split(" #")[1]
quotes.append(quote)
为了保存关于一个报价的所有信息,我们开发了一个字典。点符号可以用来访问分层结构。然后,我们使用.text来获取一个HTML元素内的文本。
quote['theme'] = row.h5.text
把标签当作一个字典,使我们有能力添加、修改和删除该标签的属性。
quote['url'] = row.a['href']
最后,所有的引号都被追加到名为quotes的列表中。
所以,这是一个关于如何在Python中制作一个网络刮刀的基本例子。从这里开始,你可以尝试搜刮你想要的任何其他网站你可以花时间 学习Python ,因为这是一个很好的技能。
结论
从这里开始,你就可以靠自己了。用Python构建网络刮削器,获取数据,并从大量的信息中得出结论,这本身就是一个迷人而富有挑战性的过程。
谢谢您的阅读!