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

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

猜你喜欢

转载自blog.csdn.net/asmartkiller/article/details/105924086
今日推荐