Python 网页抓取

什么是网页抓取?

网页抓取是一种从几个网站中提取大量数据的技术。术语**“抓取”是指从另一个来源(网页)获取信息并将其保存到本地文件中。例如:假设你正在做一个名为“手机比较网站”**的项目,你需要手机的价格、收视率和型号名称来比较不同的手机。如果你通过查看各种网站来收集这些细节,将会花费很多时间。在这种情况下,网络废弃扮演了一个重要的角色,通过编写几行代码,你可以得到想要的结果。

Web Scraping Using Python

网络抓取以非结构化格式从网站中提取数据。它有助于收集这些非结构化数据并将其转换为结构化形式。

初创公司更喜欢网络抓取,因为这是一种廉价而有效的获取大量数据的方式,而无需与数据销售公司建立任何合作关系。

网络报废合法吗?

这里就出现了抓取是否合法的问题。答案是有些网站允许合法使用。网页抓取只是一个工具,你可以用正确的方式或错误的方式使用它。

如果有人试图抓取非公开数据,网络抓取是非法的。并非所有人都能获得非公开数据;如果你试图提取这样的数据,那就违反了法律条款。

有几种工具可以从网站上抓取数据,例如:

为什么要爬虫?

Web Scraping Using Python

正如我们上面所讨论的,网络爬取被用来从网站中提取数据。但是我们应该知道如何使用原始数据。原始数据可以用于各种领域。让我们来看看网络报废的用法:

  • 动态价格监控

它被广泛用于从几个在线购物网站收集数据,比较产品价格,并做出有利可图的定价决策。使用网络爬取数据的价格监控使公司能够了解市场状况并促进动态定价。这确保了他们的公司总是高于其他公司。

  • 市场调研

爬虫完全适合市场趋势分析。它正在获得对特定市场的洞察。大型组织需要大量数据,而网络报废为数据提供了可靠和准确的保证。

  • 邮件收集

许多公司使用个人电子邮件数据进行电子邮件营销。他们可以针对特定的受众进行营销。

  • 新闻和内容监控

一个单一的新闻周期可以对你的业务产生显著的影响或真正的威胁。如果你的公司依赖于一个组织的新闻分析,它经常出现在新闻中。因此,网页抓取为监控和解析最关键的故事提供了终极解决方案。新闻文章和社交媒体平台可以直接影响股市。

  • 社交媒体报废

网络爬取在从**推特、脸书、**和 **Instagram、**等社交媒体网站上提取数据以找到热门话题方面发挥着至关重要的作用。

  • 研发

从网站上报废一般信息、统计数据、温度等大数据集,分析后用于开展调查或研发。

为什么要用 Python 进行网页爬取?

还有其他流行的编程语言,但是为什么我们选择Python 而不是其他编程语言来进行网页抓取呢?下面我们将描述 Python 的一些特性,这些特性使得 Python 成为最有用的网络废弃编程语言。

  • 动态键入

在 Python 中,我们不需要为变量定义数据类型;我们可以在任何需要的地方直接使用这个变量。它节省时间,使任务更快。Python 定义了它的类来识别变量的数据类型。

  • 庞大的图书馆收藏

Python 附带了广泛的库,如 NumPy、Matplotlib、Pandas、Scipy 等。,它为各种用途的工作提供了灵活性。它适用于几乎每个新兴领域,也适用于提取数据和进行操作的网络废弃。

  • 低代码

爬虫的目的是为了节省时间。但是如果你花更多的时间写代码呢?这就是为什么我们使用 Python,因为它可以用几行代码执行一项任务。

  • 开源社区

Python 是开源的,这意味着它对每个人都是免费的。它拥有世界上最大的社区之一,如果您在 Python 代码中遇到任何问题,都可以在这里寻求帮助。

爬虫的基础知识

网络抓取由两部分组成:网络爬虫和网络抓取器。简单地说,网络爬虫是一匹骏马,而网络搜刮器则是一辆战车。爬虫引导刮板,提取所需的数据。让我们来了解一下网络搜索的这两个组成部分:

  • 爬虫

Web Scraping Using Python网络爬虫一般称为**“蜘蛛。”**它是一种人工智能技术,通过给定的链接浏览互联网来索引和搜索内容。它搜索程序员询问的相关信息。

  • 刮刀

Web Scraping Using Python网页抓取器是一种专用工具,旨在快速有效地从多个网站中提取数据。根据项目的不同,网页剪贴机在设计和复杂性上差别很大。

网络爬虫是如何工作的?

以下是执行爬虫的步骤。让我们了解一下网页抓取的工作原理。

第一步:找到想要刮的 URL

首先,你应该根据你的项目了解数据的需求。网页或网站包含大量信息。这就是为什么只废弃相关信息。简单地说,开发人员应该熟悉数据需求。

步骤 2:检查页面

数据以原始 HTML 格式提取,必须仔细解析,减少原始数据的噪音。在某些情况下,数据可以像姓名和地址一样简单,也可以像高维天气和股市数据一样复杂。

第三步:写代码

编写代码来提取信息,提供相关信息,并运行代码。

第 4 步:将数据存入文件

将该信息以所需的 csv、 xmlJSON 文件格式存储。

网页抓取入门

Python 有大量的库,也为网络废弃提供了一个非常有用的库。让我们了解 Python 所需的库。

用于刮网的库

  • Selenium- Selenium 是一个开源的自动化测试库。它用于检查浏览器活动。要安装此库,请在终端中键入以下命令。


pip install selenium

注意——使用 PyCharm IDE 很好。

Web Scraping Using Python

  • Pandas

Pandas 库用于数据操作和分析。它用于提取数据并以所需的格式存储。

  • BeautifulSoup

BeautifulSoup is a Python library that is used to pull data of HTML and XML files. It is mainly designed for web scrapping. It works with the parser to provide a natural way of navigating, searching, and modifying the parse tree. The latest version of BeautifulSoup is 4.8.1.

让我们详细了解一下BeautifulSoup库。

安装BeautifulSoup

您可以通过键入以下命令来安装美观的套件:


pip install bs4

安装解析器

BeautifulSoup 支持 HTML 解析器和几个第三方 Python 解析器。您可以根据您的依赖关系安装其中的任何一个。以下是美观组的解析器列表:

句法分析程序典型用法
Python 的 html.parserBeautifulSoup(markup,“html.parser”)
lxml 的 HTML 解析器BeautifulSoup(markup,“lxml”)
lxml 的 xml 解析器BeautifulSoup(markup,“lxml-xml”)
Html5libBeautifulSoup(markup,“html5lib”)

我们建议您安装 html5lib 解析器,因为它非常适合较新版本的 Python,或者您可以安装 lxml 解析器。

在您的终端中键入以下命令:


pip install html5lib

Web Scraping Using Python

BeautifulSoup用于将复杂的 HTML 文档转换成 Python 对象的复杂树。但是有几个主要使用的对象类型:

  • 标签

一个标签对象对应一个 XML 或者 HTML 原始文档。


soup = bs4.BeautifulSoup("<b class = "boldest">Extremely bold</b>)
tag = soup.b
type(tag)

输出:

<class "bs4.element.Tag">

标签包含许多属性和方法,但是标签最重要的特征是名称和属性。

  • 名称

每个标签都有一个名称,可以通过访问。名称:


tag.name

  • 属性

标签可以有任意数量的属性。标签有一个属性“id”,其值为“最粗”。我们可以通过将标签视为字典来访问标签的属性。


tag[id]

我们可以添加、移除和修改标签的属性。这可以通过使用标签作为字典来完成。


# add the element
tag['id'] = 'verybold'
tag['another-attribute'] = 1
tag
# delete the tag
del tag['id']

  • 多值属性

在 HTML5 中,有些属性可以有多个值。类(由多个 css 组成)是最常见的多值属性。其他属性有 **rel、rev、accept-charset、headers、**和 accesskey


class_is_multi= { '*' : 'class'}
xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml', multi_valued_attributes=class_is_multi)
xml_soup.p['class']
# [u'body', u'strikeout']

  • 可导航字符串

BeautifulSoup中的字符串引用标签中的文本。美化组使用导航字符串类来包含这些文本。


tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'>

字符串是不可变的,这意味着它不能被编辑。但是可以使用 replace_with() 替换为另一个字符串。


tag.string.replace_with("No longer bold")
tag

在某些情况下,如果您想在BeautifulSoup外使用导航字符串,则 unicode() 有助于将其转换为正常的 Python Unicode 字符串。

  • BeautifulSoup object

BeautifulSoup输出对象将完整的解析文档作为一个整体来表示。在许多情况下,我们可以将其用作标记对象。这意味着它支持导航树和搜索树中描述的大多数方法。


doc=BeautifulSoup("<document><content/>INSERT FOOTER HERE</document","xml")
footer=BeautifulSoup("<footer>Here's the footer</footer>","xml")
doc.find(text="INSERT FOOTER HERE").replace_with(footer)
print(doc)

输出:

?xml version="1.0" encoding="utf-8"?>
# <document><content/><footer>Here's the footer</footer></document>

网络抓取示例:

让我们举个例子,通过从网页中提取数据并检查整个页面来实际理解报废。

首先,在维基百科上打开你喜欢的页面,检查整个页面,在从网页中提取数据之前,你应该确保你的要求。考虑以下代码:


#importing the BeautifulSoup Library

importbs4
import requests

#Creating the requests

res = requests.get("https://en.wikipedia.org/wiki/Machine_learning")
print("The object type:",type(res))

# Convert the request object to the Beautiful Soup Object
soup = bs4.BeautifulSoup(res.text,'html5lib')
print("The object type:",type(soup)

输出:

The object type <class 'requests.models.Response'>
Convert the object into: <class 'bs4.BeautifulSoup'>

在下面几行代码中,我们按照类名提取网页的所有标题。在这里,前端知识在检查网页时起着至关重要的作用。


soup.select('.mw-headline')
for i in soup.select('.mw-headline'):
print(i.text,end = ',')

输出:

Overview,Machine learning tasks,History and relationships to other fields,Relation to data mining,Relation to optimization,Relation to statistics, Theory,Approaches,Types of learning algorithms,Supervised learning,Unsupervised learning,Reinforcement learning,Self-learning,Feature learning,Sparse dictionary learning,Anomaly detection,Association rules,Models,Artificial neural networks,Decision trees,Support vector machines,Regression analysis,Bayesian networks,Genetic algorithms,Training models,Federated learning,Applications,Limitations,Bias,Model assessments,Ethics,Software,Free and open-source software,Proprietary software with free and open-source editions,Proprietary software,Journals,Conferences,See also,References,Further reading,External links,

在上面的代码中,我们导入了 bs4请求库。在第三行中,我们创建了一个 res 对象,向网页发送请求。正如你所看到的,我们已经从网页上提取了所有的标题。

Web Scraping Using Python

维基百科学习的网页

让我们理解另一个例子;我们将对 URL 发出 GET 请求,并使用 BeautifulSoup 和 Python 内置的**“html 5lib”**解析器创建一个解析树对象(soup)。

这里我们将废弃给定链接的网页(https://www.javatpoint.com/)。考虑以下代码:


following code:
# importing the libraries
from bs4 import BeautifulSoup
import requests

url="https://www.javatpoint.com/"

# Make a GET request to fetch the raw HTML content
html_content = requests.get(url).text

# Parse the html content
soup = BeautifulSoup(html_content, "html5lib")
print(soup.prettify()) # print the parsed data of html

上面的代码将显示 javatpoint 主页的所有 html 代码。

使用BeautifulSoup对象,即soup,我们可以收集所需的数据表。让我们使用soup对象打印一些有趣的信息:

  • 让我们打印网页的标题。


print(soup.title)

**输出:**它将给出如下输出:

<title>Tutorials List - Javatpoint</title>

  • 在上面的输出中,标题中包含了 HTML 标记。如果需要不带标签的文本,可以使用以下代码:


print(soup.title.text)

**输出:**它将给出如下输出:

Tutorials List - Javatpoint

  • 我们可以获得页面上的整个链接及其属性,如 href、标题和内部文本。考虑以下代码:


for link in soup.find_all("a"):
print("Inner Text is: {}".format(link.text))
print("Title is: {}".format(link.get("title")))
print("href is: {}".format(link.get("href")))

**输出:**将打印所有链接及其属性。这里我们展示了其中的一些:

href is: https://www.facebook.com/javatpoint
Inner Text is:
The title is: None
href is: https://twitter.com/pagejavatpoint
Inner Text is:
The title is: None
href is: https://www.youtube.com/channel/UCUnYvQVCrJoFWZhKK3O2xLg
Inner Text is:
The title is: None
href is: https://javatpoint.blogspot.com
Inner Text is: Learn Java
Title is: None
href is: https://www.javatpoint.com/java-tutorial
Inner Text is: Learn Data Structures
Title is: None
href is: https://www.javatpoint.com/data-structure-tutorial
Inner Text is: Learn C Programming
Title is: None
href is: https://www.javatpoint.com/c-programming-language-tutorial
Inner Text is: Learn C++ Tutorial

演示:从 Flipkart 网站抓取数据

在这个例子中,我们将从流行的电子商务网站之一 Flipkart 中删除手机价格、收视率和型号名称。以下是完成此任务的先决条件:

先决条件:

  • Python 2.x 或 Python 3.x,安装了 Selenium、BeautifulSoup、Pandas 库。

  • 谷歌浏览器

  • 废弃解析器,如 html.parser、xlml 等。

第一步:找到想要抓取的网址

第一步是找到你想抓取的网址。这里我们从动画中提取手机细节。这个页面的网址是 https://www.flipkart.com/search?q = iphones & otracker = search & otracker 1 = search & market place = FLIPKART & as-show = on & as = off。

第 2 步:检查页面

有必要仔细检查页面,因为数据通常包含在标签中。所以我们需要检查选择想要的标签。要检查页面,右键单击元素,然后单击**“检查”**。

第三步:找到要提取的数据

提取价格、名称和评级,它们分别包含在“div”标签中。

第四步:写代码


from bs4 import BeautifulSoupas soup
from urllib.request import urlopen as uReq

# Request from the webpage
myurl = "https://www.flipkart.com/search?q=iphones&otracker=search&otracker1=search&marketplace=FLIPKART&as-show=on&as=off"

uClient = uReq(myurl)
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, features="html.parser")

# print(soup.prettify(containers[0]))

# This variable held all html of webpage
containers = page_soup.find_all("div",{"class": "_3O0U0u"})
# container = containers[0]
# # print(soup.prettify(container))
#
# price = container.find_all("div",{"class": "col col-5-12 _2o7WAb"})
# print(price[0].text)
#
# ratings = container.find_all("div",{"class": "niH0FQ"})
# print(ratings[0].text)
#
# #
# # print(len(containers))
# print(container.div.img["alt"])

# Creating CSV File that will store all data
filename = "product1.csv"
f = open(filename,"w")

headers = "Product_Name,Pricing,Ratings\n"
f.write(headers)

for container in containers:
product_name = container.div.img["alt"]

price_container = container.find_all("div", {"class": "col col-5-12 _2o7WAb"})
price = price_container[0].text.strip()

rating_container = container.find_all("div",{"class":"niH0FQ"})
ratings = rating_container[0].text

# print("product_name:"+product_name)
# print("price:"+price)
# print("ratings:"+ str(ratings))

edit_price = ''.join(price.split(','))
sym_rupee = edit_price.split("?")
add_rs_price = "Rs"+sym_rupee[1]
split_price = add_rs_price.split("E")
final_price = split_price[0]

split_rating = str(ratings).split(" ")
final_rating = split_rating[0]

print(product_name.replace(",", "|")+","+final_price+","+final_rating+"\n")
f.write(product_name.replace(",", "|")+","+final_price+","+final_rating+"\n")

f.close()

输出:

Web Scraping Using Python

我们取消了 iPhone 的细节,并将这些细节保存在 CSV 文件中,如您在输出中所见。在上面的代码中,出于测试目的,我们对几行代码进行了注释。您可以删除这些注释并观察输出。

在本教程中,我们讨论了网络爬取的所有基本概念,并描述了领先的在线电子商务网站 flipkart 的爬取示例。

原文:https://www.javatpoint.com/web-scraping-using-python