wyfighting

目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格

程序的设计结构:

  步骤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()

 

结果:

分类:

技术点:

相关文章:

猜你喜欢