用requests库爬取淘宝数据
本文作者:李祉宏(投稿)
文字编辑:钱梦璇
导读
相信淘宝大家都有用过,淘宝商品繁多,如果能把淘宝的商品名称、价格、商店名称、发货地等数据爬下来,然后进行分析,我们就能找出性价比最高商品、最可靠的商家啦!下面和小编一起试一下爬取淘宝数据吧!
1. 准备工作
Step1:
这次我们采用request库进行爬取,没有安装request库的读者可以打开命令提示符,输入pip install requests进行安装。
Step2:
获取网页数据的时候要给服务器提供headers,这里提供User-Agent和Cookie信息即可(不会的百度即可)。
Step3:
import requests
import re
import json
import time
headers = {
'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.手动查找
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=88
res = requests.get(url = baseurl,headers = headers)
3.正则提取并用json解析
我们需要找到所需信息在json文件中的位置,即如下图所示的一长串内容(蓝色部分)。
然后我们采用正则表达式进行提取,然后将提取结果转化为json格式(注意:如果正则表达式不正确,就算提取到文本也不能转为json,只有json格式正确才能转换)。得出一个多重字典,如下所示:
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 requests
import re
import json
import time
headers = {
'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=88
res = 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 = 1
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掉
附:运行情况
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。