查看原文
其他

用requests库爬取淘宝数据

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:李祉宏(投稿)

文字编辑:钱梦璇

技术总编:张   邯

导读

相信淘宝大家都有用过,淘宝商品繁多,如果能把淘宝的商品名称、价格、商店名称、发货地等数据爬下来,然后进行分析,我们就能找出性价比最高商品、最可靠的商家啦!下面和小编一起试一下爬取淘宝数据吧!


1. 准备工作

Step1: 

这次我们采用request库进行爬取,没有安装request库的读者可以打开命令提示符,输入pip install requests进行安装。

Step2:

获取网页数据的时候要给服务器提供headers,这里提供User-Agent和Cookie信息即可(不会的百度即可)。

Step3:

对获取的数据进行解析,我们采用正则表达式进行爬取,然后用json进行解析。
代码如下:(附:为了防止爬取过快,我们引用time库来减缓爬取时间。

import requestsimport reimport jsonimport timeheaders = { 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)ppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36', 'Cookie': '……'#自己找..


2.手动查找

      接下来,打开淘宝搜索页面,手动输入内容,获取目标网址(url),当然爬取一页是不够的,我们要手动点击多页,比较不同页码对应url的区别,区别如下:
第2页:

https://s.taobao.com/search?q=taobao&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=3&p4ppushleft=1%2C48&ntoffset=3&s=44

第3页:

https://s.taobao.com/search?q=taobao&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=3&p4ppushleft=1%2C48&ntoffset=3&s=88

发现只有最后的&s有差别,那么不难猜出第一页&s=0,第二页&s=44,第三页&s=88。以此类推,然后用request进行请求,将响应内容保存在res中。注意返回的status_code如果不是200,说明响应错误,这时候需要查一下url,headers之类的有没有错误。

代码如下:
keywords = input("输入你要搜索的内容")baseurl = 'https://s.taobao.com/search?q='+str(keywords)#第一页&s=0第二页&s=44第三页&s=88res = requests.get(url = baseurl,headers = headers)


3.正则提取并用json解析

我们需要找到所需信息在json文件中的位置,即如下图所示的一长串内容(蓝色部分)。

然后我们采用正则表达式进行提取,然后将提取结果转化为json格式(注意:如果正则表达式不正确,就算提取到文本也不能转为json,只有json格式正确才能转换)。得出一个多重字典,如下所示:

可以找到标题[raw_title],价格[view_price],付款数[view_sales]等信息。
regex_string = 'g_page_config = (.*?);\n'redata = re.findall(regex_string,res.text)#正则提取jsdata = json.loads(redata[0])target = jsdata['mods']['itemlist']['data']['auctions']totalPage = jsdata['mods']['sortbar']['data']['pager']['totalPage']#获取页面总数print("搜索结果,共有{}页".format(totalPage))for i in range(totalPage): print("现在爬取第{}页".format(i+1)) url = str(baseurl)+'&s='+str(44*i)#第一页&s=0第二页&s=44第三页&s=88 res = requests.get(url = url,headers = headers) regex_string = 'g_page_config = (.*?);\n' redata = re.findall(regex_string, res.text)#获取目标数据 jsdata = json.loads(redata[0]) target = jsdata['mods']['itemlist']['data']['auctions'] for each in target: print(num,each['raw_title'], each['view_price']) num = num+1 print("*"*60) time.sleep(0.5)#缓一缓以防速度过快被服务器ban掉

为了方便理解,这里没有对代码进行封装了,记得用for循环来获取全部页面的信息,完整代码如下:

import requestsimport reimport jsonimport timeheaders = { 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)ppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36', 'Cookie': '……'#自己找..}#请求头,'User-Agent'是浏览器标识,淘宝的服务器会进行识别keywords = input("输入你要搜索的内容")baseurl = 'https://s.taobao.com/search?q='+str(keywords)#第一页&s=0第二页&s=44第三页&s=88res = requests.get(url = baseurl,headers = headers)regex_string = 'g_page_config = (.*?);\n'redata = re.findall(regex_string,res.text)jsdata = json.loads(redata[0])target = jsdata['mods']['itemlist']['data']['auctions']totalPage = jsdata['mods']['sortbar']['data']['pager']['totalPage']#获取页面总数num = 1print("搜索结果,共有{}页".format(totalPage))for i in range(totalPage): print("现在爬取第{}页".format(i+1)) url = str(baseurl)+'&s='+str(44*i)#第一页&s=0第二页&s=44第三页&s=88 res = requests.get(url = url,headers = headers) regex_string = 'g_page_config = (.*?);\n' redata = re.findall(regex_string, res.text)#获取目标数据 jsdata = json.loads(redata[0]) target = jsdata['mods']['itemlist']['data']['auctions'] for each in target: print(num,each['raw_title'], each['view_price']) num = num+1 print("*"*60) time.sleep(0.5)#缓一缓以防速度过快被服务器ban掉


附:运行情况

补充:其实json解析是很慢的,小编试过用json和re分别运行对比时间:

显然正则表达式快很多,有能力者可另外尝试!






对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

WordStat—Stata的文本分析小助手

数据筛选理还乱,datacheck能诊断
如何用简单的手法绘制出不一样的海外疫情趋势图
matplotlib绘制数学函数
gen的再进化
Stata版大家来找茬—cfout就够了
另辟蹊径js逆向爬取百度翻译
可迭代对象、迭代器、生成器傻傻分不清楚
Ftools命令组之fegen命令介绍
提升效率的利器——如何用labvarch批量修改变量标签
二进制序列类型——bytes()、bytearray()
今日头条海外疫情数据爬取
anythingtodate带你轻松处理日期
_variables介绍
查询12306车次信息
海外疫情仍严峻,劝君更在家中留
国外疫情怎么看?——实时新闻获真知

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存