爬取唯品會首頁商品分類及鏈接


很久之前做的東西。一直沒時間分享,今天有空正好分享出來。

想做個爬取唯品會首頁的商品分類和鏈接的腳本。第一反應是用BeautifulSoup。但是在瀏覽器里調試了很久沒有發現鏈接,無奈只能放棄了使用BeautifulSoup。

嘗試了抓包,我們看看下面是抓到的包:

通過多次的抓取,終於抓到了兩個接口。然后點擊查看兩個接口中我們抓到的headers

 我們可以很清楚的看到,兩個接口除了ids這個字段的值不一樣,其他的東西都是一樣的。我們可以雙擊打開這兩個接口,就會發現里面返回的內容正好是我們想要的東西,而且還是json格式,簡直不要太方便啊。那么接下來就可以通過接口去訪問以下這個接口,進行嘗試。

import requests
import json
headers = {
"host":"www.vip.com",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.933.400 QQBrowser/9.4.8699.400",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
}
ssesion = requests.session()
url1 = "http://www.vip.com/index-ajax.php?act=getSellingBrandListV5&warehouse=VIP_NH&areaCode=104104&channelId=0&"
url2 = "&pagecode=a&sortType=1&province_name=%E5%B9%BF%E4%B8%9C&city_name=%E6%B7%B1%E5%9C%B3%E5%B8%82&preview=&sell_time_from=&time_from="
def get_classify():

url =url1+"ids="+str(2)+url2
responed = ssesion.get(url,headers=headers).text
response = json.loads(responed)
print(response)
get_classify()
運行之后結果如下

OK,我們的到了這個,然后怎么去獲得品牌和鏈接呢?似乎難度不小

首先我要看一下這個到底是什么數據類型,才可以知道接下來怎么操作才能得到我需要的內容。

使用print(type(response))來檢查數據類型。

我們可以看到結果是

字典類型的數據。很好,知道了數據類型,接下來我們來看看到底是個幾層的字典。

使用print(len(response))

我們可以看到

好吧,是一個三層的嵌套的字典。那么就好辦了。json的解析,必須是像剝洋蔥一樣,一層一層的去解析,這點比較苦逼,不過也不是沒有辦法。

我這里是通過取key的值,一步一步的剝離到了里面。

data = response['data']
floors = data['floors']
加入這兩行之后,再打印floors看看我們得到了一個什么東西

已經剝離出了外面的兩層字典。我們查找一下,會發現我們需要的品牌名稱和鏈接,是在這個字典的一個叫items的數組中。

items = floors[str(2)]["items"]
for i in items:
print(i["name"], i["link"])
我們通過上面的第一句,去獲得這個字典中的key為items的內容,也就是剛才說的那個items的數組,然后使用一個for循環,遍歷數組,打印出數組中的name和link對應的值。
運行一下,看看結果:
對照着唯品會首頁的第二個分類檢查一下,似乎品牌都沒有錯呢。點擊各個鏈接也都能正常的跳轉過去。

這里已經實現,那么接下來就來完成對前7個分類的品牌及鏈接的爬取就很簡單了:

import requests
import json
headers = {
"host":"www.vip.com",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.933.400 QQBrowser/9.4.8699.400",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
}
ssesion = requests.session()
url1 = "http://www.vip.com/index-ajax.php?act=getSellingBrandListV5&warehouse=VIP_NH&areaCode=104104&channelId=0&"
url2 = "&pagecode=a&sortType=1&province_name=%E5%B9%BF%E4%B8%9C&city_name=%E6%B7%B1%E5%9C%B3%E5%B8%82&preview=&sell_time_from=&time_from="
def get_classify():
for i in range(1,8):
url =url1+"ids="+str(i)+url2
responed = ssesion.get(url,headers=headers).text
response = json.loads(responed)
data = response['data']
# print(len(response))
#分層解析json數據
floors = data['floors']
# print(floors)
items = floors[str(i)]["items"]
#遍歷items打印出店鋪名字和url
for i in items:
print(i["name"],i["link"])

get_classify()
就像我們前面講到的,這些接口也僅僅只是ids的字段不同,而且還是有序的。所以在這里,我就利用一個循環和range()方法來實現對前七個分類商品的接口的訪問。

爬取唯品會的這一段小代碼里,最難的應該就是json的解析。當然僅僅是對我來說哈,畢竟菜雞一枚。json的數據解析也算是入門的最基礎的東西了,也希望大家都能記住哈,這個解析必須一層一層的來。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM