用Python进行网络刮削--学习基础知识

614 阅读6分钟

作为一种面向对象的语言,Python是最简单的学习方式之一。Python的类和对象远比其他计算机语言更容易使用。此外,存在几个库,使在Python中创建一个网络刮削工具变得轻而易举。因此, 用Python步骤进行网络刮削 很可能是直接的。我打赌你的下一个问题是,什么是网络刮削? 跟着我吧!

在这篇文章中,我们将介绍:

  1. 什么是Web Scraping?
  2. 解决网络抓取的合法性问题
  3. 用Python进行网络抓取的步骤

1.什么是Web Scraping?

网络刮削被定义为从互联网上自动提取特定的数据。它有许多应用,例如为机器学习项目收集数据,开发价格比较工具,或其他需要大量数据的新想法。

虽然理论上可以手动提取数据,但互联网的浩瀚性使得这种方法在许多情况下不切实际。了解如何创建一个网络搜刮器会有帮助。

2.解决网络刮削的合法性问题

虽然搜刮是合法的,但你提取的数据可能不合法。请确保你没有干扰到以下任何一项。

2.1 有版权的内容

这种内容类型是某人的知识产权,它受法律保护,不能被简单地重复使用。

2.2 个人数据

如果你收集的信息可以用来识别一个人,它就被视为个人数据,并且很可能受到该地区的法律保护。除非你有充分的法律理由,否则最好避免存储这些数据。

Sentiment Analysis Visual

一般来说,你应该在搜刮前始终阅读每个网站的条款和条件,以确保你没有违反他们的政策。如果你不确定如何继续,请联系网站的所有者并请求许可。

这篇Python网络抓取文章将介绍所有你需要知道的,以开始一个简单的应用。你将学习如何在搜刮前评估一个网站,用BeautifulSoup提取精确的数据,以及在用Selenium进行Java渲染后,将所有东西保存在一个新的CSV或JSON文件中。你将能够迅速掌握如何通过遵循下面提供的方法完成网络刮削工作。

3.用Python进行网络刮削的步骤

本文在Beautiful Soup(一个Python网络刮削库)的帮助下,讲述了网络刮削的步骤。

网络抓取包括以下步骤:

  1. 使用HTTP向目标URL的网页发出请求。服务器通过发回网页的HTML内容来回答。
  2. 检索到HTML文本后,我们必须数据进行解析。因为大多数HTML数据是分层的,我们不能简单地通过字符串处理来提取数据。需要一个能够构建HTML数据的嵌套/树状结构的解析器。其他的HTML解析器库也可以使用,但html5lib是最先进的。
  3. 剩下的就是对我们生成的解析树进行导航和搜索,也就是树形遍历。将使用Beautiful Soup,一个第三方的Python包。它是一个Python库,可以从HTML和XML文件中提取数据。

Programming Visual

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)

Data Visual

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)

Coding Visual

在继续之前,建议你检查一下我们用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的变量被用来遍历每个引号。

Artificial Intelligence Visual

现在考虑这段代码。

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构建网络刮削器,获取数据,并从大量的信息中得出结论,这本身就是一个迷人而富有挑战性的过程。

谢谢您的阅读!