老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

一、環境及依賴

語言:python3。8

抓取:selenium

代理:ipide

**注:**想要完整程式碼的在末尾,注意新手建議慢慢看完。在此提示一下本篇文章的編寫步驟:1。獲取資料、2。翻譯、3。資料清洗、4。切詞詞權重、5。詞雲

1。1 selenium 準備

私信小編01即可獲取大量Python學習資源

為了簡單,在這裡我使用了selenium(菜鳥用selenium,我就是菜鳥)進行資料抓取,並且使用了ipidea的代理(反正有送穩妥),否則等著測試著除錯太多次我IP就炸了。

selenium 可使用 pip 進行下載,命令是:

pip install selenium

下載了selenium之後還需要一個driver,需要檢視你瀏覽器版本,僅支援火狐或者谷歌。

在此用谷歌距離,首先點選Chorm瀏覽器右上角三個點:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

選擇幫助,關於google進入 chrome://settings/help 頁。隨後找到對應的版本號:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

接下來進入到driver的下載地址:

http://chromedriver。storage。googleapis。com/index。html

接著在對應的版本號中找到接近的driver進行下載:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

隨後點選後選擇對應的版本即可:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

windows就用win32就可以了,下載後解壓到一個目錄就ok。

接著代理我使用的是IPIDE,官網是這個連結,免費使用就ok,夠用了。

二、資料獲取

2。1 代理

第一步咱們得拿到資料,那麼透過代理去進行獲取。

首先建立一個python檔名為 test1,當然名字自己隨便取。

接著使用vscode(你可以用你的),頭部引入:

from selenium import webdriverimport requests,json,time

接著我們寫一個頭:

#代理headers = {‘user-agent’: ‘Mozilla/5。0 (Windows NT 6。1; Win64; x64; rv:55。0) Gecko/20100101 Firefox/55。0’}

基礎做好後首先需要獲取代理,我們寫一個函式名為 ip_:

#代理獲取def ip_(): url=r“http://tiqu。ipidea。io:81/abroad?num=1&type=2&lb=1&sb=0&flow=1®ions=in&port=1” r = requests。get(url, headers=headers,timeout=3) data = json。loads(r。content) ip_=data[‘data’][0] return ip_

以上程式碼中 url 儲存的

http://tiqu。ipidea。io:81/abroad?num=1&type=2&lb=1&sb=0&flow=1®ions=in&port=1

為代理獲取的連結,有些小夥伴可能獲取的時候會失敗,原因是沒有設定當前ip為白名單。

設定白名單的方式很簡單,透過連結在末尾替換自己的白名單就可以了:

https://api。ipidea。net/index/index/save_white?neek=***&appkey=***************************&white=白名單ip

自己的白名單新增連結在

https://www。ipidea。net/getapi:

如果我公開出來我基本上大家都可以用我的了,所以打個碼。

我們繼續回到函式 ip_()中,r = requests。get(url, headers=headers,timeout=3) 將會獲取到代理ip地址,接著我使用了 json 進行轉化:data = json。loads(r。content),最終返回了 ip 地

址。IP 獲取的方式過於簡單就不再講解了。

接下來獲取代理與組成 ip 代理字串:

ip=ip_()#ip獲取proxy_str=“http://”+str(ip[‘ip’])+‘:’+str(ip[‘port’])#ip proxy 組合

接著使用 webdriver 對谷歌瀏覽器設定代理:

options = webdriver。ChromeOptions()options。add_argument(“——proxy-server=%s” % proxy_str)options。add_argument(‘——ignore-certificate-errors’)options。add_argument(‘-ignore -ssl-errors’)

以上程式碼中 options。add_argument 為了給瀏覽器新增代理,之後的兩句話只是為了忽略某些錯誤,當然你不加基本上也沒事。

2。2 抓取資料

接著建立一個變數url儲存需要抓取頁的連結:

url=‘https://www。quora。com/topic/Chinese-Food?q=Chinese%20food’

接下來建立 谷歌瀏覽器 物件:

driver = webdriver。Chrome(executable_path=r‘C:\webdriver\chromedriver。exe’,options=options)driver。get(url)input()

webdriver。Chrome 中的 executable_path 為指定下載 driver 的地址,option 為代理的配置。

建立好後 driver 你就可以理解成是 Chrome 谷歌瀏覽器物件了,使用谷歌瀏覽器開啟一個指定頁面只需要使用 get方法,再get 方法內傳遞一個 url。

由於我們發現該頁面是瀏覽器滑動到底部自動重新整理,此時我們只需要使用迴圈重複一直往下滑動就可以了:

for i in range(0,500): driver。execute_script(“window。scrollTo(0, document。body。scrollHeight);”) time。sleep(10)

以上迴圈中的程式碼 driver。execute_script 表示執行script命令,其中 window。scrollTo(0, document。body。scrollHeight); 就是對應的滑動命令。每次滑動過後就給他歇一下,不然一直劃效果不是很好,所以就使用 sleep 休息10s 等待載入。

接著我們獲取頁面中一下一塊塊的資料:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

為了防止遺漏出什麼不好餓內容,在此我打了一下碼。

此時我們可以使用右鍵檢查,開啟原始碼:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

此時我們可以看到這一塊 html 程式碼下就是對應的內容:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

我們從中得知,這個部分的 class 的名稱是q-box,我們可以透過driver中的 find_element_by_class_name 的方法,找到這個元素,並且得到對應的文字。

接著我們觀看所有的內容塊得知,都是使用q-box作為名稱:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

接下來我們只需要使用程式碼:

content=driver。find_element_by_class_name(‘q-box’)

就可以抓取到這所有名為 q-box 的物件。

此時我們只需要對這個物件使用 。text 即可獲取文字,再使用 f。write 將其寫入到文字之中:

f = open(r‘C:\Users\Administrator\Desktop\data\data。txt’,mode=‘w’,encoding=‘UTF-8’) f。write(content。text)f。close()

該部分的完整程式碼如下:

from selenium import webdriverimport requests,json,time#代理headers = {‘user-agent’: ‘Mozilla/5。0 (Windows NT 6。1; Win64; x64; rv:55。0) Gecko/20100101 Firefox/55。0’}#代理獲取def ip_(): url=r“http://tiqu。ipidea。io:81/abroad?num=1&type=2&lb=1&sb=0&flow=1®ions=in&port=1” r = requests。get(url, headers=headers,timeout=3) data = json。loads(r。content) print(data) ip_=data[‘data’][0] return ip_ip=ip_()#ip獲取proxy_str=“http://”+str(ip[‘ip’])+‘:’+str(ip[‘port’])#ip proxy 組合options = webdriver。ChromeOptions()options。add_argument(“——proxy-server=%s” % proxy_str)options。add_argument(‘——ignore-certificate-errors’)options。add_argument(‘-ignore -ssl-errors’)url=‘https://www。quora。com/topic/Chinese-Food?q=Chinese%20food’driver = webdriver。Chrome(executable_path=r‘C:\webdriver\chromedriver。exe’,options=options)driver。get(url)input()for i in range(0,500): driver。execute_script(“window。scrollTo(0, document。body。scrollHeight);”) time。sleep(10)title=driver。find_element_by_class_name(‘q-box’)#title=driver。find_element_by_css_selector(“[class=‘dtb-style-1 table-dragColumns’]”) f = open(r‘C:\Users\Administrator\Desktop\data\data。txt’,mode=‘w’,encoding=‘UTF-8’) f。write(title。text)f。close()

三、切詞統計

3。1 資料清洗

接著咱們可以對資料進行翻譯,不過免費的庫有每日限制,那麼最好的辦法,不花錢的辦法就是複製內容去線上翻譯去翻譯,對的,雖然資料有點多,不過還好,問題不大。

翻譯完成複製的一個文字之中,這個文字我命名為 datacn。

在此建立一個名稱為cut的py檔案,並且在頭部引入:

import jieba,re,jieba。analyse #結巴分詞from wordcloud import WordCloud #詞雲import matplotlib。pyplot as plt

引入之後建立一個函式用於讀取翻譯過來的文字 datacn 的內容:

def get_str(path): f = open(path,encoding=“utf-8” ) data = f。read() f。close() return data

程式碼很簡單,就是 open檔案,read讀取就完成了,不過有些同學容易出現編碼錯誤,記得一定要加 encoding=“utf-8”,如果還不信,你就將文字另存為,在另存為時選擇編碼為 utf-8就可以了:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

接著,咱們再建立一個清洗內容的函式:

def word_chinese(text): pattern = re。compile(r‘[^\u4e00-\u9fa5]’) clean= re。sub(pattern, ‘’, text) return clean

其實上面函式的作用就是找到中文字元返回,其他的內容就不要了,不然會影響效果,例如一些標點符號和英文字母等。

接著我們直接讀取資料:

path=r“D:\datacn。txt”text=get_str(path)text=word_chinese(text)

其中 path 是路徑,就是我翻譯過來的文字儲存的路徑,然後傳入引數 get_str 中就可以了,這樣讀到的資料就是text,急著再把text傳入到清洗函式 word_chinese 中進行清洗,這樣清除不好的資料就ok了。

3。2 詞頻權重統計

但是這個時候還是有一些不好的詞語出現,例如 你、我、他、你好、知道…這些內容,怎麼去掉呢?這個時候就使用結巴庫設定一些詞不要

jieba。analyse。set_stop_words

,程式碼是:

jieba。analyse。set_stop_words(r‘D:\StopWords。txt’)

其中

D:\StopWords。txt

這個文字中記錄了不要的詞,我為了資料準確我自己調了一堆的詞,想要的可以看評論區,資料太多不好直接複製上來。

設定好之後就可以自動過濾了,下一步就是切詞統計詞頻,這一步的程式碼是:

words = jieba。analyse。textrank(text, topK=168,withWeight=True)

使用的方法是 jieba。analyse。textrank(),其中 text 就是我們清理過的文字,topk 是指你要得到詞頻前幾,我這裡是 topk=168 就是表示得到出現頻率最多的錢 168 個詞,函式其中 withWeight=True 表示結果中出現詞頻權重數值,例如不使用 withWeight=True 結果如下:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

不開啟 withWeight 結果則顯示:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

此時結果已經得到了,發現老外最喜歡、提的次數最高的竟然是醬油,然後是喜歡。看來是真的挺喜歡的。

接著咱們先做個詞雲,再做分析。詞雲需要字串,不能使用陣列,使用以下程式碼使其成為字串:

wcstr = “ ”。join(words)

接著建立詞雲物件:

wc = WordCloud(background_color=“white”, width=1000, height=1000, font_path=‘simhei。ttf’ )

在詞雲物件的配置中,background_color 是字串,width 和 height 是詞雲寬度,font_path 是設定字型。在此注意,字型一定要設定,否則將會看不到任何文字。

接著將字串傳遞給建立的詞雲物件 wc的generate函式:

wc。generate(wcstr)

接下來就使用plt顯示就可以了:

plt。imshow(wc)plt。axis(“off”)plt。show()

完整程式碼如下:

import jieba,re,jieba。analysefrom wordcloud import WordCloudimport matplotlib。pyplot as pltdef get_str(path): f = open(path,encoding=“utf-8” ) data = f。read() f。close() return datadef word_chinese(text): pattern = re。compile(r‘[^\u4e00-\u9fa5]’) clean = re。sub(pattern, ‘’, text) return cleanpath=r“D:\datacn。txt”text=get_str(path)text=word_chinese(text)jieba。analyse。set_stop_words(r‘D:\StopWords。txt’)words = jieba。analyse。textrank(text, topK=168)print(words)wcstr = “ ”。join(words)wc = WordCloud(background_color=“white”, width=1000, height=1000, font_path=‘simhei。ttf’ )wc。generate(wcstr)plt。imshow(wc)plt。axis(“off”)plt。show()

最終的結果如下:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

四、從資料中找到TOP之最

由於資料太多,不方便用折線圖之類統計,我從權重中找到了老外提到最Top的幾個緯度。

所有排名如下:

老外最喜歡的美食聖地 是不是你家?python 分析20w資料 「附程式碼」

老外提到最多 Top :

美食聖地依次是香港、澳門、廣東、無錫、廣州、北京、閩南;

提到食物最多的是:炒飯、米飯、豆腐、大豆、牛肉、麵條、火鍋、炒菜、餃子、蛋糕、包子

提到最多口味:糖醋、鹹味

提到最多的廚具:火鍋、陶罐、石鍋、灶臺

不過第一是醬油是啥情況,而且喜歡第二,看來大家都比較喜歡我們的食物呀!很贊!