python爬虫 -- 模拟浏览器获取淘宝商品数据

一、介绍

  • 本爬虫功能主要是模拟浏览器操作,获取淘宝ajax数据,爬取一些基本的口红销量与价格。
  • 附加功能1:将数据绘制成三种图像(饼状图,柱状图,拟合曲线)。
  • 附加工能2:将数据导出为文本和表格。
  • 需要手动操作1:第一次爬取数据需要扫码登录一下淘宝,之后就不用了.
  • 需要手动操作2:需要自己下载一下edge的驱动,在我前面文章爬虫的模拟浏览器登录有网址

二、代码

import os
from lxml import etree
from selenium import webdriver
import time
import json
from xlwt import *

import numpy as np
# 实现插值的模块
from scipy import interpolate
# 画图的模块
import matplotlib.pyplot as plt
# 按照驱动路径获取驱动
bro = webdriver.Edge('./msedgedriver.exe')

# 存储cookie
cookie_path = "./cookies.txt"
# 访问地址
url = "https://s.taobao.com/search?q=%E5%8F%A3%E7%BA%A2&sort=sale-desc&s="
# 存储产品的集合
product_list = []
# 爬取网页的页数
total_page = 5
# 所有的价格的集合 画图用
product_price = []
# 所有的销量的集合 画图用 与价格集合一一对应
product_sales_volume = []


def set_cookies():
    """
    获取cookies保存至本地
    :return:
    """
    dict_cookies = bro.get_cookies()  # 获取list的cookies
    json_cookies = json.dumps(dict_cookies)  # 转换成字符串保存
    with open(cookie_path, 'w') as f:
        f.write(json_cookies)
    print('cookies保存成功')


def get_cookies(url):
    """
    从本地读取cookies并登录目标网页
    :param url: 要登录的网页
    :return:
    """
    with open(cookie_path, 'r', encoding='utf8') as f:
        list_cookies = []
        list_cookies = json.loads(f.read())
        print(len(list_cookies))
        for cookie in list_cookies:
            print(str(cookie))
            if cookie["domain"] != "s.taobao.com":
                bro.add_cookie(cookie)
        time.sleep(2)
        bro.get(url)
        time.sleep(3)


def parse_label():
    """
    解析标签
    :return:
    """
    # 通过解析标签,锁定所有装化妆品信息的盒子
    div_list = tree.xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div')
    for div in div_list:
        # 以下是分析化妆品盒子中的每一个信息
        name = div.xpath("string(./div[2]/div[2]/a)")  # sting()包裹表示,只提取这个标签下的文字部分,他的子标签不管
        price = div.xpath("./div[2]/div[1]/div[1]/strong/text()")[0]  # text()表示,提取这个标签下的文字部分,会返回数组
        sales_volume = div.xpath("./div[2]/div[1]/div[2]/text()")
        content = {"名称": " ", "价格": " ", "销量": " "}
        content["名称"] = name
        content["价格"] = price
        content["销量"] = sales_volume
        # 将每一个产品装在数组里面
        product_list.append(content)


def get_index_arr(arr, e):
    """
    获取元素在数组中的位置,不在数组则返回-1
    :param arr: 数组
    :param e: 元素
    :return:
    """
    for index, value in enumerate(arr):
        if e == value:
            return index
    return -1


def analysis_data():
    """
    分析数据
    :return:
    """
    for product in product_list:
        # 去掉名称里面的换行符和空格
        product["名称"] = product["名称"].replace("\n", "").replace(" ", "")
        # 有的产品没有销量 没销量的值[],换成空字符,有销量的值['销量'],提取出销量的字符串
        if len(product["销量"]) > 0:
            # 将万字换成0000,然后根据+号拆分字符串,取出前面的数字部分
            # 举例 6万+人下单  变成 60000+人下单 然后拆分为  ['60000','人下单']  取出数组第0位  60000
            product["销量"] = product["销量"][0].replace("万", "0000").split("+")[0]
            # 43人收货 这种格式的  直接去掉 “人收货”
            product["销量"] = product["销量"].replace("人收货", "")
        else:
            product["销量"] = "0"

        # 分析售价  有一样的就销量叠加
        index = get_index_arr(product_price, float(product["价格"]))
        if index == -1:
            product_price.append(float(product["价格"]))
            product_sales_volume.append(int(product["销量"]))
        else:
            product_sales_volume[index] = (product_sales_volume[index] + int(product["销量"]))
        print(product)


def save_txt():
    """
    保存数据到txt
    :return:
    """
    if os.path.exists("./product.txt"):
        os.remove("./product.txt")
    for product in product_list:
        with open("./product.txt", "a", encoding='utf-8') as fp:
            fp.write(str(product) + "\n")


def save_excel():
    """
        保存数据到Excel
    :return:
    """
    if os.path.exists("./product.xlsx"):
        os.remove("./product.xlsx")
    table_title = ["名称", "价格", "销量"]
    file = Workbook(encoding='utf-8')
    # 指定打开的文件名
    table = file.add_sheet('product')
    for i in range(0, len(product_list)):
        message_i = product_list[i]
        if i == 0:
            for j in range(0, len(table_title)):
                table.write(0, j, table_title[j])
        for j in range(0, len(message_i)):
            message = ""
            if j == 0:
                message = message_i["名称"]
            elif j == 1:
                message = message_i["价格"]
            else:
                message = message_i["销量"]
            table.write(i + 1, j, message)
    file.save('./product.xlsx')


def print_curve():
    """
    画曲线
    :return:
    """
    # x是一个数组,表示x轴的值 表示价格
    x = np.array(product_price)
    # # y是一个数组,表示y轴的值 表示销量
    y = np.array(product_sales_volume)
    # 插值法之后的x轴值,表示从0到500间距为0.5的1000个数
    x_new = np.arange(min(x), max(x), 0.5)
    """
    nearest、zero、slinear、quadratic、cubic
    实现函数func
    """
    func = interpolate.interp1d(x, y, kind='cubic')
    # # 利用x_new和func函数生成y_new,x_new的数量等于y_new数量
    y_new = func(x_new)
    # 画图部分

    # 原图
    # plt.plot(x, y, 'ro-')

    # 拟合之后的平滑曲线图
    plt.plot(x_new, y_new)
    plt.show()


def print_histogram():
    """
    画直方图
    :return:
    """
    x = product_price
    y = product_sales_volume
    # left: 每一个柱形左侧的X坐标 height:每一个柱形的高度 width: 柱形之间的宽度 bottom: 柱形的Y坐标 color: 柱形的颜色
    plt.bar(x, y, 5, color="green")
    # 不支持中文的
    # x轴的提示
    plt.xlabel("X-price")
    # y轴的提示
    plt.ylabel("Y-sales_volume")
    # 标题
    plt.title("price--sales_volume")
    plt.show()


def print_pie_chart():
    """
    画饼状图
    :return:
    """
    # 标签数据  就是圈外数据
    labels = product_price
    # 圈内的数据  最后会转化为百分比
    quants = product_sales_volume
    # make a square figure
    plt.figure(1, figsize=(6, 6))
    exp = []
    # 以下设置就是为了突出前三名
    for i in range(0, len(product_price)):
        if i < 3:
            # 前三块即销量最高的前三个离开圆心0.1
            exp.append(0.1)
        else:
            exp.append(0)
    # Colors used Recycle if not enough
    colors = ["blue", "red", "coral", "green", "yellow", "orange"]  # 设置颜色(循环显示)
    # autopct: format of "percent" string;百分数格式
    plt.pie(quants, explode=exp, colors=colors, labels=labels, autopct='%1.1f%%', pctdistance=0.8, shadow=True)
    # 设置标题
    plt.title('Pie chart of lipstick prices and sales', bbox={'facecolor': '0.8', 'pad': 5})
    plt.show()


if __name__ == "__main__":
    # 循环101次,爬取101页数据
    for page in range(0, total_page):
        # 访问当前网址
        get_url = url + str(page * 44)  # page * 44 是淘宝分页请求规则
        bro.get(get_url)

        # 爬取第一页,就是打开浏览器后 需要验证身份
        # 所以从cookie中获取身份信息 提交后 就能进行后续的信息爬取
        # 所以 下面代码相当于验证身份
        if page == 0:
            # os.path.exists(cookie_path) 判断此路径文件是否存在 存在返回 True
            if os.path.exists(cookie_path):
                get_cookies(get_url)
            else:
                # 如果没有cookie文件 则需要手动扫码登录
                # 暂停10秒,扫码登录
                time.sleep(10)
                set_cookies()

        # 获取请求的网页资源
        page_text = bro.page_source
        # 将网页资源转化成HTML,方便后续标签定位
        tree = etree.HTML(page_text)

        print("\n\n第" + str(page + 1) + "次爬取网页,分析信息")

        # 解析标签
        print("开始解析标签")
        parse_label()

    # 当所有数据爬取完毕 再进行以下操作

    # 分析数据
    print("开始分析数据")
    analysis_data()

    # 开始存储信息

    # 写进Excel
    print("开始存储数据到Excel")
    save_excel()

    # 写进TXT文本
    print("开始存储数据到txt")
    save_txt()

    # 画图
    print("画曲线")
    print_curve()

    print("画柱状图")
    print_histogram()

    print("画饼状图")
    print_pie_chart()

    print("\n\n\n数据爬完了\n\n\n")
    bro.quit()

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值