网络爬虫是一种自动化技术,用于从网站提取大量数据。这些数据原本以非结构化格式存在于网站上,但通过爬虫技术,可以将其抓取、访问并存储为更结构化和清洁的格式,以便于进一步分析。
请确保在执行网络爬虫之前,已经获得了网站的许可。以下是使用Python进行网络爬虫的基本步骤:
import bs4
from bs4 import BeautifulSoup as bs
import requests
# 如果尚未安装上述库,请使用以下命令安装:
pip install bs4
pip install requests
将以从Flipkart网站抓取电视数据为例。首先,需要将产品的链接存储在变量中。
link='https://www.flipkart.com/search?q=tv&as=on&as-show=on&otracker=AS_Query_TrendingAutoSuggest_8_0_na_na_na&otracker1=AS_Query_TrendingAutoSuggest_8_0_na_na_na&as-pos=8&as-type=TRENDING&suggestionId=tv&requestId=9c9fa553-b7e5-454b-a65b-bbb7a9c74a29'
接下来,将使用Requests库发送HTTP请求到上述代码中的页面URL,并将响应存储在变量page中。这将给页面的HTML内容,可以用它来抓取所需的数据。
page = requests.get(link)
print(page.content)
现在已经得到了页面的HTML内容,需要将其解析并存储在soup变量中,以便将其结构化为不同的格式,这将有助于数据提取。
将检查Flipkart页面,从中提取数据并阅读HTML标签。为此,可以右键单击页面并点击“检查”。点击“检查”后,将出现以下屏幕,其中包含所有HTML标签,这将帮助提取所需的确切数据。
首先,需要找出包含产品名称的HTML标签和类。在下图中,可以看到产品名称(右侧突出显示的部分)嵌套在具有类_4rR01T的div标签中(左侧突出显示)。
name=soup.find('div',class_="_4rR01T")
print(name)
name.text
在下图中,可以看到评分(右侧突出显示的部分)嵌套在具有类_3LWZlK的div标签中(左侧突出显示)。
rating=soup.find('div',class_="_3LWZlK")
print(rating)
rating.text
它嵌套在具有类fMghEO的div标签中(左侧突出显示)。
specification=soup.find('div',class_="fMghEO")
print(specification)
specification.text
如果想要单独获取每个规格,将运行以下代码。
for each in specification:
spec=each.find_all('li',class_='rgWa7D')
print(spec[0].text)
print(spec[1].text)
print(spec[2].text)
print(spec[4].text)
print(spec[5].text)
print(spec[7].text)
价格嵌套在具有类_30jeq3 _1_WHN1的div标签中(左侧突出显示)。
price=soup.find('div',class_='_30jeq3 _1_WHN1')
print(price)
price.text
到目前为止,只是提取了一台电视的数据,但现在需要页面上所有电视的数据,因此将运行一个循环并将数据存储在定义的列表中。
products=[] # 存储产品名称的列表
prices=[] # 存储产品价格的列表
ratings=[] # 存储产品评分的列表
apps = [] # 存储支持的应用程序
os = [] # 存储操作系统
hd = [] # 存储分辨率
sound = [] # 存储声音输出
检查包含所有信息的标签,并使用它来一起提取所有功能(如下图所示)。
for data in soup.findAll('div',class_='_3pLy-c row'):
names=data.find('div', attrs={'class':'_4rR01T'})
price=data.find('div', attrs={'class':'_30jeq3 _1_WHN1'})
rating=data.find('div', attrs={'class':'_3LWZlK'})
specification = data.find('div', attrs={'class':'fMghEO'})
for each in specification:
col=each.find_all('li', attrs={'class':'rgWa7D'})
app =col[0].text
os_ = col[1].text
hd_ = col[2].text
sound_ = col[3].text
products.append(names.text) # 添加产品名称到列表
prices.append(price.text) # 添加价格到列表
apps.append(app)# 添加支持的应用程序规格到列表
os.append(os_) # 添加操作系统规格到列表
hd.append(hd_) # 添加分辨率规格到列表
sound.append(sound_) # 添加声音规格到列表
ratings.append(rating.text) #添加评分规格到列表
print(len(products))
print(len(ratings))
print(len(prices))
print(len(apps))
print(len(sound))
print(len(os))
print(len(hd))
import pandas as pd
df=pd.DataFrame({'Product Name':products,'Supported_apps':apps,'sound_system':sound,'OS':os,"Resolution":hd,'Price':prices,'Rating':ratings})
df.head(10)