搜集整理淘宝网关于热干面的100页商品数据,使用Python进行整理分析。整个数据分析的过程分为以下三步:数据获取、数据清洗、数据可视化。
数据获取 使用selenium抓取淘宝商品
首先确定爬虫的策略,淘宝的商品页面数据是通过Ajax加载的,但是这些Ajax接口和参数比较复杂,可能会包含加密秘钥等,所以想要自己分析Ajax并构造参数,还是比较困难的。对于这种页面,最方便快捷的方法就是通过Selenium。因此,在此次项目项目中,我们利用selenium抓取淘宝商品并使用Xpath解析得到商品的名称、价格、购买人数、店铺名称、和店铺所在地的信息,并将数据保存在本地。具体爬虫思路如下:
导入相应的包
# 导入所需包
import pandas as pd
import re
import parsel # parsel是一个独立的Web抓取库
import time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
进行扫码登陆方式函数login_tao_account的编写
测试登陆后跳转到淘宝主页面
编写搜索商品的函数
# 打开浏览器
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
# 定义函数登录淘宝
def login_taobao_acount():
# 登录URL
login_url = 'https://login.taobao.com/member/login.jhtml'
# 打开网页
browser.get(login_url)
# 支付宝登录
log = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#login-form > div.login-blocks.sns-login-links > a.alipay-login'))
)
log.click()
# 定义函数搜索商品
def search(key_word):
try:
browser.get('https://www.taobao.com')
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
input.send_keys(key_word)
submit.click()
total = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
return total.text
except TimeoutException:
return search(key_word)
# 定义函数获取单页的商品信息
def get_products():
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
# 解析数据
html = parsel.Selector(browser.page_source)
# 获取数据
goods_name = html.xpath('//div[@class="grid g-clearfix"]//img/@alt').extract()
shop_name = html.xpath('//div[@class="grid g-clearfix"]//div[@class="shop"]/a/span[2]/text()').extract()
price = html.xpath('//div[@class="grid g-clearfix"]//div[contains(@class,"price")]/strong/text()').extract()
purchase_num = [re.findall(r'<div class="deal-cnt">(.*?)</div>', i)
for i in html.xpath('//div[@class="grid g-clearfix"]//div[@class="row row-1 g-clearfix"]').extract()]
location = html.xpath('//div[@class="grid g-clearfix"]//div[@class="location"]/text()').extract()
# 存储数据
df_one = pd.DataFrame({
'goods_name': goods_name,
'shop_name': shop_name,
'price': price,
'purchase_num': purchase_num,
'location': location
})
return df_one
# 定义函数进行翻页
def next_page(page_number):
print('正在翻页', page_number)
try:
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
)
submit = wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
input.clear()
input.send_keys(page_number)
submit.click()
wait.until(EC.text_to_be_present_in_element(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number)))
# 运行函数
df_product = get_products()
except TimeoutException:
next_page(page_number)
return df_product
# 获取所有页信息
def main():
try:
total = search(key_word='热干面')
total = int(re.compile('(\d+)').search(total).group(1))
# 存储数据
df_all = pd.DataFrame()
for i in range(1, total + 1):
df_one = next_page(i)
df_all = df_all.append(df_one, ignore_index=True)
# 打印进度
print('我正在获取第{}页的数据'.format(i))
time.sleep(3)
except Exception:
print('出错啦')
finally:
browser.close()
return df_all
# 从此处运行
if __name__ == '__main__':
# 登录
login_taobao_acount()
time.sleep(10)
df_all = main()
# 保存数据
df_all.to_excel('热干面数据.xlsx', index=False)
代码分析
login_taobao_acount函数,login_url为’https://login.taobao.com/member/login.jhtml’,在浏览器输入该url,按F12进入调试模式,分析expected_conditions.element_to_be_clickable函数中的’#login-form > div.login-blocks.sns-login-links > a.alipay-login’。
从源代码中找到登陆表单的代码,如下图所示:先找到id为login-from的元素。
search函数,连接到https://www.taobao.com并且通过CSS选择器找到id为q的元素。
然后通过#J_TSearchForm > div.search-button > button找到提交收索信息的按钮。
通过模拟输入和点击:input.send_keys(key_word)和submit.click进行收索。
#mainsrp-pager > div > div > div > div.total
next_page函数,#mainsrp-pager > div > div > div > div.form > input
#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit
然后通过页面输入框和确定按钮进行翻页。
#mainsrp-pager > div > div > div > ul > li.item.active > span
get_products函数,#mainsrp-itemlist .items .item
下面就是通过parsel库的Selector对象进行数据的提取
数据项 | xpath |
---|---|
goods_name | //div[@class=“grid g-clearfix”]//img/@alt |
shop_name | //div[@class=“grid g-clearfix”]//div[@class=“shop”]/a/span[2]/text() |
price | //div[@class=“grid g-clearfix”]//div[contains(@class,“price”)]/strong/text() |
purchase_num | 通过正则库找<\div class=“deal-cnt”>(.*?)</\div>,然后找到//div[@class=“grid g-clearfix”]//div[@class=“row row-1 g-clearfix”] |
location | //div[@class=“grid g-clearfix”]//div[@class=“location”]/text() |
通过商品列表中的alt属性取出商品名
提取商户名称
取得商品的价格
取得付款人数
找到商户地址
参考:https://mp.weixin.qq.com/s/GcVVfeU3SvpjNX6G1qMZrQ