Python教程-使用Python进行网页抓取
什么是网页抓取?
网页抓取是一种从多个网站提取大量数据的技术。术语"抓取"指的是从另一个来源(网页)获取信息并将其保存到本地文件中。例如:假设您正在进行一个名为"手机比较网站"的项目,您需要手机的价格、评级和型号名称以便对不同的手机进行比较。如果您通过检查各种网站来收集这些详细信息,将会花费很多时间。在这种情况下,网页抓取起到了重要作用,通过编写几行代码,您就可以获得所需的结果。
网页抓取以非结构化格式从网站中提取数据。它有助于收集这些非结构化数据并将其转换为结构化形式。
初创公司倾向于使用网页抓取,因为这是一种廉价且有效的方法,可以在不与数据销售公司合作的情况下获取大量数据。
网页抓取是否合法?
这里有一个问题网页抓取是否合法。答案是,某些网站在合法使用时允许进行网页抓取。网页抓取只是一个工具,您可以以正确的方式或错误的方式使用它。
如果有人试图抓取非公开数据,网页抓取就是非法的。非公开数据不是每个人都可以访问的;如果您试图提取此类数据,则违反了法律条款。
有几种工具可用于从网站抓取数据,例如:
- Scrapping-bot
- Scrapper API
- Octoparse
- Import.io
- Webhose.io
- Dexi.io
- Outwit
- Diffbot
- Content Grabber
- Mozenda
- Web Scrapper Chrome 扩展
为什么要进行网页抓取?
正如我们上面讨论的,网页抓取用于从网站提取数据。但我们应该知道如何使用这些原始数据。这些原始数据可以在各个领域中使用。让我们来看一下网页抓取的用途:
- 动态价格监控
它广泛用于从几个在线购物网站收集数据,并比较产品价格,从而做出有利可图的定价决策。使用抓取的数据进行价格监控可以使公司了解市场状况,并实现动态定价。这确保公司始终能够超越其他竞争者。
- 市场研究
网页抓取非常适用于市场趋势分析。它可以深入了解特定市场。大型组织需要大量的数据,而网页抓取可以提供具有高度可靠性和准确性的数据。
- 电子邮件收集
许多公司使用个人电子邮件数据进行电子邮件营销。他们可以针对他们的营销目标特定的受众。
- 新闻和内容监控
单个新闻周期可能会对您的业务产生卓越的影响或真正的威胁。如果您的公司依赖于组织的新闻分析,它经常会出现在新闻中。因此,网页抓取为监控和解析最重要的故事提供了终极解决方案。新闻文章和社交媒体平台可以直接影响股票市场。
- 社交媒体抓取
网页抓取在从社交媒体网站(如Twitter、Facebook和Instagram)中提取数据方面发挥着重要作用,以找到热门话题。
- 研究与开发
从网站中抓取了大量的数据,例如一般信息、统计数据和温度,这些数据被分析并用于开展调查或研究与开发。
为什么要使用Python进行网页抓取?
虽然有其他流行的编程语言,但为什么我们选择在网页抓取中使用Python而不是其他编程语言?以下是Python的一些特性,使其成为进行网页抓取最有用的编程语言。
- 动态类型
在Python中,我们不需要为变量定义数据类型;我们可以直接在需要的地方使用变量。这节省了时间并加快了任务的完成。Python定义了自己的类来识别变量的数据类型。
- 丰富的库集合
Python附带了广泛的库,如NumPy、Matplotlib、Pandas、Scipy等,可以灵活地处理各种用途。它适用于几乎每个新兴领域,也适用于从网页抓取中提取数据并进行处理。
- 少量代码
网页抓取的目的是节省时间。但如果您在编写代码时花费更多时间怎么办?这就是为什么我们使用Python的原因,因为它可以在几行代码中执行任务。
- 开源社区
Python是开源的,这意味着每个人都可以免费使用它。它在全球范围内拥有最大的社区之一,在Python代码中任何地方遇到问题时,您都可以寻求帮助。
- 简单易学
Python是一种非常容易学习的语言,即使您是编程初学者,也可以很容易地理解它。无论您有多少编程经验,Python都将是一个非常容易学习的语言。
因此,Python是进行网页抓取的理想选择,因为它是一种功能强大且易于使用的编程语言。
如何在Python中进行网页抓取?
要在Python中进行网页抓取,您需要使用一些库,这些库可以帮助您从网页中提取所需的信息。以下是一些常用的Python库:
- Requests
requests
库允许您发出HTTP请求,从网页获取数据。您可以使用这个库来下载网页内容。
- Beautiful Soup
Beautiful Soup
是一个用于解析HTML和XML文档的库。它可以从网页源代码中提取数据,并将其转换为易于处理的格式。
- Scrapy
Scrapy
是一个更为高级的库,专为爬取网站数据而设计。它提供了更多的功能,适用于大规模的数据抓取任务。
- Selenium
Selenium
库允许您模拟浏览器行为,这对于处理动态加载的内容非常有用。它可以自动化执行各种浏览器操作,从而获取数据。
下面是一个使用Requests和Beautiful Soup库进行简单网页抓取的示例:
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()
输出:
这只是一个简单的示例,实际网页的结构可能更复杂。您可能需要使用不同的Beautiful Soup方法和选择器来获取您需要的数据。
请注意,网页抓取应该是合法和道德的,您应该遵守网站的使用条款和条件。避免过度频繁地访问网站,以防止对服务器造成不必要的负担。