陳廣智,曾 霖,劉伴晨,曾天佑,魏欣欣
(1.鄭州航空工業(yè)管理學(xué)院 智能工程學(xué)院,河南 鄭州 450046; 2.賀州學(xué)院 人工智能學(xué)院,廣西 賀州 542899)
隨著電子商務(wù)的快速發(fā)展,電商網(wǎng)站迅速增加,隨之而來(lái)網(wǎng)絡(luò)購(gòu)物成為趨勢(shì)。網(wǎng)絡(luò)購(gòu)物帶給商家和消費(fèi)者的一個(gè)挑戰(zhàn)是信息過(guò)載問(wèn)題。面對(duì)電商網(wǎng)站上的大量數(shù)據(jù),商家和消費(fèi)者會(huì)迷茫,不能做出理性選擇。為解決此問(wèn)題,網(wǎng)絡(luò)爬取(web crawling)[1-2],又稱為數(shù)據(jù)自動(dòng)采集,被提出來(lái)并得到迅速發(fā)展。因發(fā)布在電商網(wǎng)站上的數(shù)據(jù)被認(rèn)為是公開(kāi)的,所以對(duì)其上大量網(wǎng)頁(yè)信息的爬取是允許的[3]。此外,中國(guó)的紡織服裝產(chǎn)業(yè)消費(fèi)市場(chǎng)非常大[4]。因此,該文主要聚集于電商網(wǎng)站上服裝數(shù)據(jù)的爬取與分析。
服裝,尤其女裝,是一個(gè)巨大的產(chǎn)業(yè)。電商網(wǎng)站,比如京東、亞馬遜等,其上的服裝銷售數(shù)據(jù)真實(shí)反映了服裝消費(fèi)趨勢(shì)。對(duì)電商網(wǎng)站上的服裝數(shù)據(jù)進(jìn)行爬取和分析,對(duì)商家來(lái)說(shuō),有利于他們根據(jù)分析出的消費(fèi)趨勢(shì)更精準(zhǔn)地投放產(chǎn)品;對(duì)消費(fèi)者來(lái)說(shuō),有利于節(jié)省他們大量的網(wǎng)上商品瀏覽時(shí)間,快速地得到當(dāng)前消費(fèi)熱點(diǎn),其中的價(jià)格分析也有利于他們更理性地消費(fèi)。
有的工作[5]提供了服裝圖片數(shù)據(jù)集,以便于對(duì)服裝圖片數(shù)據(jù)的分析研究[6]。但這些圖片數(shù)據(jù)不具時(shí)效性。利用爬取技術(shù)能隨時(shí)獲取當(dāng)前最新服裝數(shù)據(jù),便于及時(shí)發(fā)現(xiàn)和挖掘當(dāng)前服裝流行趨勢(shì)和銷售熱點(diǎn),具有較強(qiáng)的時(shí)效性。該文爬取的服裝商品數(shù)據(jù)包括商品的描述、價(jià)格及圖片等信息,與此相對(duì)應(yīng),對(duì)服裝數(shù)據(jù)的分析包括描述的文本分析、價(jià)格分析及圖片分析。
該文不僅涉及到網(wǎng)絡(luò)爬取,還涉及到數(shù)據(jù)的分析,因此,本節(jié)將介紹網(wǎng)絡(luò)爬取、數(shù)據(jù)分析的背景信息。
網(wǎng)絡(luò)爬取,也被稱為網(wǎng)絡(luò)采集(web harvesting)、網(wǎng)絡(luò)數(shù)據(jù)抽取(web data extraction)或網(wǎng)絡(luò)數(shù)據(jù)挖掘(web data mining),指的是對(duì)一個(gè)智能體(agent)的構(gòu)造,該智能體能以自動(dòng)化的方式從網(wǎng)絡(luò)上下載、解析和組織數(shù)據(jù)[7]。網(wǎng)絡(luò)爬取已廣泛應(yīng)用在多個(gè)領(lǐng)域,包括社會(huì)科學(xué)[8]、醫(yī)療健康[9-10]、電子商務(wù)[11]、農(nóng)業(yè)市場(chǎng)[12]、司法[13]、教育[3,14]和公共交通[15]等。
萬(wàn)維網(wǎng)(WWW)提供了不同格式、不同來(lái)源的大量信息。在很多情況下,它往往是唯一的信息來(lái)源。然而,從網(wǎng)絡(luò)上提取信息是非常困難的,其中一個(gè)主要難點(diǎn)是如何自動(dòng)檢測(cè)出感興趣的對(duì)象,并將它們以統(tǒng)一的格式保存在數(shù)據(jù)庫(kù)中[16]。該文對(duì)服裝數(shù)據(jù)的爬取是采用人工方法確定待爬取的服裝信息HTML標(biāo)簽(tag)定位,然后將這些定位信息(解析規(guī)則)寫入爬取程序中,即采用的是手工開(kāi)發(fā)爬取器的方法。
若一個(gè)網(wǎng)站提供了API(application programming interface),則可用其API直接獲取數(shù)據(jù)。但該方法存在接口提供的數(shù)據(jù)不是所需、限時(shí)限量、收費(fèi)等缺點(diǎn)。實(shí)際上大部分網(wǎng)站不提供API,僅提供公開(kāi)訪問(wèn)的HTML頁(yè)面。理論上,利用網(wǎng)站API獲取數(shù)據(jù)的方法不屬于網(wǎng)絡(luò)爬取??捎枚喾N不同的語(yǔ)言,例如,C/C++、PHP、Python、Node.js、R或Java,直接訪問(wèn)并獲取網(wǎng)站的HTML代碼。
t分布隨機(jī)鄰域嵌入算法(t-distributed stochastic neighbor embedding,t-SNE)[17]是Maaten等人于2008年根據(jù)SNE算法進(jìn)行改進(jìn)而提出的新算法。它將高維數(shù)據(jù)映射到二維或三維空間從而可視化高維數(shù)據(jù),因此,可用于對(duì)數(shù)據(jù)降維和可視化[18]。
t-SNE算法是用高斯核函數(shù)計(jì)算高維聯(lián)合概率,得到高維相似度距離,通過(guò)t-分布核函數(shù)定義低維空間內(nèi)嵌入樣本的相似度,并用梯度下降法進(jìn)行KL散度(Kullback-Leibler divergence)的尋優(yōu)計(jì)算,從而找到原高維空間和嵌入低維空間內(nèi)盡可能相近的聯(lián)合概率分布[19]。
該文采用t-SNE算法對(duì)爬取的服裝圖片數(shù)據(jù)進(jìn)行聚類并可視化。
利用網(wǎng)頁(yè)瀏覽器對(duì)一些電商網(wǎng)站上的服裝數(shù)據(jù)進(jìn)行人工分析,可知:要得到服裝數(shù)據(jù),需在搜索文本框中輸入搜索關(guān)鍵詞;返回的頁(yè)面結(jié)果通常是分頁(yè)顯示的服裝商品列表。例如,在京東網(wǎng)站上的搜索文本框中輸入關(guān)鍵詞“連衣裙女裝新品”,則返回的頁(yè)面如圖1所示。
圖1 京東網(wǎng)站搜索案例
為此,設(shè)計(jì)了針對(duì)電商網(wǎng)站服裝數(shù)據(jù)爬取的算法fashionDataScrape(fkw,n),如算法1所示。該算法的輸入為搜索關(guān)鍵詞fkw及要爬取的頁(yè)面數(shù)量n,其中fkw被限制為服裝類的詞,如“連衣裙女裝新品”、“禮服”、“旗袍”等。有的電商網(wǎng)站,如京東網(wǎng)站,對(duì)返回的頁(yè)面數(shù)有限制,其為100;而有的,如淘寶,沒(méi)在返回頁(yè)面顯式給出頁(yè)數(shù),但可通過(guò)修改URL(uniform resource locator)中的查詢字符串(query string)中的查詢參數(shù)pnum的值,試探出返回的頁(yè)面數(shù)。為統(tǒng)一處理上述情況,將爬取的頁(yè)面數(shù)n作為算法的輸入,由用戶爬取數(shù)據(jù)時(shí)提供。由圖1可知,搜索返回頁(yè)面中,每個(gè)服裝商品包含圖片、價(jià)格、描述、評(píng)價(jià)、所屬商店、是否折扣等信息。為簡(jiǎn)化分析和討論,該算法僅抓取服裝商品的圖片、描述、價(jià)格等信息。因此,算法的輸出中,列表resList元素中含商品描述(desc)、價(jià)格(price)、圖片網(wǎng)址(url)和id(用圖片名稱代替),圖片集合images包含所有對(duì)應(yīng)于resList中url的圖片。該算法是基于關(guān)鍵詞的爬取算法,是聚焦爬取方法(focused crawler)[20]的一種。
算法1:服裝數(shù)據(jù)爬取算法fashionDataScrape(fkw,n)
輸入:服裝關(guān)鍵詞fkw;爬取的頁(yè)面數(shù)量n
輸出:列表resList,其中元素為(id, desc, price, url);與resList中url對(duì)應(yīng)的服裝圖片數(shù)據(jù)集合images
1 fori←1 tondo
2 訪問(wèn)與fkw對(duì)應(yīng)的第i個(gè)頁(yè)面page(fkw,i);
3 解析page(fkw,i),找出其含的服裝商品數(shù)量m;
4 forj←1 tomdo
5 抓取頁(yè)面page(fkw,i) 中第j個(gè)商品信息(idj, descj, pricej, urlj) ;
6 將(idj, descj, pricej, urlj)添加到列表resList中;
7 end
8 end
9 for (idj, descj, pricej, urlj) ∈resList do
10 下載與urlj對(duì)應(yīng)的服裝圖片imagej;
11 將圖片imagej添加到集合images中
12 end
13 return reslist,images
算法中,page(fkw,i)指的是查詢關(guān)鍵詞fkw返回的第i個(gè)HTML頁(yè)面。該算法分為2部分,第1部分對(duì)應(yīng)算法1-8行,依次訪問(wèn)每個(gè)頁(yè)面page(fkw,i)(i≤n),提取出其中的所有服裝商品信息并將它們加入到列表resList中;第2部分對(duì)應(yīng)算法9-12行,從列表resList中逐個(gè)讀出每個(gè)服裝商品的圖片URL,然后下載該圖片,并將其添加到圖片集合images中。
為以模塊化的方式實(shí)現(xiàn)該算法,設(shè)計(jì)了一個(gè)詳細(xì)類圖,如圖2所示。
圖2 算法fashionDataScrape(fkw,n)的詳細(xì)設(shè)計(jì)類圖
本節(jié)將分析如何用Python語(yǔ)言[1]實(shí)現(xiàn)上述算法,并給出關(guān)鍵代碼。由于不同的電商網(wǎng)站所用關(guān)于服裝信息的HTML代碼可能不同,所以該算法實(shí)現(xiàn)僅以京東網(wǎng)站為例,具體基礎(chǔ)網(wǎng)址為https://search.jd.com/Search。選擇京東網(wǎng)站的原因是,其具備一定的反惡意爬取措施,且每次搜索能保證返回6 000個(gè)服裝商品信息,而淘寶則不能做到這一點(diǎn)。對(duì)于國(guó)外的服裝類電商網(wǎng)站,比如Zalando,同理。
2.2.1 實(shí)現(xiàn)所用的Python庫(kù)(Library)
實(shí)現(xiàn)該算法時(shí)需用一些Python第三方庫(kù),其中主要的庫(kù)如下:
●Requests庫(kù)。用于向網(wǎng)站發(fā)送HTTP請(qǐng)求,以獲取網(wǎng)頁(yè)HTML代碼。獲取的原始HTML代碼可用于進(jìn)一步解析。該庫(kù)還便于偽裝瀏覽器、設(shè)置請(qǐng)求參數(shù)等,是一個(gè)簡(jiǎn)潔、易用、非常人性化的庫(kù)。該文所用版本為2.24.0。
●Beautiful Soup庫(kù)。用于從HTML或XML代碼中抽取有用的信息。它提供了易用的接口用于查找、定位HTML元素。在命令行中可用“pip install beautifulsoup4”安裝該庫(kù)。該文所用版本為4.9.1。
實(shí)現(xiàn)代碼中還用到了urllib.parse、random、time、xlwt及pandas等庫(kù),在此不再介紹。此外,該文采用lxml作為HTML解析器。
2.2.2 關(guān)鍵代碼介紹
類FashionSpider負(fù)責(zé)某個(gè)頁(yè)面page(fkw,i)的服裝信息爬取。因京東網(wǎng)站采用判別瀏覽器頭的反爬取技術(shù),需設(shè)置requests的“User-Agent”以進(jìn)行瀏覽器偽裝。同時(shí),還需設(shè)定URL中查詢字符串中的參數(shù),以方便傳入用戶的服裝搜索關(guān)鍵詞。這些參數(shù)名稱可通過(guò)觀察京東網(wǎng)站查詢網(wǎng)址的變動(dòng)規(guī)律得到。該類的構(gòu)造函數(shù)代碼如下:
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 = [] # 用于保存本頁(yè)面的爬取結(jié)果
其中,函數(shù)參數(shù)searchStr為查詢關(guān)鍵詞,n代表第n個(gè)頁(yè)面。函數(shù)體內(nèi)self.myParams是一些頁(yè)面查詢參數(shù)設(shè)置,相關(guān)值根據(jù)京東網(wǎng)站查詢網(wǎng)址的變動(dòng)規(guī)律而得。
抓取某個(gè)服裝商品的ID(用圖片名稱代替)、價(jià)格、描述和圖片網(wǎng)址,需手工確定這些信息的HTML元素定位,以便于用Beautiful Soup書寫解析代碼。確定HTML元素定位的一個(gè)簡(jiǎn)便方法是利用Chrome瀏覽器的開(kāi)發(fā)者工具,在頁(yè)面某個(gè)服裝商品上右擊,然后在出現(xiàn)的快捷菜單上單擊“檢查”,即可調(diào)出HTML元素定位。由此,類FashionSpider中負(fù)責(zé)對(duì)某個(gè)服裝商品信息解析抓取的方法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)
其中,函數(shù)參數(shù)liText為某個(gè)服裝商品的HTML代碼。
類FashionSpider還需一個(gè)函數(shù),用于抓取該頁(yè)面所有服裝商品的信息,它需調(diào)用函數(shù)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)
其中,函數(shù)參數(shù)bs為Beautiful Soup對(duì)象。
類FashionCrawler負(fù)責(zé)對(duì)多個(gè)頁(yè)面服裝商品信息的抓取,其用到了類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 = [] # 用于存放所有頁(yè)面的爬取結(jié)果
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__函數(shù)參數(shù)searchStr為查詢關(guān)鍵詞,n為頁(yè)面總數(shù)。
為驗(yàn)證爬取算法fashionDataScrape的有效性,利用上述實(shí)現(xiàn)算法的程序,以“連衣裙女裝新品”為搜索關(guān)鍵詞,同時(shí)設(shè)置n=50(由于每個(gè)頁(yè)面30條商品數(shù)據(jù),故爬取了1 500條商品數(shù)據(jù)),爬取到的服裝商品信息如表1所示。由于爬取到的服裝商品信息較多,為節(jié)省空間,表1僅給出了2條服裝商品的信息。其中,id、desc、price和url的含義請(qǐng)參見(jiàn)前述列表resList元素的講解。
表1 以“連衣裙女裝新品”為關(guān)鍵詞爬取到的服裝信息(部分)
與上述爬取到的服裝商品信息相對(duì)應(yīng)的爬取到的服裝圖片信息如圖3所示。根據(jù)這些爬取結(jié)果,結(jié)合手工對(duì)相關(guān)頁(yè)面驗(yàn)證,可知,提出的爬取算法fashionDataScrape是可行的和有效的。
圖3 以“連衣裙女裝新品”為關(guān)鍵詞爬取到的服裝商品圖片信息(部分)
本節(jié)將分析抓取到的服裝數(shù)據(jù),所分析的數(shù)據(jù)為:以“連衣裙女裝新品”、“女裝t恤”和“旗袍年輕版”為關(guān)鍵詞分別抓取到的1 500條服裝商品數(shù)據(jù),抓取時(shí)間2021年6月14日。
以關(guān)鍵詞“連衣裙女裝新品”的1 500條服裝商品數(shù)據(jù)為例,對(duì)這些商品的描述信息詞云進(jìn)行分析。首先需對(duì)這些描述文本進(jìn)行預(yù)處理,包括:去除重復(fù)描述;去除折扣、優(yōu)惠信息;去除退換、免郵信息等,僅保留品牌描述相關(guān)信息。然后,利用Python的jieba庫(kù)對(duì)描述文本分詞。分詞時(shí),去除了一些停用詞,這些詞對(duì)商品的品牌分析關(guān)系不大,例如,“的”、“下單”和“請(qǐng)”等。分詞時(shí)發(fā)現(xiàn),jieba庫(kù)不能對(duì)服裝專業(yè)品牌詞進(jìn)行很好地分詞。因此,自定義了一個(gè)服裝品牌詞典,并將其導(dǎo)入到j(luò)ieba庫(kù)中。該詞典共包含101個(gè)詞,其中絕大部分為服裝品牌專有詞,例如,“拉夏貝爾”、“萊倪晟納”等。最后,得到的這1 500條服裝商品描述的詞云如圖4所示。從圖中可看出女裝連衣裙的一些流行趨勢(shì):中長(zhǎng)款、短袖、韓版的居多,M、L號(hào)的比較多,品牌以“拉夏貝爾”、“萊倪晟納”的居多等。
圖4 以“連衣裙女裝新品”為關(guān)鍵詞爬取到的1 500條服裝商品描述信息詞云
對(duì)于以“女裝t恤”、“旗袍年輕版”為關(guān)鍵詞抓取的各自1 500條服裝商品描述信息,可采用上述類似方法進(jìn)行詞云分析。
對(duì)以“連衣裙女裝新品”、“女裝t恤”和“旗袍年輕版”為關(guān)鍵詞抓取的各自1 500條服裝商品價(jià)格信息,繪制了它們的箱線圖(Boxplot),如圖5所示,以對(duì)比分析這三類商品的價(jià)格趨勢(shì)。從圖中可看出,大部分“女裝t恤”(75%)的價(jià)格低于“連衣裙女裝新品”,而“連衣裙女裝新品”又低于“旗袍年輕版”;“旗袍年輕版”高端價(jià)位(異常值)的商品數(shù)量最多,“連衣裙女裝新品”次之,而“女裝t恤”的則最少;但是,三者最低價(jià)位中,“連衣裙女裝新品”為最高。
圖5 以三種不同關(guān)鍵詞爬取得到的各自1 500條商品價(jià)格的趨勢(shì)對(duì)比
為展示t-SNE算法對(duì)爬取到的服裝圖片數(shù)據(jù)的聚類、可視化效果,從上述爬取到的三類關(guān)鍵詞服裝圖片中分別隨機(jī)選取250張,得到含有“連衣裙”、“女裝t恤”和“旗袍”的共750張圖片,對(duì)這750張混雜類別的圖片進(jìn)行t-SNE聚類、可視化分析,結(jié)果如圖6所示。
圖6 對(duì)含有“連衣裙”、“女裝t恤”和“旗袍”的750張圖片的t-SNE可視化結(jié)果
圖中每個(gè)圖片的坐標(biāo)對(duì)應(yīng)各自的t-SNE位置。從圖6可看出,t-SNE算法依據(jù)色彩的飽和度、強(qiáng)度聚類,并將服裝圖片放置于圖6中的相應(yīng)坐標(biāo)位置;但是,它沒(méi)有按服裝款式聚類。上述t-SNE聚類為根據(jù)服裝色彩對(duì)顧客進(jìn)行服裝商品推薦奠定了基礎(chǔ)。
為及時(shí)準(zhǔn)確地獲取當(dāng)前服裝產(chǎn)品的流行趨勢(shì)、消費(fèi)熱點(diǎn),提出了針對(duì)電商網(wǎng)站服裝數(shù)據(jù)爬取的算法fashionDataScrape。為提高爬取的靈活性,該算法首先爬取服裝商品的描述、價(jià)格及圖片網(wǎng)址等文字信息;然后,再利用前述圖片網(wǎng)址爬取相應(yīng)的服裝圖片信息,做到了文字信息和圖片信息爬取的相分離。為驗(yàn)證算法的可行性和有效性,用Python語(yǔ)言實(shí)現(xiàn)了該算法,其中主要用到的庫(kù)為Requests和Beautiful Soup。利用該算法實(shí)現(xiàn),以“連衣裙女裝新品”、“女裝t恤”和“旗袍年輕版”為關(guān)鍵詞,共爬取了京東網(wǎng)站上4 500條服裝商品信息,包括圖片信息。針對(duì)這些爬取結(jié)果,分別對(duì)它們進(jìn)行了商品描述分析、價(jià)格分析和圖片的t-SNE聚類可視化分析。從對(duì)服裝數(shù)據(jù)的分析結(jié)果來(lái)看,進(jìn)一步驗(yàn)證了電商網(wǎng)站服裝數(shù)據(jù)爬取的意義。