前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
雙十一期間,各大平臺都的商品都在打折,哪些店鋪的折扣是最低的
本次目標
爬取唯品會口紅商品資料
https://category.vip.com/suggest.php?keyword=%E5%8F%A3%E7%BA%A2&ff=235%7C12%7C1%7C1&page=3
環境
Python3.6
pycharm
下面我們先來決議下網頁
通過開發者工具可以看到,網頁并沒有回傳我們想要的商品資料,所以打算直接復制網頁資料進行搜索查找
如上圖所示,復制商品名字,在開發者工具里面直接搜索,可以看到相關的資料包,里面包含了商品標題、售價、原價、折扣以及商品的其他資料資訊,
既然這個介面里面有想要的資料了,那接下來就是分析URL怎么樣才能獲取這個URL,因為這個資料包里面只有50條資料,然而唯品會一頁是有120條資料的,
想要找到url的變化規律,那么就需要你自己多去看幾個資料,同樣的方法一個資料介面只要五十條資料,那么就可以選擇第51條資料或者后面的資料去搜索,查找相對應的資料介面,通過一系列的對比發現,url中的引數productIds 的變化,引數中就是每個商品ID值了,那問題來了,怎么才能獲取商品的ID值呢?其實方法和上面的一樣,復制ID值找到相關的資料介面,
這里面就有這一整頁 120個商品的id值,問題它又雙叒叕,總不能只爬取一頁的資料吧,所以還要分析獲取ID值每一頁的url變化,還是一樣想知道url的變化規律多看幾頁就知道了~
這里就省略了~
- 第一頁
- 第二頁
pageOffset引數的變化每120個資料翻一頁嘛,ID都獲取了,前面也看到每個商品資料介面對應的是50條資料,經過分析就知道 120個商品劃分為是三個 50,50,20 分別傳入相對應的商品ID就可以了,
開始爬蟲的代碼
匯入工具
import requests import re import csv
請求網頁
def get_data(num_id): data_url = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/module/list/v2' headers = { # 'cookie': 'vip_address=%257B%2522pid%2522%253A%2522104104%2522%252C%2522cid%2522%253A%2522104104101%2522%252C%2522pname%2522%253A%2522%255Cu5e7f%255Cu4e1c%255Cu7701%2522%252C%2522cname%2522%253A%2522%255Cu5e7f%255Cu5dde%255Cu5e02%2522%257D; vip_province=104104; vip_province_name=%E5%B9%BF%E4%B8%9C%E7%9C%81; vip_city_name=%E5%B9%BF%E5%B7%9E%E5%B8%82; vip_city_code=104104101; vip_wh=VIP_NH; vip_ipver=31; mars_pid=20; cps=adp%3Ag1o71nr0%3A%3A%3A%3A; user_class=a; VipUINFO=luc%3Aa%7Csuc%3Aa%7Cbct%3Ac_new%7Chct%3Ac_new%7Cbdts%3A0%7Cbcts%3A0%7Ckfts%3A0%7Cc10%3A0%7Crcabt%3A0%7Cp2%3A0%7Cp3%3A1%7Cp4%3A0%7Cp5%3A1%7Cul%3A3105; mars_sid=a46fb0bf05a51955082f9a561da8893a; visit_id=B288281FDDBDD306C6D856C9D2959935; vip_tracker_source_from=; pg_session_no=11; mars_cid=1602569282048_0b4beb3d18306a0a0143c359ddb34fae', 'referer': 'https://category.vip.com/suggest.php?keyword=%E5%8F%A3%E7%BA%A2&ff=235%7C12%7C1%7C1&page=3', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' } params = { 'callback': 'getMerchandiseDroplets2', 'app_name': 'shop_pc', 'app_version': '4.0', 'warehouse': 'VIP_NH', 'fdc_area_id': '104104101', 'client': 'pc', 'mobile_platform': '1', 'province_id': '104104', 'api_key': '70f71280d5d547b2a7bb370a529aeea1', 'user_id': '', 'mars_cid': '1602569282048_0b4beb3d18306a0a0143c359ddb34fae', 'wap_consumer': 'a', 'productIds': '{}'.format(num_id), 'scene': 'search', 'standby_id': 'nature', 'extParams': '{"stdSizeVids":"","preheatTipsVer":"3","couponVer":"v2","exclusivePrice":"1","iconSpec":"2x"}', 'context': '', '_': '1603721644366', } response_2 = requests.get(url=data_url, params=params, headers=headers) for page in range(0, 1201, 120): url = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/search/product/rank' headers = { # 'cookie': 'vip_address=%257B%2522pid%2522%253A%2522104104%2522%252C%2522cid%2522%253A%2522104104101%2522%252C%2522pname%2522%253A%2522%255Cu5e7f%255Cu4e1c%255Cu7701%2522%252C%2522cname%2522%253A%2522%255Cu5e7f%255Cu5dde%255Cu5e02%2522%257D; vip_province=104104; vip_province_name=%E5%B9%BF%E4%B8%9C%E7%9C%81; vip_city_name=%E5%B9%BF%E5%B7%9E%E5%B8%82; vip_city_code=104104101; vip_wh=VIP_NH; vip_ipver=31; mars_pid=20; cps=adp%3Ag1o71nr0%3A%3A%3A%3A; user_class=a; VipUINFO=luc%3Aa%7Csuc%3Aa%7Cbct%3Ac_new%7Chct%3Ac_new%7Cbdts%3A0%7Cbcts%3A0%7Ckfts%3A0%7Cc10%3A0%7Crcabt%3A0%7Cp2%3A0%7Cp3%3A1%7Cp4%3A0%7Cp5%3A1%7Cul%3A3105; mars_sid=a46fb0bf05a51955082f9a561da8893a; visit_id=B288281FDDBDD306C6D856C9D2959935; vip_tracker_source_from=; pg_session_no=11; mars_cid=1602569282048_0b4beb3d18306a0a0143c359ddb34fae', 'referer': 'https://category.vip.com/suggest.php?keyword=%E5%8F%A3%E7%BA%A2&ff=235%7C12%7C1%7C1&page=3', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' } params = { 'callback': 'getMerchandiseIds', 'app_name': 'shop_pc', 'app_version': '4.0', 'warehouse': 'VIP_NH', 'fdc_area_id': '104104101', 'client': 'pc', 'mobile_platform': '1', 'province_id': '104104', 'api_key': '70f71280d5d547b2a7bb370a529aeea1', 'user_id': '', 'mars_cid': '1602569282048_0b4beb3d18306a0a0143c359ddb34fae', 'wap_consumer': 'a', 'standby_id': 'nature', 'keyword': '口紅', 'lv3CatIds': '', 'lv2CatIds': '', 'lv1CatIds': '', 'brandStoreSns': '', 'props': '', 'priceMin': '', 'priceMax': '', 'vipService': '', 'sort': '0', 'pageOffset': '{}'.format(page), 'channelId': '1', 'gPlatform': 'PC', 'batchSize': '120', '_': '1603721644362', } response = requests.get(url=url, params=params, headers=headers)
決議網頁資料
titles = re.findall('"title":"(.*?)"', response_2.text, re.S) # 標題 salePrice = re.findall(',"salePrice":"(.*?)",', response_2.text, re.S) # 售價 marketPrice = re.findall('"marketPrice":"(.*?)"', response_2.text, re.S) # 原價 saleDiscount = re.findall('"saleDiscount":"(.*?)"', response_2.text, re.S) # 折扣 smallImage = re.findall('"smallImage":"(.*?)"', response_2.text, re.S) # 商品圖片地址 lis = zip(titles, salePrice, marketPrice, saleDiscount, smallImage) dit = {} for li in lis: dit['商品名字'] = li[0] dit['售價'] = li[1] dit['原價'] = li[2] dit['折扣'] = li[3] dit['商品圖片地址'] = li[4] csv_writer.writerow(dit) print(dit)
保存資料
f = open('唯品會商品資料.csv', mode='a', encoding='utf-8-sig', newline='') csv_writer = csv.DictWriter(f, fieldnames=['商品名字', '售價', '原價', '折扣', '商品圖片地址']) csv_writer.writeheader()
運行代碼,效果如下圖
看到有幾家原價100多,折后價是10元的,這種你確定是口紅不是畫筆?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/193879.html
標籤:Python
上一篇:Python串列去重的方式有很多,了解它們,進行性能的對比
下一篇:類的“多型”
