?

基于Python的電商網站服裝數據的爬取與分析

2022-08-02 01:40陳廣智劉伴晨曾天佑魏欣欣
計算機技術與發展 2022年7期
關鍵詞:女裝連衣裙頁面

陳廣智,曾 霖,劉伴晨,曾天佑,魏欣欣

(1.鄭州航空工業管理學院 智能工程學院,河南 鄭州 450046; 2.賀州學院 人工智能學院,廣西 賀州 542899)

0 引 言

隨著電子商務的快速發展,電商網站迅速增加,隨之而來網絡購物成為趨勢。網絡購物帶給商家和消費者的一個挑戰是信息過載問題。面對電商網站上的大量數據,商家和消費者會迷茫,不能做出理性選擇。為解決此問題,網絡爬取(web crawling)[1-2],又稱為數據自動采集,被提出來并得到迅速發展。因發布在電商網站上的數據被認為是公開的,所以對其上大量網頁信息的爬取是允許的[3]。此外,中國的紡織服裝產業消費市場非常大[4]。因此,該文主要聚集于電商網站上服裝數據的爬取與分析。

服裝,尤其女裝,是一個巨大的產業。電商網站,比如京東、亞馬遜等,其上的服裝銷售數據真實反映了服裝消費趨勢。對電商網站上的服裝數據進行爬取和分析,對商家來說,有利于他們根據分析出的消費趨勢更精準地投放產品;對消費者來說,有利于節省他們大量的網上商品瀏覽時間,快速地得到當前消費熱點,其中的價格分析也有利于他們更理性地消費。

有的工作[5]提供了服裝圖片數據集,以便于對服裝圖片數據的分析研究[6]。但這些圖片數據不具時效性。利用爬取技術能隨時獲取當前最新服裝數據,便于及時發現和挖掘當前服裝流行趨勢和銷售熱點,具有較強的時效性。該文爬取的服裝商品數據包括商品的描述、價格及圖片等信息,與此相對應,對服裝數據的分析包括描述的文本分析、價格分析及圖片分析。

1 相關工作

該文不僅涉及到網絡爬取,還涉及到數據的分析,因此,本節將介紹網絡爬取、數據分析的背景信息。

1.1 網絡爬取

網絡爬取,也被稱為網絡采集(web harvesting)、網絡數據抽取(web data extraction)或網絡數據挖掘(web data mining),指的是對一個智能體(agent)的構造,該智能體能以自動化的方式從網絡上下載、解析和組織數據[7]。網絡爬取已廣泛應用在多個領域,包括社會科學[8]、醫療健康[9-10]、電子商務[11]、農業市場[12]、司法[13]、教育[3,14]和公共交通[15]等。

萬維網(WWW)提供了不同格式、不同來源的大量信息。在很多情況下,它往往是唯一的信息來源。然而,從網絡上提取信息是非常困難的,其中一個主要難點是如何自動檢測出感興趣的對象,并將它們以統一的格式保存在數據庫中[16]。該文對服裝數據的爬取是采用人工方法確定待爬取的服裝信息HTML標簽(tag)定位,然后將這些定位信息(解析規則)寫入爬取程序中,即采用的是手工開發爬取器的方法。

若一個網站提供了API(application programming interface),則可用其API直接獲取數據。但該方法存在接口提供的數據不是所需、限時限量、收費等缺點。實際上大部分網站不提供API,僅提供公開訪問的HTML頁面。理論上,利用網站API獲取數據的方法不屬于網絡爬取??捎枚喾N不同的語言,例如,C/C++、PHP、Python、Node.js、R或Java,直接訪問并獲取網站的HTML代碼。

1.2 t-SNE算法

t分布隨機鄰域嵌入算法(t-distributed stochastic neighbor embedding,t-SNE)[17]是Maaten等人于2008年根據SNE算法進行改進而提出的新算法。它將高維數據映射到二維或三維空間從而可視化高維數據,因此,可用于對數據降維和可視化[18]。

t-SNE算法是用高斯核函數計算高維聯合概率,得到高維相似度距離,通過t-分布核函數定義低維空間內嵌入樣本的相似度,并用梯度下降法進行KL散度(Kullback-Leibler divergence)的尋優計算,從而找到原高維空間和嵌入低維空間內盡可能相近的聯合概率分布[19]。

該文采用t-SNE算法對爬取的服裝圖片數據進行聚類并可視化。

2 服裝數據的爬取

2.1 爬取方法設計

利用網頁瀏覽器對一些電商網站上的服裝數據進行人工分析,可知:要得到服裝數據,需在搜索文本框中輸入搜索關鍵詞;返回的頁面結果通常是分頁顯示的服裝商品列表。例如,在京東網站上的搜索文本框中輸入關鍵詞“連衣裙女裝新品”,則返回的頁面如圖1所示。

圖1 京東網站搜索案例

為此,設計了針對電商網站服裝數據爬取的算法fashionDataScrape(fkw,n),如算法1所示。該算法的輸入為搜索關鍵詞fkw及要爬取的頁面數量n,其中fkw被限制為服裝類的詞,如“連衣裙女裝新品”、“禮服”、“旗袍”等。有的電商網站,如京東網站,對返回的頁面數有限制,其為100;而有的,如淘寶,沒在返回頁面顯式給出頁數,但可通過修改URL(uniform resource locator)中的查詢字符串(query string)中的查詢參數pnum的值,試探出返回的頁面數。為統一處理上述情況,將爬取的頁面數n作為算法的輸入,由用戶爬取數據時提供。由圖1可知,搜索返回頁面中,每個服裝商品包含圖片、價格、描述、評價、所屬商店、是否折扣等信息。為簡化分析和討論,該算法僅抓取服裝商品的圖片、描述、價格等信息。因此,算法的輸出中,列表resList元素中含商品描述(desc)、價格(price)、圖片網址(url)和id(用圖片名稱代替),圖片集合images包含所有對應于resList中url的圖片。該算法是基于關鍵詞的爬取算法,是聚焦爬取方法(focused crawler)[20]的一種。

算法1:服裝數據爬取算法fashionDataScrape(fkw,n)

輸入:服裝關鍵詞fkw;爬取的頁面數量n

輸出:列表resList,其中元素為(id, desc, price, url);與resList中url對應的服裝圖片數據集合images

1 fori←1 tondo

2 訪問與fkw對應的第i個頁面page(fkw,i);

3 解析page(fkw,i),找出其含的服裝商品數量m;

4 forj←1 tomdo

5 抓取頁面page(fkw,i) 中第j個商品信息(idj, descj, pricej, urlj) ;

6 將(idj, descj, pricej, urlj)添加到列表resList中;

7 end

8 end

9 for (idj, descj, pricej, urlj) ∈resList do

10 下載與urlj對應的服裝圖片imagej;

11 將圖片imagej添加到集合images中

12 end

13 return reslist,images

算法中,page(fkw,i)指的是查詢關鍵詞fkw返回的第i個HTML頁面。該算法分為2部分,第1部分對應算法1-8行,依次訪問每個頁面page(fkw,i)(i≤n),提取出其中的所有服裝商品信息并將它們加入到列表resList中;第2部分對應算法9-12行,從列表resList中逐個讀出每個服裝商品的圖片URL,然后下載該圖片,并將其添加到圖片集合images中。

為以模塊化的方式實現該算法,設計了一個詳細類圖,如圖2所示。

圖2 算法fashionDataScrape(fkw,n)的詳細設計類圖

2.2 爬取實現分析

本節將分析如何用Python語言[1]實現上述算法,并給出關鍵代碼。由于不同的電商網站所用關于服裝信息的HTML代碼可能不同,所以該算法實現僅以京東網站為例,具體基礎網址為https://search.jd.com/Search。選擇京東網站的原因是,其具備一定的反惡意爬取措施,且每次搜索能保證返回6 000個服裝商品信息,而淘寶則不能做到這一點。對于國外的服裝類電商網站,比如Zalando,同理。

2.2.1 實現所用的Python庫(Library)

實現該算法時需用一些Python第三方庫,其中主要的庫如下:

●Requests庫。用于向網站發送HTTP請求,以獲取網頁HTML代碼。獲取的原始HTML代碼可用于進一步解析。該庫還便于偽裝瀏覽器、設置請求參數等,是一個簡潔、易用、非常人性化的庫。該文所用版本為2.24.0。

●Beautiful Soup庫。用于從HTML或XML代碼中抽取有用的信息。它提供了易用的接口用于查找、定位HTML元素。在命令行中可用“pip install beautifulsoup4”安裝該庫。該文所用版本為4.9.1。

實現代碼中還用到了urllib.parse、random、time、xlwt及pandas等庫,在此不再介紹。此外,該文采用lxml作為HTML解析器。

2.2.2 關鍵代碼介紹

類FashionSpider負責某個頁面page(fkw,i)的服裝信息爬取。因京東網站采用判別瀏覽器頭的反爬取技術,需設置requests的“User-Agent”以進行瀏覽器偽裝。同時,還需設定URL中查詢字符串中的參數,以方便傳入用戶的服裝搜索關鍵詞。這些參數名稱可通過觀察京東網站查詢網址的變動規律得到。該類的構造函數代碼如下:

class FashionSpider:

def __init__(self, searchStr, n=0):

self.url = 'https://search.jd.com/Search'

self.myParams = {"keyword":searchStr,

"qrst":"1",

"zx":"1",

"page":str(n),

"click":"0"}

self.myHeaders = {

"Host":"search.jd.com",

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)

AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/84.0.4147.135 Safari/537.36"}

self.result = [] # 用于保存本頁面的爬取結果

其中,函數參數searchStr為查詢關鍵詞,n代表第n個頁面。函數體內self.myParams是一些頁面查詢參數設置,相關值根據京東網站查詢網址的變動規律而得。

抓取某個服裝商品的ID(用圖片名稱代替)、價格、描述和圖片網址,需手工確定這些信息的HTML元素定位,以便于用Beautiful Soup書寫解析代碼。確定HTML元素定位的一個簡便方法是利用Chrome瀏覽器的開發者工具,在頁面某個服裝商品上右擊,然后在出現的快捷菜單上單擊“檢查”,即可調出HTML元素定位。由此,類FashionSpider中負責對某個服裝商品信息解析抓取的方法fetchImgInfo的代碼為:

def fetchImgInfo(self, liText):

divImag = liText.find("div",class_="p-img").find("a").find("img")

imgSrc = divImag["data-lazy-img"]

imgSrc = imgSrc.strip()

imgUrl = "https:" + imgSrc

imgID = urlparse(imgUrl).path.split('/')[-1]

imgID = imgID[:-4]

price = liText.find("div", class_="p-price").find("i").string

priceStr = str(price)

desc = liText.find("div", class_="p-name").a.get_text()

desc = desc.strip()

return (imgID, desc, priceStr, imgUrl)

其中,函數參數liText為某個服裝商品的HTML代碼。

類FashionSpider還需一個函數,用于抓取該頁面所有服裝商品的信息,它需調用函數fetchImgInfo。其代碼如下:

def fetchImgsInfo(self, bs):

divGoodList = bs.find('div',id="J_goodsList")

ul = divGoodList.find("ul")

lis = ul.find_all('li',recursive=False)

for i, li in enumerate(lis):

res =self.fetchImgInfo(li)

self.result.append(res)

其中,函數參數bs為Beautiful Soup對象。

類FashionCrawler負責對多個頁面服裝商品信息的抓取,其用到了類FashionSpider,代碼如下:

class FashionCrawler:

def __init__(self, searchStr, n=3):

self.fSpiders = []

for i in range(1, n+1):

self.fSpiders.append(FashionSpider(searchStr, i))

self.result = [] # 用于存放所有頁面的爬取結果

def startCrawling(self):

for i, fs in enumerate(self.fSpiders):

print(' Crawl Page: ' + str(i))

time.sleep(random.randint(15,25)) #不要抓那么快

fs.scrapeImgPage()

self.result.extend(fs.result)

print("page:" + str(i) + " Finish")

其中,__init__函數參數searchStr為查詢關鍵詞,n為頁面總數。

2.3 爬取結果

為驗證爬取算法fashionDataScrape的有效性,利用上述實現算法的程序,以“連衣裙女裝新品”為搜索關鍵詞,同時設置n=50(由于每個頁面30條商品數據,故爬取了1 500條商品數據),爬取到的服裝商品信息如表1所示。由于爬取到的服裝商品信息較多,為節省空間,表1僅給出了2條服裝商品的信息。其中,id、desc、price和url的含義請參見前述列表resList元素的講解。

表1 以“連衣裙女裝新品”為關鍵詞爬取到的服裝信息(部分)

與上述爬取到的服裝商品信息相對應的爬取到的服裝圖片信息如圖3所示。根據這些爬取結果,結合手工對相關頁面驗證,可知,提出的爬取算法fashionDataScrape是可行的和有效的。

圖3 以“連衣裙女裝新品”為關鍵詞爬取到的服裝商品圖片信息(部分)

3 服裝數據的分析

本節將分析抓取到的服裝數據,所分析的數據為:以“連衣裙女裝新品”、“女裝t恤”和“旗袍年輕版”為關鍵詞分別抓取到的1 500條服裝商品數據,抓取時間2021年6月14日。

3.1 描述數據分析

以關鍵詞“連衣裙女裝新品”的1 500條服裝商品數據為例,對這些商品的描述信息詞云進行分析。首先需對這些描述文本進行預處理,包括:去除重復描述;去除折扣、優惠信息;去除退換、免郵信息等,僅保留品牌描述相關信息。然后,利用Python的jieba庫對描述文本分詞。分詞時,去除了一些停用詞,這些詞對商品的品牌分析關系不大,例如,“的”、“下單”和“請”等。分詞時發現,jieba庫不能對服裝專業品牌詞進行很好地分詞。因此,自定義了一個服裝品牌詞典,并將其導入到jieba庫中。該詞典共包含101個詞,其中絕大部分為服裝品牌專有詞,例如,“拉夏貝爾”、“萊倪晟納”等。最后,得到的這1 500條服裝商品描述的詞云如圖4所示。從圖中可看出女裝連衣裙的一些流行趨勢:中長款、短袖、韓版的居多,M、L號的比較多,品牌以“拉夏貝爾”、“萊倪晟納”的居多等。

圖4 以“連衣裙女裝新品”為關鍵詞爬取到的1 500條服裝商品描述信息詞云

對于以“女裝t恤”、“旗袍年輕版”為關鍵詞抓取的各自1 500條服裝商品描述信息,可采用上述類似方法進行詞云分析。

3.2 價格數據分析

對以“連衣裙女裝新品”、“女裝t恤”和“旗袍年輕版”為關鍵詞抓取的各自1 500條服裝商品價格信息,繪制了它們的箱線圖(Boxplot),如圖5所示,以對比分析這三類商品的價格趨勢。從圖中可看出,大部分“女裝t恤”(75%)的價格低于“連衣裙女裝新品”,而“連衣裙女裝新品”又低于“旗袍年輕版”;“旗袍年輕版”高端價位(異常值)的商品數量最多,“連衣裙女裝新品”次之,而“女裝t恤”的則最少;但是,三者最低價位中,“連衣裙女裝新品”為最高。

圖5 以三種不同關鍵詞爬取得到的各自1 500條商品價格的趨勢對比

3.3 圖片可視化分析

為展示t-SNE算法對爬取到的服裝圖片數據的聚類、可視化效果,從上述爬取到的三類關鍵詞服裝圖片中分別隨機選取250張,得到含有“連衣裙”、“女裝t恤”和“旗袍”的共750張圖片,對這750張混雜類別的圖片進行t-SNE聚類、可視化分析,結果如圖6所示。

圖6 對含有“連衣裙”、“女裝t恤”和“旗袍”的750張圖片的t-SNE可視化結果

圖中每個圖片的坐標對應各自的t-SNE位置。從圖6可看出,t-SNE算法依據色彩的飽和度、強度聚類,并將服裝圖片放置于圖6中的相應坐標位置;但是,它沒有按服裝款式聚類。上述t-SNE聚類為根據服裝色彩對顧客進行服裝商品推薦奠定了基礎。

4 結束語

為及時準確地獲取當前服裝產品的流行趨勢、消費熱點,提出了針對電商網站服裝數據爬取的算法fashionDataScrape。為提高爬取的靈活性,該算法首先爬取服裝商品的描述、價格及圖片網址等文字信息;然后,再利用前述圖片網址爬取相應的服裝圖片信息,做到了文字信息和圖片信息爬取的相分離。為驗證算法的可行性和有效性,用Python語言實現了該算法,其中主要用到的庫為Requests和Beautiful Soup。利用該算法實現,以“連衣裙女裝新品”、“女裝t恤”和“旗袍年輕版”為關鍵詞,共爬取了京東網站上4 500條服裝商品信息,包括圖片信息。針對這些爬取結果,分別對它們進行了商品描述分析、價格分析和圖片的t-SNE聚類可視化分析。從對服裝數據的分析結果來看,進一步驗證了電商網站服裝數據爬取的意義。

猜你喜歡
女裝連衣裙頁面
答案
讓Word同時擁有橫向頁和縱向頁
家教“漫”鏡頭
長袍連衣裙
長袍連衣裙
長袍連衣裙
2017年春夏男裝周的女裝風景
連衣裙之廓形對比戰
日“男扮女裝犯罪”增多
驅動器頁面文件大小的總數為何總是07
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合