不知道給女朋友買什麼 ?讓爬蟲告訴你 !

  • 2019 年 11 月 12 日
  • 筆記

本文來源: 公眾號從零開始學爬蟲

引言

你是否曾經遇到過要給女朋友、父母、好朋友送禮物卻不知道買什麼的情況?小編作為一個直男,每次都在給朋友選禮物的事情上費勁腦筋,實在是不知道買什麼東西好。但事情總是要解決,小編萌生了一個想法,在某購物網站搜索關鍵字,然後將搜索結果進行詞頻分析,這樣不就知道有什麼東西是大家買的比較多的了么?說干咱就干。

需求分析

通過京東購物網站搜索關鍵字,將搜索結果中的產品名稱進行保存,同時對產品名稱進行詞頻統計,生成可供參考的詞雲圖。

所用知識點

爬蟲:requests庫(簡單的項目,使用requests更方便)

分詞:jieba庫

詞云:pyecharts庫

保存文件:csv庫

頁面解析:BeautifulSoup

目標網站分析

打開京東網站,輸入關鍵字,本例中使用「情人節」,點擊搜索。可以看到搜索結果頁面如下圖所示。除去廣告,我們的定位的目標為紅色框線內的產品資訊。

使用開發者工具,定位頁面中的產品,可以看到所有產品都存放在class=『gl-item』的li標籤中。可以通過select(".gl-item")確定所有頁面中的產品集合。

確定產品後,逐步確定price(產品價格)、title(商品名稱)、product_detail_link(商品詳情鏈接)、img_link(圖片鏈接)、評價數量、shop_name(店鋪名稱)、shop_link(店鋪鏈接)。實際中我們只用到了title這個屬性,但是出於習慣,將能用到的內容全部都提取出來,方便以後使用。標籤都比較好尋找,就不單列方法,下面是全部元素的定位程式碼。

r = requests.get(url, params=params, ) r_content = (r.content.decode("utf-8")) content = BeautifulSoup(r_content, 'lxml') product = content.select(".gl-item") for p in product: product_info = {} product_info['number'] = num num += 1 try: # 價格 product_info["price"] = p.select(".p-price i")[0].get_text() # 商品名稱 product_info["title"] = p.select('.p-name-type-2 a')[0].attrs['title'].strip(" ") # 商品鏈接 product_info['product_detail_link'] = p.select('.p-img a')[0].attrs['href'].strip('/') # 圖片鏈接 product_info['img_link'] = p.select('.p-img a img')[0].attrs['source-data-lazy-img'].strip('/') # 評價數量 product_info["評價數量"] = p.select('.p-commit a')[0].get_text() # 商家資訊 shop = p.select(".p-shop a") if len(shop) == 0: shop_name = "" shop_link = "" else: # 商鋪名稱 shop_name = shop[0].get_text() # 商鋪鏈接 shop_link = shop[0].attrs['href'] product_info['shop_name'] = shop_name product_info['shop_link'] = shop_link

在提完當前頁之後,我們肯定不能滿足只爬取一頁的內容,如果只要一頁的內容我猜不用爬蟲應該更簡單。下一步就是不斷提取下一頁的鏈接,並不斷訪問提取數據。

在搜索結果中點擊下一頁,觀察url變化。(比較過程略)

通過觀察比較,我們可以得到一個規律。在url中必須傳的參數有keyword(搜索關鍵字)、enc(編碼)、s(內容數量)、page(當前頁)。其中只有page是變化參數,其他都是固定參數。所以我們可以不斷的構建page參數,來訪問不同的頁面。程式碼如下:

url = "https://search.jd.com/Search" params = { "keyword": keyword, "enc": "utf-8", "s": 50, } for i in range(1, 200, 2): params['page'] = i r = requests.get(url, params=params, )

通過不斷的構建url地址,我們可以訪問全部的搜索結果。

保存

通過上面的提取內容程式碼,我們可以將所有需要的資訊放在一個list中,每個list元素是一個product_info字典。通過csv庫,將得到的內容保存到csv文件中。

def save_info(product_list,file): fieldnames = ['number','price','title','product_detail_link','img_link',"評價數量",'shop_name','shop_link'] with open(file,'a',newline="") as csvfile: writer = csv.DictWriter(csvfile,fieldnames=fieldnames) writer.writeheader() for product_info in product_list: #寫入時需要注意,有些商品名稱包含「✅」或「❤」特殊字元,是無法寫入的,要做處理 try: writer.writerow(product_info) except: print(str(product_info) + "寫入錯誤")

這裡需要注意的一點是,因為有些產品名稱中包含「✅」,「❤」這樣的特殊字元,是無法寫入到csv中的,需要對寫入程式碼做異常判斷。(偷偷的告訴你,這個錯誤還真浪費了小編一些時間,一直都是寫入報錯,後來才找到是特殊字元的鍋)

分詞

保存文件之後,我們通過另一個函數讀取csv中的title欄位(這裡也可以直接使用爬蟲程式碼中提取的數據,小編只是習慣將數據保存),通過jieba庫,對數據進行中文分詞。jieba庫可以將一個中文字元串進行中文分詞,是一個很好用的中文分詞庫(具體使用方法後續會發筆記)。首先將所有title提取出來,並組合成一個字元串,通過jieba.cut對該字元串進行分詞。具體程式碼如下:

seg_list = jieba.cut(data_string, cut_all=False)

生成詞雲

在得到分詞結果之後,我們要對結果進行加工,得到一個{詞:出現次數}的字典,當然為了去除一些無用的詞和低頻的詞,我們還需要一個篩選。篩選程式碼略。可以通過源碼查看。

得到{詞:出現次數}的字典之後,我們就可以使用pyecharts庫中的WordCloud進行詞雲生成。具體程式碼如下:

wordcloud = WordCloud(width=1300, height=620) for k,v in seg_count_bigthan100.items(): word.append(k) count.append(v) wordcloud.add("詞雲圖", word, count, word_size_range=[20, 100],shape="diamond") wordcloud.render()

結果

下面是小編搜索幾個關鍵字之後的詞雲結果。

情人節:

七夕:

手機:

源碼

關注公眾號,回復關鍵字 「 禮物 」 領取源碼。

一些話

看了這個詞雲結果,想到的是什麼?反正小編是一腦子的懵*,這**跟我想的不一樣啊,看了這個結果仍然對我沒什麼幫助啊,可是已經寫完了還能怎麼辦呢?當然是分享出來給小伙兒伴們看一下了。

程式碼還有很多需要改進的地方,希望各位大佬輕拍。