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

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

爬取淘宝店家数据信息

  • 爬取淘宝商家货物简单销售数据(销量,价格,销售地,货物名称)
    • 一、登录淘宝,获取Cookies
    • 二、输入关键字,翻动页码,查看源码以及回应内容的变化。并请求数据
    • 三、分析数据网页源码,获取数据
    • 四、存储数据,并将数据按照销量降序排列

前天接一个爬取淘宝商家(自行车)信息的请求,要求数据按照其销售量排行。

完成该请求后,爬取数据(李宁卫衣)如下:
在这里插入图片描述

接下来看如何实现的?

首先打开淘宝网:https://www.taobao.com/,在搜索栏输入自行车,结果发现页面转跳到https://login.taobao.com/member/login.jhtml 淘宝登录页面,要求登录才能进行关键字搜索获取数据。(需要登录的时候应当想到cookies)

cookies 及其用处:
当我们登录某网站时,服务器会生成一个cookies,包含有用户登录等信息,与当前账号绑定,浏览器将此cookies存储到。下一次,浏览器带着cookies访问网站,就不需要在输入账号密码。注意cookies是有时效性的。

所以,目标明确,第一步,获取用户登录的cookies

一、登录淘宝,获取Cookies

需要登录淘宝页面获取cookies,才能执行后续操作。而模拟登录有两种方法:

  • 搞清淘宝登录机制,修改参数登录。(借鉴裸睡的猪 猪哥的文章)
  • 使用selenium调用webdriver模块,模拟人真实的操作浏览器。

方法一:直接看源码+备注,具体原因看猪哥的解释(当然代码是自己写的啊,思想借用)

import requests
import re
import json
import time
import randomcheck_url = 'https://login.taobao.com/newlogin/account/check.do?appName=taobao&fromSite=0'
headers = {'origin':'https://login.taobao.com','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',# 标记了请求从什么设备,什么浏览器上发出
}session  = requests.session()
login_url = 'https://login.taobao.com/newlogin/login.do'#自己手动登录一次,在参数页面把所有参数复制过来替换掉,看下图
Login_Data = {'loginId': '****',  'password2': '*****','keepLogin': 'true','ua': '***','umidGetStatusVal': '255','screenPixel': '1536x864','navlanguage': 'zh-CN','navUserAgent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36','navPlatform': 'Win32','appName': 'taobao','appEntrance': 'taobao_pc','_csrf_token': '*****','umidToken': '****','hsiz': '****','bizParams':'','style': 'default','appkey': '00000000','from': 'tbTop','isMobile': 'false','lang': 'zh_CN','returnUrl': 'https://www.taobao.com/','fromSite': '0',
}
login_res = session.post(login_url,headers=headers,data=Login_Data) #带着这些参数再登录一次爬取数据#获取st码申请地址
token_json = login_res.json()
st_url = token_json['content']['data']['asyncUrls'][0]  #st码的申请地址
print('验证用户名和密码成功')#通过st码申请地址获取st码
st_res = requests.get(st_url,headers=headers)
st_code_text = st_res.text
st_code = st_code_text[579:-270]  #获取st码,自己发现的规律,可以这么提取,也可以使用正则表达式
print('获取st码成功,st码:{}'.format(st_code))#获取登录跳转链接
res_st = session.get('https://login.taobao.com/member/vst.htm?st={}'.format(st_code) , headers=headers)
my_taobao = re.search(r'top.location.href = "(.*?)"', res_st.text)
print('登录淘宝成功,跳转链接:{}'.format(my_taobao.group(1)))
my_taobao_url = my_taobao.group(1)#登录
res_login = session.get(my_taobao_url, headers=headers)
nick_name = re.search(r'<input id="mtb-nickname" type="hidden" value="(.*?)"/>', res_login.text)
print('登录淘宝成功,你的用户名是:{}'.format(nick_name.group(1)))
username = nick_name.group(1)# 获取cookies,将cookies转成字典,再将字典转成字符串,保存到文件夹中
cookies_ditc = requests.utils.dict_from_cookiejar(session.cookies)
cookies_str = json.dumps(cookies_ditc)
f = open(r'C:\Users\13426\Desktop\cookies.txt','w',encoding='utf-8')
f.write(cookies_str)
print(cookies_str)  #cookies,具有时效性。
print('cookie已经完成序列化')  
f.close()

在自行登录以后,把参数都复制到Data里替换掉代码中的data就可以。
在这里插入图片描述

方法二:使用selenium调用webdriver模块(自己写的,所以解释详细点)

前提是安装了Chorm driver插件,Chorm插件下载地址。
下载完成后,解压到python根目录下即可。

driver可以模拟人在目标栏目输入,也可以模拟人对按钮进行点击。

对登录页面以及源码进行分析:发现:
在这里插入图片描述

帐号输入框对应:
<input name="fm-login-id" type="text" class="fm-text" id="fm-login-id" tabindex="1" aria-label="会员名/邮箱/手机号" placeholder="会员名/邮箱/手机号" autocapitalize="off">
密码输入框对应:
<input name="fm-login-password" type="password" class="fm-text" id="fm-login-password" tabindex="2" aria-label="请输入登录密码" placeholder="请输入登录密码" maxlength="40" autocapitalize="off">
登录按钮栏目对应:
<button type="submit" tabindex="3" class="fm-button fm-submit password-login">登录</button>

所以,代码如下:在账号密码框里输入内容,点击登录进行登录.

from selenium import webdriver#调用webdriver模块driver = webdriver.Chrome()#设置引擎为Chrome,模拟真实地打开一个浏览器
driver.get('https://login.taobao.com/member/login.jhtml')  #打开这个链接
time.sleep(1) #等待一秒钟,模拟真人操作## 运行代码之前输入自己的账号和密码
user = driver.find_element_by_name('fm-login-id')
user.send_keys('这里输入自己的账号')  #在fm-login-id对应框中输入账号
time.sleep(1)
assistant = driver.find_element_by_name('fm-login-password')
assistant.send_keys('这里输入自己的密码')
time.sleep(1)
submit = driver.find_element_by_class_name('fm-btn')  #点击登录按钮
submit.click()#登录
time.sleep(5)
cookie_list = driver.get_cookies() #登录以后获取cookie
cookies = {}
print(len(cookie_list))
for cookie in cookie_list:cookies[cookie['name']] = cookie['value']  #将cookies字典化
print("已经成功的获取到用户登录的cookies")
print(cookies)
driver.close()

注意,有时候登录时需要滑动滑块,手动滑动登录即可。

到此用户操作所用cookies的已经获取,这时候就可以搜索关键字了

二、输入关键字,翻动页码,查看源码以及回应内容的变化。并请求数据

进入搜索页:https://s.taobao.com/search? 输入关键字,观察url变化
在这里插入图片描述

我们发现q参数对应着搜索内容。然后翻动页面,来到第二页,观察url变化,发现变化的有s参数
在这里插入图片描述

研究多个页面发现,url需要修改的参数只有q与s。

在翻页的过程中,发现我们所需要的内容在Response的第0个回应中,即存在于Element中,所以只要获取到该网页的源码,就可以获取到数据。
在这里插入图片描述

所以使用https://s.taobao.com/search?q=自行车&s=88 这个格式(q表示搜索的关键字,s*44代表页数)的链接就可以访问带有数据的源码。

所以代码如下:

headers = {'Host':'s.taobao.com','User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Connection':'keep-alive'}
list_url = 'http://s.taobao.com/search?q=%(key)s&ie=utf8&s=%(pnum)d'for i in range(Page):pnum = i*44url = list_url%{'key':key,'pnum':pnum}print(url)res = requests.get(url,headers=headers,cookies=cookies)  #带有前面获取的cookies

三、分析数据网页源码,获取数据

这是我爬取的一个李宁卫衣的网页源码,发现重要信息保存在一个大字典:g_page_config中
在这里插入图片描述
在这里插入图片描述

所以我们可以通过正则表达式获取这个大字典,然后逐一提取各数据。或者直接正则各数据提取,我们采用第二种方法。

#创建正则表达式
titles = '"raw_title":"(.*?)"'       #标题
locations = '"item_loc":"(.*?)"'    #销售地
sales = '"view_sales":"(.*?)人付款"' #销售量
comments = '"comment_count":"(.*?)"'#评论数
prices = '"view_price":"(.*?)"'     #销售价格
nids = '"nid":"(.*?)"'          #这里需要nid,是因为商品的链接是需要这个参数的  #res.text表示网页源码,在其中匹配正则
title = re.findall(titles,res.text)
location = re.findall(locations,res.text)
sale = re.findall(sales,res.text)
comment = re.findall(comments,res.text)
price = re.findall(prices,res.text)
nid = re.findall(nids,res.text)

到这里已经把所有有效数据存储到title,location等变量中。它们均为字符串列表

四、存储数据,并将数据按照销量降序排列

使用csv保存数据

csv_file = open(r'文件保存路径','w',newline='',encoding='utf-8-sig')
writer = csv.writer(csv_file)
writer.writerow(['商品名称','销售地','销售量','评论数','销售价格','商品链接'])
#后续写入即可

因为要求数据要根据销量降序排列,而销量数据格式为字符串。分析源码,发现源码中销量的表示一般有’8000+’、‘1.6万+’、‘784’这几种表示。即如果销量小于10000,则按照 ‘具体数字’ 或 ‘具体数字+’ 这样表示,如’845’、‘3500+’,如果数据大于一万,则会在后续加个万字, 如’1.6万+’,‘5.8万’,强转为float时需要做判断:

所以,通过条件判断语句和if else判断:

sale[j] = sale[j]  if sale[j][-1] !='+'  else sale[j][:-1]  #判断最后一位是不是+,如果是,就删掉
if sale[j][-1] == '万':data.append([ title[j],location[j],float(sale[j][:-1])*10000,comment[j],price[j],goods_url ]) #如果最后一位是万,去掉最后一位,乘以10000即可
else:data.append([ title[j],location[j],float(sale[j]),comment[j],price[j],goods_url ])data.sort(key=itemgetter(2))  #按照第3个元素,即销量进行排序
data.reverse()#按照销量进行排序

还有一个发现就是,商品的链接与nid是有关系的,具体关系如下:

goods_url = 'https://item.taobao.com/item.htm?id='+nid[j]+'&ns=1&abbucket=19#detail'

到此代码已经分析完毕,源码如下,登录时修改自己的账号密码,以及文件的保存路径即可:

import time
import requests
import json
import re
from selenium import webdriver#调用webdriver模块
import csv
from operator import itemgetter## 在这里设置下爬取结果文件保存的路径
csv_file = open(r'C:\Users\13426\Desktop\demo.csv','w',newline='',encoding='utf-8-sig')
writer = csv.writer(csv_file)driver = webdriver.Chrome()#设置引擎为Chrome,模拟真实地打开一个浏览器
driver.get('https://login.taobao.com/member/login.jhtml')
time.sleep(1)## 运行代码之前输入自己的账号和密码
user = driver.find_element_by_name('fm-login-id')
user.send_keys('输入自己的账号')
time.sleep(1)
assistant = driver.find_element_by_name('fm-login-password')
assistant.send_keys('输入自己的密码')
time.sleep(1)
submit = driver.find_element_by_class_name('fm-btn')
submit.click()#登录
time.sleep(5)
cookie_list = driver.get_cookies()
cookies = {}
print(len(cookie_list))
for cookie in cookie_list:cookies[cookie['name']] = cookie['value']
print("已经成功的获取到用户登录的cookies")
print(cookies)
driver.close()headers = {'Host':'s.taobao.com','User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Connection':'keep-alive'}
list_url = 'http://s.taobao.com/search?q=%(key)s&ie=utf8&s=%(pnum)d'titles = '"raw_title":"(.*?)"'       #标题
locations = '"item_loc":"(.*?)"'    #销售地
sales = '"view_sales":"(.*?)人付款"' #销售量
comments = '"comment_count":"(.*?)"'#评论数
prices = '"view_price":"(.*?)"'     #销售价格
nids = '"nid":"(.*?)"'          #这里需要nid,是因为商品的链接是需要这个参数的  
writer.writerow(['商品名称','销售地','销售量','评论数','销售价格','商品链接'])key = input('输入想要爬取的商品名称:')
Page = 5 # 爬取的页数 ,可以自行修改
data = []for i in range(Page):pnum = i*44url = list_url%{'key':key,'pnum':pnum}print(url)res = requests.get(url,headers=headers,cookies=cookies)html = res.texttitle = re.findall(titles,html)location = re.findall(locations,html)sale = re.findall(sales,html)comment = re.findall(comments,html)price = re.findall(prices,html)nid = re.findall(nids,html)for j in range(len(title)):goods_url = 'https://item.taobao.com/item.htm?id='+nid[j]+'&ns=1&abbucket=19#detail'sale[j] = sale[j]  if sale[j][-1] !='+'  else sale[j][:-1]if sale[j][-1] == '万':data.append([ title[j],location[j],float(sale[j][:-1])*10000,comment[j],price[j],goods_url ]) #如果最后一位是万,去掉最后一位,乘以10000即可else:data.append([ title[j],location[j],float(sale[j]),comment[j],price[j],goods_url ])print('-------Page%s 已经抓取完毕!--------\n\n'%(i+1))time.sleep(2)
data.sort(key=itemgetter(2))
data.reverse()#按照销量进行排序  
for j in range(len(data)):writer.writerow(data[j])

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

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

相关文章

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

跨境电商的崛起&#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亿吨。或者说每当地球和火星轨道同步时可以运载…

下任推特 CEO 或是“卷王”?在马斯克手下 20 年,每天工作 16 个小时,还带着家人住办公室!

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 上周&#xff0c;马斯克发起线上投票&#xff0c;让网友决定他是否该卸任 Twitter CEO 一职&#xff0c;最终超过 1700 万 Twitter 用户参与&#xff0c;其中 57.5% 的人投了赞成票。 于是 12 月 21…