自学python之爬虫2获取淘宝网搜索页面的商品名称和价格
目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格
程序的设计结构:
步骤1:提交商品获取请求,循环获取页面
步骤2:对于每个页面,提取商品名称和价格信息
步骤3:将信息输到屏幕上
在淘宝网站的搜索框中输入关键词 如“书包”,点击搜索,查看结果首页的url为:
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170909
第二页的url:
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170909&bcoffset=4&ntoffset=4&p4ppushleft=1%2C48&s=44
第三页的url:
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170909&bcoffset=4&ntoffset=4&p4ppushleft=1%2C48&s=88
发现url的不同在于:从第二页开始,每一页最后的s=xx,而xx是44的倍数,因为结果页每页有44个商品。
找到规律后就可以构建请求的url:
start_url = 'https://s.taobao.com/search?q=' + queryword + '&s=' + str(44*(pagenum-1))
接下来可以发送请求进行爬取,获取的页面后,就可以提取商品的名称和价格。
查看源代码找到对应的信息:

可以看到商品名称和价格分别对应于 'raw_title'和'view_price',且以键值对的形式存储,可以使用正则表达式来匹配满足条件的字符串并存储到列表中
商品价格:plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
商品名称:tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
此时,这两个列表中的数据为:
plt = ["view_price":"62.00" , "view_price":"70.00" ...]
tlt = ["raw_title":"书包小学生儿童xxx" , "raw_title":"中学生书包xxx" ...]
接下来获取价格和名称的值,并存储到新的列表中
infoList = []
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
infolist.append([price , title])
这样,就把每个商品的名称和价格提取出来了
infolist = [["62.00","书包小学生儿童xx"] , ["70.00",''中学生书包xx"] ...]
最后,格式化信息并输出。
代码如下:
1 import requests 2 import re 3 4 #获取页面 5 def getHTMLText(url): 6 try: 7 r = requests.get(url, timeout=30) 8 r.raise_for_status() 9 r.encoding = r.apparent_encoding 10 return r.text 11 except: 12 return "get fail" 13 14 #解析页面 15 def parsePage(ilt, html): 16 try: 17 plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html) #商品价格 18 tlt = re.findall(r'\"raw_title\"\:\".*?\"',html) #商品名称 19 for i in range(len(plt)): 20 price = eval(plt[i].split(':')[1]) 21 title = eval(tlt[i].split(':')[1]) 22 ilt.append([price , title]) 23 except: 24 print('parse fail') 25 26 #输出商品信息 27 def printGoodsList(ilt): 28 tplt = "{:4}\t{:8}\t{:16}" 29 print(tplt.format("序号", "价格", "商品名称")) 30 count = 0 31 for g in ilt: 32 count = count + 1 33 print(tplt.format(count, g[0], g[1])) 34 35 #主函数 36 def main(): 37 goods = '书包' #搜索关键词 38 depth = 2 #搜索深度,即页数 39 start_url = 'https://s.taobao.com/search?q=' + goods 40 infoList = [] 41 for i in range(depth): 42 try: 43 url = start_url + '&s=' + str(44*i) 44 html = getHTMLText(url) 45 parsePage(infoList, html) 46 except: 47 continue 48 printGoodsList(infoList) 49 50 main()
结果:


浙公网安备 33010602011771号