用这个漂亮的汤Python教程来抓取网站

Beautiful Soup是一个开源Python库。它使用导航解析器来抓取XML和HTML文件的内容。您需要用于多种分析目的的数据。但是,如果您不熟悉Python和Web抓取,则值得尝试使用Python的Beautiful Soup库进行Web抓取项目。

使用Python的开源Beautiful Soup库,您可以通过抓取网页的任何部分或元素来获取数据,从而最大程度地控制流程。在本文中,我们研究了如何使用Beautiful Soup来抓取网站。

如何安装精美汤并开始使用

在继续之前,在这篇Beautiful Soup教程文章中,我们将使用Python 3和beautifulsoup的最新版本beautifulsoup4。确保创建一个Python虚拟环境,以将您的项目及其程序包与本地计算机上的程序隔离开。

首先,您必须在虚拟环境中安装Beautiful Soup库。 Beautiful Soup可作为所有操作系统的PyPi软件包提供,因此您可以通过终端使用pip install beautifulsoup4命令进行安装

但是,如果您使用的是Debian或Linux,上面的命令仍然有效,但是您可以通过运行apt-get install python3-bs4与软件包管理器一起安装它。

美丽汤不会直接抓取网址。它仅适用于现成的HTML或XML文件。这意味着您不能直接将URL传递给它。要解决该问题,您需要先使用Python的请求库获取目标网站的URL,然后再将其提供给Beautiful Soup。

要使该库可用于您的刮板,通过终端运行pip install requests命令。

要使用XML解析器库,请运行pip install lxml进行安装。

检查您希望抓取的网页

在抓取您不熟悉的任何网站之前,最佳做法是检查其元素。您可以通过将浏览器切换到开发者模式来实现。如果您使用的是Google Chrome浏览器,则使用Chrome DevTools非常容易。

但是,有必要检查网页以进一步了解其HTML标签,属性,类和ID。这样做可以揭示网页的核心元素及其内容类型。

它还可以帮助您制定最佳策略,以用于从网站获取所需的准确数据以及获取方法。

如何用精美的汤刮擦网站数据

现在您已经准备就绪,打开一个首选的代码编辑器并创建一个新的Python文件,为其指定名称。但是,如果您不熟悉通过命令行运行Python,则还可以使用基于Web的IDE,例如Jupyter Notebook

接下来,导入必要的库:

 from bs4 import BeautifulSoup
import requests

首先,让我们看看请求库如何工作:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
print(website)

当您运行上面的代码时,它将返回200状态,表明您的请求成功。否则,您将获得400状态或指示GET请求失败的其他错误状态。

请记住,始终将括号中的网站URL替换为目标URL。

获得带有get请求的网站后,将其传递给Beautiful Soup,Beautiful Soup现在可以使用其内置的XML或HTML解析器根据所选的格式将内容读取为HTML或XML文件。

看一下下面的代码片段,看看如何使用HTML解析器执行此操作:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup)

上面的代码返回网页的整个DOM及其内容。

您还可以通过使用prettify方法获得更一致的DOM版本。您可以尝试一下以查看其输出:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.prettify())

您还可以获取网页的纯内容,而无需使用.text方法加载其元素:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.text)

如何通过标记名称来擦除网页的内容

您还可以使用Beautiful Soup将内容刮到特定标签中。为此,您需要在Beautiful Soup刮板请求中包括目标标签的名称。

例如,让我们看看如何在网页的h2标签中获取内容。

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.h2)

在上面的代码段中, soup.h2返回网页的第一个h2元素,而忽略其余元素。要加载所有h2元素,可以使用find_all内置函数和Python的for循环:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups)

该代码块返回所有h2元素及其内容。但是,您可以使用.string方法获取内容而无需加载标签:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups.string)

您可以对任何HTML标记使用此方法。您需要做的就是用您喜欢的标签替换h2标签。

但是,您还可以通过将标签列表传递到find_all方法中来抓取更多标签。例如,下面的代码块将刮擦ah2title标签的内容:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
tags = soup.find_all(['a', 'h2', 'title'])
for soups in tags:
print(soups.string)

如何使用ID和类名称抓取网页

使用DevTools检查网站后,它可以让您进一步了解保存其DOM中每个元素的id和class属性。掌握了这些信息后,您可以使用此方法抓取该网页。当目标组件的内容从数据库中循环出来时,这很有用。

您可以对id和class刮板使用find方法。与返回可迭代对象的find_all方法不同, find方法在单个不可迭代的目标上工作,在这种情况下,该目标是id 。因此,您不需要对其使用for循环。

让我们看一个示例,该示例如何使用id刮取下面的页面内容:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
id = soup.find(id = 'enter the target id here')
print(id.text)

要为类名执行此操作,请将id替换为class 。但是,直接编写类会导致语法混乱,因为Python将其视为关键字。要绕过该错误,您需要在类前面编写一个下划线: class_

本质上,包含id的行变为:

 my_classes = soup.find(class_ = 'enter the target class name here')
print(my_classes.text)

但是,您也可以通过调用带有其相应ID或类的特定标签名称来抓取网页:

 data = soup.find_all('div', class_ = 'enter the target class name here')
print(data)

如何用美丽的汤制作可重复使用的刮板

您可以创建一个类,然后将所有先前的代码放到该类中的函数中,以创建可重复使用的抓取程序,以获取某些标签及其ID的内容。为此,我们可以创建一个接受五个参数的函数:一个URL,两个标记名及其对应的ID或类。

假设您想从电子商务网站上获取衬衫的价格。下面的示例刮板类提取价格和衬衫标签及其对应的ID或类,然后将其作为以“ Price”和Shirt_name作为列名的Pandas数据框返回。

如果尚未安装熊猫,请确保通过终端pip安装熊猫

 import pandas as pd
class scrapeit:
try:
def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None):
if not (website and tag1 and id1 and tag2 and id2)==None:
try:
page = requests.get(website)
soup = BeautifulSoup(page.content, 'html.parser')
infotag1 = soup.find_all(tag1, id1)
infotag2 = soup.find_all(tag2, id2)
priced = [prices.text for prices in infotag1]
shirt = [shirts.text for shirts in infotag2]
data = {
'Price':priced,
'Shirt_name':shirt}
info = pd.DataFrame(data, columns=['Price', 'Shirt_name'])
print(info)
except:
print('Not successful')
else:
print('Oops! Please enter a website, two tags and thier corresponding ids')
except:
print('Not successful!')

您刚刚制作的抓取工具可重复使用的模块,您可以将其导入另一个Python文件中并在其中使用。要从其类中调用scrape函数,请使用scrapeit.scrape('网站URL','price_tag','price_id','shirt_tag','shirt_id') 。如果您不提供URL和其他参数,则else语句提示您提供。

要在另一个Python文件中使用该scaper,可以像这样导入它:

 from scraper_module import scrapeit
scrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')

注意: scraper_module是保存scraper类的Python文件的名称。

如果您想深入了解如何最好地使用它,还可以查看Beautiful Soup文档

美丽的汤是宝贵的网页抓取工具

Beautiful Soup是一个功能强大的Python屏幕抓取工具,可让您控制抓取期间数据的处理方式。这是一个非常有价值的商业工具,因为它可以让您访问竞争对手的网络数据,例如定价,市场趋势等。

尽管我们在本文中做了标签刮板,但是您仍然可以使用此功能强大的Python库来制作更有用的刮板工具。