使用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
正如我们之前讨论的那样,网络抓取用于从网站中提取数据。但我们应该知道如何利用这些原始数据。这些原始数据可以在各个领域中使用。让我们来看看网络抓取的用途:
- 动态价格监控
广泛用于从几个在线购物网站收集数据,比较产品价格并制定盈利性定价决策。使用网络抓取的价格监测可以让公司了解市场情况,并促进动态定价。这确保公司始终超越其他竞争对手。
- 市场研究
网络抓取非常适合市场趋势分析。它可以深入了解特定市场。大型组织需要大量数据,而网络抓取可以以可靠性和准确性的保证提供数据。
- 邮件收集
许多公司使用个人电子邮件数据进行电子邮件营销。他们可以针对特定受众进行营销。
- 新闻和内容监控
单个新闻周期可能对您的业务产生卓越的影响或真正的威胁。如果您的公司依赖于对组织的新闻分析,那么它经常会出现在新闻中。因此,网络抓取为监控和解析最重要的故事提供了最终解决方案。新闻文章和社交媒体平台可以直接影响股市。
- 社交媒体抓取
网络抓取在从社交媒体网站(如Twitter、Facebook和Instagram)中提取数据方面发挥着重要作用,以找到热门话题。
- 研究和开发
大量数据(如常规信息、统计数据和温度)从网站上抓取,然后进行分析和用于开展调查或研究与开发。
为什么选择Python进行网络抓取
还有其他流行的编程语言,但为什么我们选择Python而不是其他编程语言进行网络抓取?下面我们描述了Python的一些特点,使其成为网络抓取最有用的编程语言。
- 动态类型
在Python中,我们不需要为变量定义数据类型;我们可以直接在需要的地方使用变量。这节省了时间,并使任务更快。Python定义了自己的类来识别变量的数据类型。
- 丰富的库集合
Python提供了一系列广泛的库,如NumPy、Matplotlib、Pandas、Scipy等,这些库提供了与各种目的的灵活性。它几乎适用于每个新兴领域,也可用于从网站上提取数据进行处理的网络抓取。
- 代码量少
网络抓取的目的是节省时间。但如果编写代码花费了更多时间呢?这就是为什么我们使用Python的原因,因为它可以用几行代码执行任务。
- 开源社区
Python是开源的,这意味着它对每个人都是免费的。它拥有全球最大的社区之一,在Python代码中遇到任何困难时都可以寻求帮助。
网络爬虫的基础知识
网络爬虫由两个部分组成: 网络爬虫和网络抓取器 。简单来说,网络爬虫是马,抓取器是战车。爬虫引导抓取器并提取所需的数据。让我们了解一下网络爬虫的这两个组成部分:
- 爬虫
- 抓取器
网络爬虫的工作原理
以下是执行网络爬取的步骤。让我们了解网络爬取的工作原理。
步骤-1:找到要爬取的URL
首先,您应该根据您的项目了解数据的需求。一个网页或网站包含大量信息。因此只爬取相关信息。简单来说,开发人员应熟悉数据需求。
步骤-2:检查页面
数据以原始的HTML格式提取出来,必须仔细解析并从原始数据中减少噪声。在某些情况下,数据可能只是姓名和地址,也可能是高维天气和股票市场数据。
步骤-3:编写代码
编写代码来提取信息,提供相关信息并运行代码。
步骤-4:将数据存储在文件中
将信息存储在所需的csv、xml、JSON文件格式中。
开始进行网络爬虫
Python拥有丰富的库集合,并为网络爬虫提供了非常有用的库。让我们了解Python所需的库。
用于网络爬虫的库
- Selenium- Selenium是一个开源的自动化测试库。它用于检查浏览器活动。要安装此库,请在终端中键入以下命令。
pip install selenium
注意 – 最好使用PyCharm集成开发环境。
- 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
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,
在上面的代码中,我们导入了 bs4 和 requests 库。在第三行,我们创建了一个 res 对象来向网页发送请求。你可以观察到我们从网页中提取了所有的标题。
维基百科学习网页
让我们来了解另一个示例;我们将发送一个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()
输出:
我们抓取了iPhone的详情,并将这些详情保存在CSV文件中,如您在输出中所见。在上面的代码中,我们在少数几行代码上放了一个注释,用于测试目的。您可以删除这些注释并观察输出。
在本教程中,我们讨论了网络爬虫的所有基本概念,并描述了从领先的在线电商网站flipkart进行抓取的示例。