使用Python进行网络抓取

使用Python进行网络抓取

什么是网络抓取

网络抓取是一种从多个网站提取大量数据的技术。术语 “抓取” 是指从另一个来源(网页)获取信息并将其保存到本地文件中。例如:假设您正在开发一个名为 “手机对比网站” 的项目,您需要手机价格、评级和型号名称来进行不同手机之间的比较。如果您通过访问各个网站收集这些详细信息,将会花费很多时间。在这种情况下,网络抓取发挥了重要作用,通过编写几行代码,您可以获得所需的结果。

使用Python进行网络抓取

Web Scrapping将数据从网站中提取出来,以非结构化格式呈现。它有助于收集这些非结构化数据,并将其转换为结构化形式。

初创公司偏好Web Scrapping,因为它是一种廉价且有效的方式,可以获取大量数据,而无需与数据销售公司合作。

Web Scrapping是否合法

这里的问题是 Web Scrapping是否合法 。答案是,一些网站在合法使用时允许使用它。Web Scrapping只是一种工具,您可以正确或错误地使用它。

如果有人试图获取非公开数据,那么Web Scrapping是非法的。非公开数据无法被所有人访问;如果您尝试提取此类数据,则违反了法律条款。

有几种工具可用于从网站中提取数据,例如:

  • Scrapping-bot
  • Scrapper API
  • Octoparse
  • Import.io
  • Webhose.io
  • Dexi.io
  • Outwit
  • Diffbot
  • Content Grabber
  • Mozenda
  • Web Scrapper Chrome扩展程序

为什么要进行Web Scrapping

使用Python进行网络抓取

正如我们之前讨论的那样,网络抓取用于从网站中提取数据。但我们应该知道如何利用这些原始数据。这些原始数据可以在各个领域中使用。让我们来看看网络抓取的用途:

  • 动态价格监控

广泛用于从几个在线购物网站收集数据,比较产品价格并制定盈利性定价决策。使用网络抓取的价格监测可以让公司了解市场情况,并促进动态定价。这确保公司始终超越其他竞争对手。

  • 市场研究

网络抓取非常适合市场趋势分析。它可以深入了解特定市场。大型组织需要大量数据,而网络抓取可以以可靠性和准确性的保证提供数据。

  • 邮件收集

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

  • 新闻和内容监控

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

  • 社交媒体抓取

网络抓取在从社交媒体网站(如Twitter、Facebook和Instagram)中提取数据方面发挥着重要作用,以找到热门话题。

  • 研究和开发

大量数据(如常规信息、统计数据和温度)从网站上抓取,然后进行分析和用于开展调查或研究与开发。

为什么选择Python进行网络抓取

还有其他流行的编程语言,但为什么我们选择Python而不是其他编程语言进行网络抓取?下面我们描述了Python的一些特点,使其成为网络抓取最有用的编程语言。

  • 动态类型

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

  • 丰富的库集合

Python提供了一系列广泛的库,如NumPy、Matplotlib、Pandas、Scipy等,这些库提供了与各种目的的灵活性。它几乎适用于每个新兴领域,也可用于从网站上提取数据进行处理的网络抓取。

  • 代码量少

网络抓取的目的是节省时间。但如果编写代码花费了更多时间呢?这就是为什么我们使用Python的原因,因为它可以用几行代码执行任务。

  • 开源社区

Python是开源的,这意味着它对每个人都是免费的。它拥有全球最大的社区之一,在Python代码中遇到任何困难时都可以寻求帮助。

网络爬虫的基础知识

网络爬虫由两个部分组成: 网络爬虫和网络抓取器 。简单来说,网络爬虫是马,抓取器是战车。爬虫引导抓取器并提取所需的数据。让我们了解一下网络爬虫的这两个组成部分:

  • 爬虫

使用Python进行网络抓取

  • 抓取器

使用Python进行网络抓取

网络爬虫的工作原理

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

步骤-1:找到要爬取的URL

首先,您应该根据您的项目了解数据的需求。一个网页或网站包含大量信息。因此只爬取相关信息。简单来说,开发人员应熟悉数据需求。

步骤-2:检查页面

数据以原始的HTML格式提取出来,必须仔细解析并从原始数据中减少噪声。在某些情况下,数据可能只是姓名和地址,也可能是高维天气和股票市场数据。

步骤-3:编写代码

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

步骤-4:将数据存储在文件中

将信息存储在所需的csv、xml、JSON文件格式中。

开始进行网络爬虫

Python拥有丰富的库集合,并为网络爬虫提供了非常有用的库。让我们了解Python所需的库。

用于网络爬虫的库

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

注意 – 最好使用PyCharm集成开发环境。

使用Python进行网络抓取

  • Pandas

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

  • BeautifulSoup

让我们详细了解 BeautifulSoup 库。

BeautifulSoup的安装

您可以通过输入以下命令来安装BeautifulSoup:

pip install bs4

安装解析器

BeautifulSoup支持HTML解析器和几个第三方的Python解析器。您可以根据您的依赖安装其中任何一个。BeautifulSoup支持的解析器如下:

解析器 典型用法
Python 的 html.parser BeautifulSoup(markup,”html.parser”)
lxml 的 HTML 解析器 BeautifulSoup(markup,”lxml”)
lxml 的 XML 解析器 BeautifulSoup(markup,”lxml-xml”)
Html5lib BeautifulSoup(markup,”html5lib”)

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

在终端中键入以下命令:

pip install html5lib

使用Python进行网络抓取

BeautifulSoup 用于将复杂的 HTML 文档转换为复杂的 Python 对象树。但是有几种主要的对象类型经常被使用:

  • Tag

    Tag 对象对应于一个 XML 或 HTML 原始文档。

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

输出:

<class "bs4.element.Tag">

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

  • name

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

tag.name
  • 属性

一个标签可以拥有任意数量的属性。标签 <b id = "boldest">拥有一个名为 “id” 的属性,其值为 “boldest”。我们可以通过将标签视为字典来访问标签的属性。

tag[id]

我们可以添加、删除和修改标签的属性。可以通过将标签视为字典来实现。

# add the element
tag['id'] = 'verybold'
tag['another-attribute'] = 1
tag
# delete the tag
del tag['id']   
  • 多值属性

在HTML5中,有一些属性可以具有多个值。class(由多个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']
  • NavigableString

BeautifulSoup中的字符串指的是标签中的文本。BeautifulSoup使用 NavigableString 类来容纳这些文本片段。

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

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

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

在某些情况下,如果你想在BeautifulSoup之外使用一个NavigableString, unicode() 方法可以将它转换成普通的Python Unicode字符串。

  • BeautifulSoup对象

BeautifulSoup对象代表整个解析的文档。在许多情况下,我们可以将其视为一个Tag对象。这意味着它支持大多数在导航树和搜索树时描述的方法。

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,

在上面的代码中,我们导入了 bs4requests 库。在第三行,我们创建了一个 res 对象来向网页发送请求。你可以观察到我们从网页中提取了所有的标题。

使用Python进行网络抓取

维基百科学习网页

让我们来了解另一个示例;我们将发送一个GET请求到URL,并使用BeautifulSoup和Python内置 “html5lib” 解析器创建一个解析树对象(soup)。

在这里,我们将爬取给定链接的网页 (https://www.deepinout.com/)。 考虑以下代码:

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

url="https://www.deepinout.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

以上代码将显示deepinout主页的所有HTML代码。

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

  • 打印网页的标题。
print(soup.title)

输出: 它将会给出以下输出:

<title>Tutorials List - deepinout</title>
  • 在上面的输出中,标题中包含了HTML标签。如果你想要没有标签的文本,可以使用以下代码:
print(soup.title.text)

输出: 它将给出以下输出:

Tutorials List - deepinout
  • 我们可以获取页面上的整个链接以及它的属性,例如href、title和内部文本。考虑以下代码:
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/deepinout
Inner Text is: 
The title is: None
href is: https://twitter.com/pagedeepinout
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://deepinout.blogspot.com
Inner Text is: Learn Java
Title is: None
href is: https://www.deepinout.com/java-tutorial
Inner Text is: Learn Data Structures
Title is: None
href is: https://www.deepinout.com/data-structure-tutorial
Inner Text is: Learn C Programming
Title is: None
href is: https://www.deepinout.com/c-programming-language-tutorial
Inner Text is: Learn C++ Tutorial

示例:从Flipkart网站抓取数据

在这个示例中,我们将从Flipkart上抓取手机价格、评级和型号名称,这是一个受欢迎的电子商务网站之一。以下是完成这个任务的先决条件:

先决条件:

  • 安装了 Selenium,BeautifulSoup,Pandas 库的Python 2.x或Python 3.x。
  • Google Chrome 浏览器
  • 解析器,如html.parser、xlml等。

步骤1:找到要抓取的URL

初始步骤是找到要抓取的URL。在这里,我们从flipkart提取手机详细信息。此页面的URL是https://www.flipkart.com/search?q=iphones&otracker=search&otracker1=search&marketplace=FLIPKART&as-show=on&as=off。

步骤2:检查页面

需要仔细检查页面,因为数据通常包含在标签内。因此,我们需要进行检查以选取所需的标签。要检查页面,请右键点击元素,然后点击 “检查”

步骤3:查找要提取的数据

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

步骤4:编写代码

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()

输出:

使用Python进行网络抓取

我们抓取了iPhone的详情,并将这些详情保存在CSV文件中,如您在输出中所见。在上面的代码中,我们在少数几行代码上放了一个注释,用于测试目的。您可以删除这些注释并观察输出。

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程