python爬虫获取淘宝天猫商品详细参数

时间:2022-05-03 09:39:33

首先我是从淘宝进去,爬取了按销量排序的所有(100页)女装的列表信息按综合、销量分别爬取淘宝女装列表信息,然后导出前100商品的 link,爬取其详细信息。这些商品有淘宝的,也有天猫的,这两个平台有些区别,处理的时候要注意。比如,有的说“面料”、有的说“材质成分”,其实是一个意思,等等。可以取不同的链接做一下测试。

  1. import re 
  2. from collections import OrderedDict 
  3. from bs4 import BeautifulSoup 
  4. from pyquery import PyQuery as pq #获取整个网页的源代码 
  5. from config import * #可引用congif的所有变量 
  6.   
  7. import pymysql 
  8. import urllib 
  9. import json 
  10. import bs4 
  11. import requests 
  12. from selenium import webdriver 
  13. from selenium.webdriver.support.ui import WebDriverWait 
  14. from pyquery import PyQuery as pq #获取整个网页的源代码 
  15. import pandas as pd 
  16.   
  17. # 测试 淘宝+天猫,可完整输出及保存 
  18.   
  19. browser = webdriver.Firefox() 
  20. wait = WebDriverWait(browser,10) 
  21.   
  22. ####### 天猫上半部分详情 ############# 
  23. def get_tianmao_header(url): 
  24.  browser.get(url) 
  25.  # wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))) #加载所有宝贝 
  26.  html=browser.page_source 
  27.  doc = pq(html) 
  28.  # print(doc) 
  29.  info = OrderedDict() # 存放该商品所具有的全部信息 
  30.  items = doc('#page'
  31.   
  32.  # info['店铺名'] = items.find('.slogo').find('.slogo-shopname').text() 
  33.  # info['ID'] = items.find('#LineZing').attr['itemid'] 
  34.  info['宝贝'] = items.find('.tb-detail-hd').find('h1').text() 
  35.  info['促销价'] = items.find('#J_PromoPrice').find('.tm-promo-price').find('.tm-price').text() 
  36.  info['原价'] = items.find('#J_StrPriceModBox').find('.tm-price').text() 
  37.  # '月销量' :items.find('.tm-ind-panel').find('.tm-ind-item tm-ind-sellCount').find('.tm-indcon').find('.tm-count').text(), 
  38.  info['月销量'] = items.find('.tm-ind-panel').find('.tm-indcon').find('.tm-count').text().split(' ',2)[0] 
  39.  info['累计评价'] = items.find('#J_ItemRates').find('.tm-indcon').find('.tm-count').text() 
  40.  # print(info) 
  41.  return info 
  42.   
  43. ######## 淘宝上半部分详情 ############### 
  44. def get_taobao_header(url): 
  45.  browser.get(url) 
  46.  # wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))) #加载所有宝贝 
  47.  html=browser.page_source 
  48.  doc = pq(html) 
  49.  # print(doc) 
  50.  info = OrderedDict() # 存放该商品所具有的全部信息 
  51.  items = doc('#page'
  52.   
  53.  # info['店铺名'] = items.find('.tb-shop-seller').find('.tb-seller-name').text() 
  54.  # info['ID'] = items.find('#J_Pine').attr['data-itemid'] 
  55.  info['宝贝'] = items.find('#J_Title').find('h3').text() 
  56.  info['原价'] = items.find('#J_StrPrice').find('.tb-rmb-num').text() 
  57.  info['促销价'] = items.find('#J_PromoPriceNum').text() 
  58.  # '月销量' :items.find('.tm-ind-panel').find('.tm-ind-item tm-ind-sellCount').find('.tm-indcon').find('.tm-count').text(), 
  59.  info['月销量'] = items.find('#J_SellCounter').text() 
  60.  info['累计评价'] = items.find('#J_RateCounter').text() 
  61.  # print(info) 
  62.  return info 
  63.   
  64. ####################### 详情 ############################ 
  65. # 抓取所有商品详情 
  66. def get_Details(attrs,info): 
  67.  # res = requests.get(url) 
  68.  # soup = BeautifulSoup(res.text, "html.parser") 
  69.  # 
  70.  # attrs = soup.select('.attributes-list li') 
  71.   
  72.  # attrs= [<li title=" 薄">厚薄: 薄</li>, <li title=" 其他100%">材质成分: 其他100%</li>,<li ...</li>] 
  73.  attrs_name = [] 
  74.  attrs_value = [] 
  75.  ''''
  76.  [s] 匹配空格,[s]*,后面有 *,则可以为空 
  77.  * : 匹配前面的子表达式任意次 
  78.  ''
  79.   
  80.  for attr in attrs: 
  81.   attrs_name.append(re.search(r'(.*?):[s]*(.*)', attr.text).group(1)) 
  82.   attrs_value.append(re.search(r'(.*?):[s]*(.*)', attr.text).group(2)) 
  83.   
  84.  # print('attrs_name=',attrs_name) # attrs_name= ['厚薄', '材质成分', ...] 
  85.  # print('attrs_value=',attrs_value) # attrs_value= ['薄', '其他100%', ...] 
  86.   
  87.  allattrs = OrderedDict() # 存放该产品详情页面所具有的属性 
  88.  for k in range(0, len(attrs_name)): 
  89.   allattrs[attrs_name[k]] = attrs_value[k] 
  90.  # print('allattrs=',allattrs) # allattrs= OrderedDict([('厚薄', '薄'), ('材质成分', '其他100%'),...]) 
  91.   
  92.  # info = OrderedDict() # 存放该商品所具有的全部信息 
  93.  # info = get_headdetail2(url) 
  94.   
  95.  # 下面三条语句获取描述、服务、物流的评分信息 
  96.   
  97.  # 下面的语句用来判断该商品具有哪些属性,如果具有该属性,将属性值插入有序字典,否则,该属性值为空 
  98.  # 适用场景 
  99.  if '材质成分' in attrs_name: 
  100.   info['材质成分'] = allattrs['材质成分'
  101.  elif '面料' in attrs_name: 
  102.   info['材质成分'] = allattrs['面料'
  103.  else
  104.   info['材质成分'] = 'NA' 
  105.   
  106.  # 适用对象 
  107.  if '流行元素' in attrs_name: 
  108.   info['流行元素'] = allattrs['流行元素'
  109.  else
  110.   info['流行元素'] = 'NA' 
  111.   
  112.  #季节 
  113.  if '年份季节' in attrs_name: 
  114.   info['年份季节'] = allattrs['年份季节'
  115.  else
  116.   info['年份季节'] = 'NA' 
  117.   
  118.  # 款式 
  119.  if '袖长' in attrs_name: 
  120.   info['袖长'] = allattrs['袖长'
  121.  else
  122.   info['袖长'] = 'NA' 
  123.  # 尺码 
  124.  if '销售渠道类型' in attrs_name: 
  125.   info['销售渠道类型'] = allattrs['销售渠道类型'
  126.  else
  127.   info['销售渠道类型'] = 'NA' 
  128.  # 帽顶款式 
  129.  if '货号' in attrs_name: 
  130.   info['货号'] = allattrs['货号'
  131.  else
  132.   info['货号'] = 'NA' 
  133.  # 帽檐款式 
  134.  if '服装版型' in attrs_name: 
  135.   info['服装版型'] = allattrs['服装版型'
  136.  else
  137.   info['服装版型'] = 'NA' 
  138.  # 檐形 
  139.  if '衣长' in attrs_name: 
  140.   info['衣长'] = allattrs['衣长'
  141.  else
  142.   info['衣长'] = 'NA' 
  143.  # 主要材质 
  144.  if '领型' in attrs_name: 
  145.   info['领型'] = allattrs['领型'
  146.  else
  147.   info['领型'] = 'NA' 
  148.  # 人群 
  149.  if '袖型' in attrs_name: 
  150.   info['袖型'] = allattrs['袖型'
  151.  else
  152.   info['袖型'] = 'NA' 
  153.  # 品牌 
  154.  if '品牌' in attrs_name: 
  155.   info['品牌'] = allattrs['品牌'
  156.  else
  157.   info['品牌'] = 'NA' 
  158.  # 风格 
  159.  if '图案' in attrs_name: 
  160.   info['图案'] = allattrs['图案'
  161.  elif '中老年女装图案' in attrs_name: 
  162.   info['图案'] = allattrs['中老年女装图案'
  163.  else
  164.   info['图案'] = 'NA' 
  165.   
  166.  # 款式细节 
  167.  if '服装款式细节' in attrs_name: 
  168.   info['服装款式细节'] = allattrs['服装款式细节'
  169.  else
  170.   info['服装款式细节'] = 'NA' 
  171.   
  172.  # 适用年龄 
  173.  if '适用年龄' in attrs_name: 
  174.   info['适用年龄'] = allattrs['适用年龄'
  175.  else
  176.   info['适用年龄'] = 'NA' 
  177.   
  178.  # 风格 
  179.  if '风格' in attrs_name: 
  180.   info['风格'] = allattrs['风格'
  181.  elif '中老年风格' in attrs_name: 
  182.   info['风格'] = allattrs['中老年风格'
  183.  else
  184.   info['风格'] = 'NA' 
  185.   
  186.  #通勤 
  187.  if '通勤' in attrs_name: 
  188.   info['通勤'] = allattrs['通勤'
  189.  else
  190.   info['通勤'] = 'NA' 
  191.   
  192.  if '裙长' in attrs_name: 
  193.   info['裙长'] = allattrs['裙长'
  194.  else
  195.   info['裙长'] = 'NA' 
  196.   
  197.  if '裙型' in attrs_name: 
  198.   info['裙型'] = allattrs['裙型'
  199.  else
  200.   info['裙型'] = 'NA' 
  201.   
  202.  if '腰型' in attrs_name: 
  203.   info['腰型'] = allattrs['腰型'
  204.  else
  205.   info['腰型'] = 'NA' 
  206.   
  207.  # 颜色分类 
  208.  if '主要颜色' in attrs_name: 
  209.   info['主要颜色'] = allattrs['主要颜色'
  210.  else
  211.   info['主要颜色'] = 'NA' 
  212.  if '颜色分类' in attrs_name: 
  213.   info['主要颜色'] = allattrs['颜色分类'
  214.  else
  215.   info['主要颜色'] = 'NA' 
  216.   
  217.  #尺码 
  218.  if '尺码' in attrs_name: 
  219.   info['尺码'] = allattrs['尺码'
  220.  else
  221.   info['尺码'] = 'NA' 
  222.   
  223.  if '组合形式' in attrs_name: 
  224.   info['组合形式'] = allattrs['组合形式'
  225.  else
  226.   info['组合形式'] = 'NA' 
  227.   
  228.  if '裤长' in attrs_name: 
  229.   info['裤长'] = allattrs['裤长'
  230.  else
  231.   info['裤长'] = 'NA' 
  232.   
  233.  return info 
  234.   
  235.   
  236. import csv 
  237.   
  238. def main(): 
  239.  # 提取 列 
  240.  with open('clothes_detai.csv''w', newline='', encoding='utf-8') as csvfile: 
  241.   # fieldnames = ['店铺ID','店铺名','链接','宝贝','原价','促销价','月销量','累计评价','材质成分','流行元素','袖长','年份季节','销售渠道类型','货号','服装版型','衣长','领型','袖型', 
  242.   #    '裙型','裙长','腰型','裤长','组合形式','品牌','图案','服装款式细节', '适用年龄','风格','通勤','主要颜色','尺码'] 
  243.   fieldnames=[ 'Link','Brand','Title','Price','Sale price','Sales','Evaluations'
  244.      'Component''Fashion elements','Sleeve','Seasons','Sales channels'
  245.      'Number','Clothes_Style','Long','Collar type','Sleeve type'
  246.      'Skirt type','Skirt length','Waist','Combining form','Outseam'
  247.      'Design','Fashion pattern detail','Applicable age'
  248.      'Style','Commuter','color','Size'
  249.   # 'Shop','Data_id','Shop_id','Shop','Link','Data_id', 
  250.   writer = csv.DictWriter(csvfile, fieldnames = fieldnames) 
  251.   writer.writeheader() 
  252.   
  253.   # urls = ['//detail.tmall.com/item.htm?spm=a230r.1.14.1.ebb2eb2eGyUw1&id=549177691667&ns=1&abbucket=4', 
  254.     # '//item.taobao.com/item.htm?id=548443640333&ns=1&abbucket=0#detail'] 
  255.   
  256.   f = pd.read_csv('women_clothes_sales2.csv'
  257.   urls = f['link'][0:100] 
  258.   # sh = f['shop_id'][0:3] 
  259.   # s = f['shop'][0:3] 
  260.   # for url in urls: 
  261.   #  print(url) 
  262.   # writer.writerow({'店铺ID':f['shop_id'],'店铺名':f['shop']}) 
  263.   keys, values = [], [] 
  264.   # for url in urls: 
  265.   for i in urls: 
  266.    url = 'http:' + i 
  267.    # endswith 判断字符串是否以指定的字符串结尾 
  268.    if url.endswith('detail'): 
  269.     info = get_taobao_header(url) 
  270.   
  271.     res = requests.get(url) 
  272.     soup = BeautifulSoup(res.text, "html.parser"
  273.     attrs = soup.select('.attributes-list li') # 淘宝 class 
  274.    else
  275.     info = get_tianmao_header(url) 
  276.   
  277.     res = requests.get(url) 
  278.     soup = BeautifulSoup(res.text, "html.parser"
  279.     attrs = soup.select('#J_AttrUL li') # 天猫 id 
  280.     # print('attrs=',attrs) 
  281.   
  282.    d = get_Details(attrs,info) 
  283.    print(d) 
  284.    # for j in f[shop_id]: 
  285.    #  d['店铺ID'] = j 
  286.    # for s in f['shop']: 
  287.    #  d['店铺名'] = s 
  288.    #'Shop':d['店铺名'],'Data_id':d['ID'], 
  289.    writer.writerow({'Link':url,'Brand':d['品牌'],'Title':d['宝贝'], 'Price':d['原价'], 'Sale price':d['促销价'], 'Sales':d['月销量'], 'Evaluations':d['累计评价'], 
  290.         'Component':d['材质成分'], 'Fashion elements':d['流行元素'], 'Sleeve':d['袖长'], 'Seasons':d['年份季节'], 'Sales channels':d['销售渠道类型'], 
  291.         'Number':d['货号'],'Clothes_Style':d['服装版型'],'Long':d['衣长'],'Collar type':d['领型'], 'Sleeve type':d['袖型'], 
  292.         'Skirt type':d['裙型'], 'Skirt length':d['裙长'], 'Waist':d['腰型'], 'Combining form':d['组合形式'], 'Outseam':d['裤长'], 
  293.         'Design':d['图案'], 'Fashion pattern detail':d['服装款式细节'], 'Applicable age':d['适用年龄'], 
  294.         'Style':d['风格'], 'Commuter':d['通勤'], 'color':d['主要颜色'], 'Size':d['尺码']}) 
  295.   
  296. if __name__=='__main__'
  297.  main() 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/sisteryaya/article/details/77894443