0
点赞
收藏
分享

微信扫一扫

Scrapy学习笔记-案例热干面销量之数据获取

王传学 2022-08-13 阅读 103


搜集整理淘宝网关于热干面的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

进行扫码登陆方式函数login_tao_account的编写

Scrapy学习笔记-案例热干面销量之数据获取_Scrapy


测试登陆后跳转到淘宝主页面

Scrapy学习笔记-案例热干面销量之数据获取_html_02


编写搜索商品的函数

Scrapy学习笔记-案例热干面销量之数据获取_css_03

Scrapy学习笔记-案例热干面销量之数据获取_Scrapy_04

# 打开浏览器
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的元素。

Scrapy学习笔记-案例热干面销量之数据获取_html_05


Scrapy学习笔记-案例热干面销量之数据获取_html_06


Scrapy学习笔记-案例热干面销量之数据获取_html_07


Scrapy学习笔记-案例热干面销量之数据获取_Scrapy_08

search函数,连接到https://www.taobao.com并且通过CSS选择器找到id为q的元素。

Scrapy学习笔记-案例热干面销量之数据获取_数据_09


然后通过#J_TSearchForm > div.search-button > button找到提交收索信息的按钮。

Scrapy学习笔记-案例热干面销量之数据获取_Scrapy_10


通过模拟输入和点击:input.send_keys(key_word)和submit.click进行收索。#mainsrp-pager > div > div > div > div.total

Scrapy学习笔记-案例热干面销量之数据获取_css_11

next_page函数,#mainsrp-pager > div > div > div > div.form > input

Scrapy学习笔记-案例热干面销量之数据获取_Scrapy_12


#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit

Scrapy学习笔记-案例热干面销量之数据获取_css_13


然后通过页面输入框和确定按钮进行翻页。

#mainsrp-pager > div > div > div > ul > li.item.active > span

Scrapy学习笔记-案例热干面销量之数据获取_css_14

get_products函数,#mainsrp-itemlist .items .item

Scrapy学习笔记-案例热干面销量之数据获取_数据_15


下面就是通过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属性取出商品名

Scrapy学习笔记-案例热干面销量之数据获取_数据_16


提取商户名称

Scrapy学习笔记-案例热干面销量之数据获取_Scrapy_17


取得商品的价格

Scrapy学习笔记-案例热干面销量之数据获取_Scrapy_18


取得付款人数

Scrapy学习笔记-案例热干面销量之数据获取_数据_19


找到商户地址

Scrapy学习笔记-案例热干面销量之数据获取_css_20

参考:https://mp.weixin.qq.com/s/GcVVfeU3SvpjNX6G1qMZrQ


举报

相关推荐

0 条评论