淘宝商品数据爬取并分析数据

一、抓取数据 

1、抓取数据的意义

对电商来说,抓取某些数据,再进行分析,可以有效地反映出数据在某个区间内变化情况。数据受某些因素而发生巨大的影响,也可以借助分析的数据来规划相关项目的后续发展。因此,如果能利用网页爬取数据技术获取数据并对各种数据进行统计分析,对后续淘宝的发展具有指导意义。

2、抓取的内容

包括:商品名称title、商品价格price、付款人数deal,店铺名称shop、店铺地址location、商品的详情页detail_url。

3、实现内容

1、开打淘宝网站,输入搜索内容“word”查找商品

2、再解决登录问题(登录时解决网站对selenium的判别,修改浏览器的内部属性,否则被识别出有selenium,需要进行滑动登陆验证。但是在运行时,你手动地去进行滑动登录也是会判别出存在selenium的,进而登陆不上去)

3、对查找商品在控制台上输出

4、具体实现代码

4.1所需模块

from selenium import webdriver
import time
import random

首先的话,我们需要导入一些模块,比如第三方模块selenium,大家如果发生报错的话,就需要额外安装了,安装selenium模块有2个方法:

  1、在pycharm的terminal控制台命令行中输入:pip install selenium

  2、在win+r中的cmd里输入:pip install selenium

这两个方法都是可以的。

import time
import random

这两个的话,我们则是用来设置随机时间的,在抓取到数据之前,我们需要点击搜索框、搜索一些按键。我们需要模拟人为的操作时间,否则的话很可能操作失败了,我们随机地等待1-3秒的时间。

4.2创建chrome浏览器,打开淘宝网

在关于创建浏览器的话,首选是chrome浏览器,调出开发者模式太方便了!!!,火狐也是可以的,但首选首选首选chrome,因为我真的没用过火狐,哈哈哈哈哈哈

然后使用driver.get()方法,往内部传一个地址,我们就用淘宝网的地址。我们也就打开了下面的所示淘宝的网页界面。

    driver = webdriver.Chrome()  # 创建谷歌浏览器# TODO 执行浏览器操作driver.get('https://www.taobao.com/')  driver.implicitly_wait(10)  # 智能化等待方法driver.maximize_window()  # 最大化

 4.3Xpath解析路径

我们要在淘宝网的搜索框中输入我们的商品,还要点搜索按钮,进而还需要登录(需要用户名、密码)。这都需要我们在网页上定位这些搜索框、搜索按钮、用户名框、密码框、登录按钮。所以打开淘宝网页的开发者模式,找到搜索框、搜索按钮、用户名框、密码框、登录按钮的xpath。

我们利用find_element_by_xpath()这个函数来解析对应的xpath

设置等待的时间,模拟人为操作

    driver.find_element_by_xpath('//*[@id="q"]').send_keys(word)  time.sleep(random.randint(1, 3)) driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click()time.sleep(random.randint(1, 3))  

开发者模式:

首先我们定位到搜索框,就在开发者模式的Elements下,copy  -->  copy xpath。复制到我们的find_element_by_xpath()函数中,其他的搜索按钮、用户名框、密码框、登录按钮也是这样找。

4.4 搜索商品关键字 

在淘宝网上,根据我们所需要爬取的商品信息,在搜索框中搜索爬取的商品,比如说 帽子。

    word = input('请输入要搜索的关键字:')# TODO 创建浏览器driver = webdriver.Chrome() # TODO 执行浏览器操作driver.get('https://www.taobao.com/')  # 传一个地址driver.implicitly_wait(10)  # 智能化等待方法driver.maximize_window()  # 最大化driver.find_element_by_xpath('//*[@id="q"]').send_keys(word)  # time.sleep(random.randint(1, 3))  driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click()time.sleep(random.randint(1, 3))  

 在搜索之后就出现一个登陆的界面,我们再根据4.3xpath解析路径的方法将我们的用户名,密码传进去,再进行登录。

代码如下:

    """用户账号及密码登录"""driver.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys('xxxxxxx')  # TODO 输入用户名time.sleep(random.randint(1, 3))  driver.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys('xxxxxxxx')  # TODO 输入密码time.sleep(random.randint(1, 3))  driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()time.sleep(random.randint(1, 3)) 

不过此时会遇到一个问题:登陆的时候需要我们进行滑动验证

这是因为淘宝网检测出了selenium这个东西,尽管你人为地去滑动,但还是会登陆失败。

所以我们在创建出浏览器之后,随即改变浏览器内部的一些属性,可以网站避免检测出selenium的存在,就不需要我们进行滑动登录的验证了。

    # 修改了浏览器的内部属性,跳过了登录的滑动验证driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})

4.5获取爬取商品具体信息

解析获取商品名称title、商品价格price、付款人数deal,店铺名称shop、店铺地址location、商品的详情页detail_url的数据

 这时候我们需要借助一个插件:xpath helper  十分好用,可以写我们xpath的语法,来帮助我们定位商品的具体信息。

例:这一页的48个商品名称 

下载地址:

链接:https://pan.baidu.com/s/1iCEbjnpa8dhTDScIhkvbZA 
提取码:1uv9

找到第一个商品,找到商品列表,每个商品列表里面都有该商品的具体信息,比如商品名称、商品价格、付款人数,店铺名称、店铺地址、等等等的数据

 我们要获取所有的div标签divs,然后再遍历divs去获取所需要的商品具体信息

 具体代码:

def parse_data():# 多个商品数据解析divs = driver.find_elements_by_xpath('//div[@class="grid g-clearfix"]/div/div')  # 获取所有的div标签for div in divs:  title = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text  # 商品名字price = div.find_element_by_xpath('.//strong').text + '元'  # 商品价格deal = div.find_element_by_xpath('.//div[@class="deal-cnt"]').text  # 付款人数shop = div.find_element_by_xpath('.//div[@class="shop"]/a/span[2]').text  # 店铺名称location = div.find_element_by_xpath('.//div[@class="location"]').text  # 店铺地点detail_url = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').get_attribute('href')  # 详情页地址print(title, price, deal, shop, location, detail_url)

爬取第一页和第二页的商品信息,一页爬取完之后便点击下一页 

    for page in range(0, 2):print(f'-----------------正在爬取第{page + 1}页-----------------')# TODO 调用商品解析的函数parse_data()driver.find_element_by_xpath('//li[@class="item next"]/a[@class="J_Ajax num icon-tag"]').click()time.sleep(random.randint(2, 3))

5、完整代码及结果

完整代码如下:

from selenium import webdriver
import time
import randomdef parse_data():divs = driver.find_elements_by_xpath('//div[@class="grid g-clearfix"]/div/div')  # 所有的div标签for div in divs: test = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text  # 商品名字price = div.find_element_by_xpath('.//strong').text + '元'  # 商品价格deal = div.find_element_by_xpath('.//div[@class="deal-cnt"]').text  # 付款人数name = div.find_element_by_xpath('.//div[@class="shop"]/a/span[2]').text  # 店铺名称location = div.find_element_by_xpath('.//div[@class="location"]').text  # 店铺地点detail_url = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').get_attribute('href')  # 详情页地址print(test, price, deal, name, location, detail_url)if __name__ == '__main__':word = input('请输入要搜索的关键字:')# TODO 1、创建浏览器driver = webdriver.Chrome() # TODO 2、修改了浏览器的内部属性,跳过了登录的滑动验证driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})# TODO 3、执行浏览器操作driver.get('https://www.taobao.com/')  driver.implicitly_wait(10)  # 智能化等待方法driver.maximize_window()  # 最大化driver.find_element_by_xpath('//*[@id="q"]').send_keys(word)  time.sleep(random.randint(1, 3))  driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click()time.sleep(random.randint(1, 3)) """用户账号及密码登录"""driver.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys('xxxxxx')  # TODO 输入用户名time.sleep(random.randint(1, 3))  driver.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys('xxxxxxx')  # TODO 输入密码time.sleep(random.randint(1, 3))  driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()time.sleep(random.randint(1, 3)) for page in range(0, 2):print(f'-----------------正在爬取第{page + 1}页-----------------')# TODO 调用商品解析的函数parse_data()driver.find_element_by_xpath('//li[@class="item next"]/a[@class="J_Ajax num icon-tag"]').click()time.sleep(random.randint(2, 3))

爬取的结果如图: 

二、存入数据库

from pymysql import *  # 连接MySQL数据库
import pymysql
  • 连接我们本机的数据库
  • 接着创建游标对象
  • 执行sql语句,将数据存入数据库表information中

(注意:在sql语句里,“不要用%或者+操作符来拼接SQL语句,应该使用占位符”,因为我使用了%拼接在运行的时候出错了,找了百度解决了这个问题)

    mysql_obj = connect(host='127.0.0.1', user='root', password='xxxxxxxx', database='webcrawlers', port=3306,charset='utf8mb4')# 创建游标cur_obj = mysql_obj.cursor()# TODO 就是不要用%或者+操作符来拼接SQL语句,应该使用占位符cur_obj.execute('insert into Information(id, name_product, price_product, number_purchaser, name_store, address_store, detail_url) values(0, ("%s"), ("%s"), ("%s"), ("%s"), ("%s"), ("%s")) ' , (title, price, deal, shop, location, detail_url))mysql_obj.commit()cur_obj.close()mysql_obj.close()

三、数据库数据导入csv文件并建模分析

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pymysql

在将数据库导入csv文件,借助了这个博客python把mysql数据库中的数据表写入csv文件_程序员 小明的博客-CSDN博客 

"""参考此博客https://blog.csdn.net/weixin_42304193/article/details/89607394
将数据库数据导入csv文件
"""class Test_myqsl(object):# 运行数据库和建立游标对象def __init__(self):self.connect = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="xxxxxxx", database="webcrawlers",charset="utf8mb4")# 返回一个cursor对象,也就是游标对象self.cursor = self.connect.cursor(cursor=pymysql.cursors.DictCursor)# 关闭数据库和游标对象def __del__(self):self.connect.close()self.cursor.close()def write(self):# 将数据转化成DataFrame数据格式data = pd.DataFrame(self.read())# 把id设置成行索引data_1 = data.set_index("id", drop=True)# 写写入数据数据pd.DataFrame.to_csv(data_1, "e:/python1/taobaodatatest.csv", encoding="gbk")print("写入成功")def read(self):# 读取数据库的所有数据data = self.cursor.execute("""select * from information""")field_2 = self.cursor.fetchall()# pprint(field_2)return field_2# 封装
def main():write = Test_myqsl()write.write()

此时,我们在e盘中的python1文件中,就有了taobaodatatest.csv这个文件。里面的数据是由webcrawlers数据库information这个表导入的。

在我们进行数据分析之前,我们要拿到商品的价格price_product、和购买人数number_purchase

这里面的数据包含了一些无用符号,比如说' '、万、+、人付款、元。我们需要它的数据进行分析。所以我们把这些符号处理一下,拿到我们所需要的数据。

    # TODO 对csv文件进行符号、文字的替换f = open('E:/python1/taobaodatatest.csv', encoding='gbk')content_f = f.read()with open('E:/python1/taobaodatatest.csv', 'w', encoding='gbk') as f1:t = content_f.replace("'", ' ')f1.write(t)f.close()f = open('E:/python1/taobaodatatest.csv', encoding='gbk')content_f = f.read()with open('E:/python1/taobaodatatest.csv', 'w', encoding='gbk') as f2:g = content_f.replace('万', '0000')f2.write(g)f.close()f = open('E:/python1/taobaodatatest.csv', encoding='gbk')content_f = f.read()with open('E:/python1/taobaodatatest.csv', 'w', encoding='gbk') as f3:h = content_f.replace('+', '')f3.write(h)f.close()f = open('E:/python1/taobaodatatest.csv', encoding='gbk')content_f = f.read()with open('E:/python1/taobaodatatest.csv', 'w', encoding='gbk') as f4:j = content_f.replace('人付款', '')f4.write(j)f.close()f = open('E:/python1/taobaodatatest.csv', encoding='gbk')content_f = f.read()with open('E:/python1/taobaodatatest.csv', 'w', encoding='gbk') as f5:k = content_f.replace('元', '')f5.write(k)f.close()

 将taobaodatatest.csv文件的特殊符号处理完之后,进行数据分析、建模

    # TODO 1.分析商品价格对销量的影响tbdata = pd.read_csv('e:/python1/taobaodatatest.csv', encoding='gbk')sns.set(style="darkgrid")sns.jointplot(x="price_product", y='number_purchaser', data=tbdata, kind='scatter', color='purple')plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.title('商品价格对销量的影响', loc='right')plt.show()# TODO 2.分析商品价格对销售总额的影响plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsetbdata['GMV'] = (tbdata['price_product']) * (tbdata['number_purchaser'])sns.regplot(x="price_product", y="GMV", data=tbdata, color='purple')plt.title('商品价格对销售总额的影响')plt.show()# TODO 3.分析不同省份的店铺数量分布plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(8, 4))province = tbdata['address_store']province.value_counts().plot(kind='bar', color='purple')plt.xticks(rotation=90)plt.xlabel('省份')plt.ylabel('店铺数量')plt.title('不同省份的店铺数量分布')plt.show()# TODO 4.直观地表示价格、省份、销量三者之间的关系(这里采用三维绘图表示三者关系)x, y = np.mgrid[-2:2:20j, -2:2:20j]z = x * np.exp(-x ** 2 - y ** 2)ax = plt.subplot(111, projection='3d')ax.plot_surface(x, y, z, rstride=2, cstride=1, cmap=plt.cm.Blues_r)ax.set_xlabel("price_product")ax.set_ylabel("address_store")ax.set_zlabel("number_purchaser")plt.title('价格、省份、销量三者之间的关系')plt.show()

在程序运行的时候,在最后的数据建模分析的时候出现了错误: 

TypeError: cannot convert the series to <class 'int'>这个错误。网上查了python报TypeError: cannot convert the series to <class 'float'> - 极客分享

这篇中说:可能是出现了空值,这个空值也是很特殊,既不是null也不是none。然后我翻了我的数据库,发现爬取的数据,极个别商品没有商品价格、商品没有购买人数。这就导致我在计算总销售额的时候出现了这个错误

所以在对爬取数据存入数据库的时候,对xpath解析得到的:商品价格price、购买人数deal进行判定:当他们是  ''  的时候,我赋值一个0给它们。

        if price == '':price = 0if deal == '':deal = 0

此时爬取的数据进行分析结果如图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/71849.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取淘宝商家货物简单销售数据(销量,价格,销售地,货物名称)

爬取淘宝商家货物简单销售数据&#xff08;销量&#xff0c;价格&#xff0c;销售地&#xff0c;货物名称&#xff09; 爬取淘宝店家数据信息 爬取淘宝商家货物简单销售数据&#xff08;销量&#xff0c;价格&#xff0c;销售地&#xff0c;货物名称&#xff09;一、登录淘宝&a…

第三方速卖通数据抓取工具全面解析

跨境电商的崛起&#xff0c;使得越来越多的卖家选择在速卖通平台上开店&#xff0c;但是如何获取有用的数据并进行分析&#xff0c;成为了卖家们面临的一个难题。第三方速卖通数据抓取工具应运而生&#xff0c;成为了卖家们获取有价值数据的新利器。本文将从以下八个方面对第三…

获取用户手机号码

小程序中有很多地方都会用到注册用户信息的地方&#xff0c;用户需要填写手机号等&#xff0c; 有了这个组件可以快速获取微信绑定手机号码&#xff0c;无须用户填写。 1.getPhoneNumber这个组件通过button来实现&#xff08;别的标签无效&#xff09;。将button中的open-type“…

获取微信手机号码

access_token是公众号的全局唯一接口调用凭据&#xff0c;公众号调用各接口时都需要使用access_token。 微信开发需要用到的access_token&#xff0c;其实是分为两个种类的&#xff0c;一种是普通的access_token&#xff0c;另一种是网页授权access_token。 普通的access_tok…

基于java的手机批量导入手机号系统,检测手机号微信是否开通

大量的手机号码按照记事本格式&#xff08;记事本文档里面只可以有手机号和状态&#xff09;导入&#xff08;手机号----状态&#xff09;&#xff0c;具体代码包括工具类的使用&#xff0c;可以点击下载查询。 //导出跳转GetMapping("/phone-list-export")public M…

Android快速实现手机号码识别OCR

在Android App中开发扫描手机号码、电话号码OCR功能&#xff0c;一般有多种方案选择&#xff1a; 1. 调用商业在线OCR接口 2. 集成商业离线OCR SDK 3. 集成开源OCR模块 &#xff08;若需集成离线识别SDK&#xff0c;可参考https://blog.csdn.net/dieqms/article/details/110…

写中文文章,字数≠质量,多少字最佳?

在这个自媒体盛行的时代&#xff0c;我们经常听到“字数至上”的说法&#xff0c;有人认为写作一定要达到一定的字数才能够算是一篇好文章&#xff0c;但是真的是这样吗&#xff1f;中文文章写多少字才算合适呢&#xff1f;下面就让我们来一起探讨一下。 1.字数不等于质量 首…

写完的文档有多少个字?字数统计在word哪里

还记得小时候写作文的时候&#xff0c;为了确保字数足够&#xff0c;会一个字一个字地去数&#xff0c;但是现在不用啦&#xff0c;现在基本上都是利用电脑来编写文档&#xff0c;利用word节省很多办公时间&#xff0c;而word很智能&#xff0c;功能也很齐全&#xff0c;再也不…

最适合十二星座的那些表白方式!

白羊座: 世俗又浪漫&#xff1b; 金牛座: 奢华大场面&#xff1b; 双子座: 诱发好奇心&#xff1b; 巨蟹座: 省钱又省事&#xff1b; 狮子座: 一起打肿脸&#xff1b; 处女座: 看谁更细腻&#xff1b; 天秤座: 需要好口才&#xff1b; 天蝎座: 深情加酒精&#xff1b; …

占星周运(白羊座)

冥王拱太阳 海王六合太阳 北交拱土星,北交合水星 火星六合天王 金星型木星 羊羊&#xff0c;继续追求金钱和财产吧。记忆也是一种财产。你的家庭生活既是充满活力/暴躁的&#xff0c;也是有吸引力/引人注目的。拥抱孩子。在五月剩下的时间里&#xff0c;偶然认识的朋友、交谈&…

星座与性格

星座与传说 | 星座与爱情 | 星座与性格 | 星座与生日愿望 | 星座与经商 | 测试你的性成熟程度 十二星座 宝瓶星座 双鱼星座 白羊星座 金牛星座 双子星座 巨蟹星座 狮子星座 处女星座 天秤星座 天蝎星座 射手星座 摩羯星座 十二星座 宝瓶星座 双鱼星座 白羊星座 金牛星座 双子…

PyTorch定长验证码训练集数字识别(几乎每行注释,开箱即用)

文章目录 前言一、代码1.1 MyDataset.py(加载数据集和计算均值&#xff0c;标准差)1.2 Mymodels.py(使用预训练模型)1.2.1 ResNet介绍 1.3 main.py(启动代码)1.4 inferring.py(验证是否识别成功)1.5 文件目录树1.6 资源链接 二、借鉴 前言 这是一个识别出验证码图片的代码。训…

chatgpt赋能python:Python制表位:优化数据可视化与分析的利器

Python 制表位&#xff1a;优化数据可视化与分析的利器 在数据可视化和分析中&#xff0c;表格是一种常用的数据展示方式。Python 提供了丰富的用于构建表格的库&#xff0c;其中之一便是制表位&#xff08;Tabulate&#xff09;。本文将介绍制表位的特点、使用方法以及另外一…

结合代谢组学和网络药理学技术发现的差异代谢物和中药成分的药物靶点关联等技术操作

本期分享一篇中南大学今年发表在Computational and Structural Biotechnology Journal 杂志(影响因子6.018)上的论文《结合代谢组学和网络药理学揭示羟基红花黄色素A抗急性颅脑损伤的机制》。 外伤性脑损伤(Traumatic brain injury,TBI)已成为世界范围内导致死亡、发病和残…

网络药理学分析工具开发好了

上次文章说开发网络药理学工具&#xff0c;其实上周五就已经做好了&#xff0c;但我为什么要今天才通知各位小伙伴呢。因为第一版做的实在太丑了图片&#xff0c;所以我觉得要好好打磨一下&#xff0c;所以今天才写这篇文章。我们先来看下软件打磨前后的对比&#xff1a; 第一版…

论文查重发现他引率为0怎么办

今天准备论文查重&#xff0c;发现虽然查重率低&#xff0c;但是他引率为0。搞得我一脸懵。 格式什么的都是正确的&#xff0c;引用大段的文献也有&#xff0c;为啥他引率为0呢。。。。 被逼无奈&#xff0c;将文章中的上标注和参考文献的标注全部用手打的&#xff0c;不使用…

文末送书 | 图灵宇宙:用漫画讲述图灵奖背后的计算机科学发展简史

张立波&#xff0c;武延军&#xff0c;赵琛 著 电子工业出版社-博文视点2022-09-01 ISBN: 9787121442933定价:109.00 元 新书推荐 &#x1f31f;今日福利 &#xff5c;关于本书&#xff5c; 这是一本以计算机领域重要奖项——图灵奖为切入点&#xff0c;系统展现计算机科学发展…

“复制”马斯克(三):我们要为他的“反智事业”买单吗?

马斯克首次跻身世界首富&#xff0c;引发大众的强烈关注。 但是&#xff0c;首富的排名对马斯克、对我们而言都并不重要&#xff0c;对我们更为重要的一个影响是&#xff0c;随着马斯克所取得的商业成功和巨大财富积累&#xff0c;他的事业正在进入一个全新的阶段。 去年的12月…

马斯克的 39 页火星计划PPT

????????关注后回复 “进群” &#xff0c;拉你进程序员交流群???????? 马斯克曾在Twitter上这样写道&#xff0c;“每年建造100艘星际飞船&#xff0c;10年内就达到1000艘&#xff0c;也就意味着每年的运力达到1亿吨。或者说每当地球和火星轨道同步时可以运载…