python 数据分析找到老外最喜欢的中国美食【完整代码】
一、環(huán)境及依賴
語言:python3.8
抓取:selenium
代理:ipide
**注:**想要完整代碼的在末尾,注意新手建議慢慢看完。在此提示一下本篇文章的編寫步驟:1.獲取數(shù)據(jù)、2.翻譯、3.數(shù)據(jù)清洗、4.切詞詞權(quán)重、5.詞云
1.1 selenium 準(zhǔn)備
為了簡單,在這里我使用了selenium(菜鳥用selenium,我就是菜鳥)進(jìn)行數(shù)據(jù)抓取,并且使用了ipidea的代理(反正有送穩(wěn)妥),否則等著測試著調(diào)試太多次我IP就炸了。
selenium 可使用 pip 進(jìn)行下載,命令是:
pip install selenium下載了selenium之后還需要一個driver,需要查看你瀏覽器版本,僅支持火狐或者谷歌。
在此用谷歌距離,首先點擊Chorm瀏覽器右上角三個點:
選擇幫助,關(guān)于google進(jìn)入 chrome://settings/help 頁。隨后找到對應(yīng)的版本號:
接下來進(jìn)入到driver的下載地址:http://chromedriver.storage.googleapis.com/index.html
接著在對應(yīng)的版本號中找到接近的driver進(jìn)行下載:
隨后點擊后選擇對應(yīng)的版本即可:
windows就用win32就可以了,下載后解壓到一個目錄就ok。
二、數(shù)據(jù)獲取
2.1 代理
接著代理我使用的是IPIDE,官網(wǎng)是這個鏈接,免費使用就ok,夠用了。
第一步咱們得拿到數(shù)據(jù),那么通過代理去進(jìn)行獲取。
首先創(chuàng)建一個python文件名為 test1,當(dāng)然名字自己隨便取。
接著使用vscode(你可以用你的),頭部引入:
接著我們寫一個頭:
#代理 headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}基礎(chǔ)做好后首先需要獲取代理,我們寫一個函數(shù)名為 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 為代理獲取的鏈接,有些小伙伴可能獲取的時候會失敗,原因是沒有設(shè)置當(dāng)前ip為白名單。
設(shè)置白名單的方式很簡單,通過鏈接在末尾替換自己的白名單就可以了:
https://api.ipidea.net/index/index/save_white?neek=***&appkey=***************************&white=白名單ip ,自己的白名單添加鏈接在 https://www.ipidea.net/getapi:
如果我公開我的出來我基本上大家都可以用我的了,所以打個碼。
我們繼續(xù)回到函數(shù) ip_()中,r = requests.get(url, headers=headers,timeout=3) 將會獲取到代理ip地址,接著我使用了 json 進(jìn)行轉(zhuǎn)化:data = json.loads(r.content),最終返回了 ip 地址。IP 獲取的方式過于簡單就不再講解了。
接下來獲取代理與組成 ip 代理字符串:
ip=ip_()#ip獲取 proxy_str="http://"+str(ip['ip'])+':'+str(ip['port'])#ip proxy 組合接著使用 webdriver 對谷歌瀏覽器設(shè)置代理:
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 為對瀏覽器添加代理,之后的兩句話只是為了忽略某些錯誤,當(dāng)然你不加基本上也沒事。
2.2 抓取數(shù)據(jù)
接著創(chuàng)建一個變量url存儲需要抓取頁的鏈接:
url='https://www.quora.com/topic/Chinese-Food?q=Chinese%20food'接下來創(chuàng)建 谷歌瀏覽器 對象:
driver = webdriver.Chrome(executable_path=r'C:\webdriver\chromedriver.exe',options=options) driver.get(url) input()webdriver.Chrome 中的 executable_path 為指定下載 driver 的地址,option 為代理的配置。
創(chuàng)建好后 driver 你就可以理解成是 Chrome 谷歌瀏覽器對象了,使用谷歌瀏覽器打開一個指定頁面只需要使用 get方法,在get 方法內(nèi)傳遞一個 url。
由于我們發(fā)現(xiàn)該頁面是瀏覽器滑動到底部自動刷新,此時我們只需要使用循環(huán)重復(fù)一直往下滑動就可以了:
for i in range(0,500):driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")time.sleep(10)以上循環(huán)中的代碼 driver.execute_script 表示執(zhí)行script命令,其中 window.scrollTo(0, document.body.scrollHeight); 就是對應(yīng)的滑動命令。每次滑動過后就給他歇一下,不然一直劃效果不是很好,所以就使用 sleep 休息10s 等待加載。
接著我們獲取頁面中一下一塊塊的數(shù)據(jù):
為了防止遺漏出什么不好餓內(nèi)容,在此我打了一下碼。
此時我們可以使用右鍵檢查,打開源碼:
此時我們可以看到這一塊 html 代碼下就是對應(yīng)的內(nèi)容:
我們從中得知,這個部分的 class 的名稱是q-box,我們可以通過driver中的 find_element_by_class_name 的方法,找到這個元素,并且得到對應(yīng)的文本。
接著我們觀看所有的內(nèi)容塊得知,都是使用q-box作為名稱:
接著我們只需要使用代碼:
就可以抓取到這所有名為 q-box 的對象。
此時我們只需要對這個對象使用 .text 即可獲取文本,再使用 f.write 將其寫入到文本之中:
該部分的完整代碼如下:
from selenium import webdriver import 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()三、切詞統(tǒng)計
3.1 數(shù)據(jù)清洗
接著咱們可以對數(shù)據(jù)進(jìn)行翻譯,不過免費的庫有每日限制,那么最好的辦法,不花錢的辦法就是賦值內(nèi)容去在線翻譯去翻譯,對的,雖然數(shù)據(jù)有點多,不過還好,問題不大。
翻譯完成復(fù)制的一個文本之中,這個文本我命名為 datacn。
在此創(chuàng)建一個名稱為cut的py文件,并且在頭部引入:
引入之后創(chuàng)建一個函數(shù)用于讀取翻譯過來的文本 datacn 的內(nèi)容:
def get_str(path):f = open(path,encoding="utf-8" ) data = f.read()f.close()return data代碼很簡單,就是 open文件,read讀取就完成了,不過有些同學(xué)容易出現(xiàn)編碼錯誤,記得一定要加 encoding=“utf-8”,如果還不信,你就將文本另存為,在另存為時選擇編碼為 utf-8就可以了:
接著,咱們再創(chuàng)建一個清洗內(nèi)容的函數(shù):
其實上面函數(shù)的作用就是找到中文字符返回,其他的內(nèi)容就不要了,不然會影響效果,例如一些標(biāo)點符號和英文字母等。
接著我們直接讀取數(shù)據(jù):
path=r"D:\datacn.txt" text=get_str(path) text=word_chinese(text)其中 path 是路徑,就是我翻譯過來的文本存儲的路徑,然后傳入?yún)?shù) get_str 中就可以了,這樣讀到的數(shù)據(jù)就是text,急著再把text傳入到清洗函數(shù) word_chinese 中進(jìn)行清洗,這樣清楚不好的數(shù)據(jù)就ok了。
3.2 詞頻權(quán)重統(tǒng)計
但是這個時候還是有一些不好的詞語,例如 你、我、他、你好、知道…這些內(nèi)容,怎么去掉呢?這個時候就使用結(jié)巴庫設(shè)置一些詞不要 jieba.analyse.set_stop_words,代碼是:
jieba.analyse.set_stop_words(r'D:\StopWords.txt')其中 D:\StopWords.txt 這個文本中記錄了不要的詞,我為了數(shù)據(jù)準(zhǔn)確我自己調(diào)了一堆的詞,想要的可以看評論區(qū),數(shù)據(jù)太多不好直接復(fù)制上來。
設(shè)置好之后就可以自動過濾了,下一步就是切詞統(tǒng)計詞頻,這一步的代碼是:
words = jieba.analyse.textrank(text, topK=168,withWeight=True)使用的方法是 jieba.analyse.textrank(),其中 text 就是我們清理過的文本,topk 是指你要得到詞頻前幾,我這里是 topk=168 就是表示得到出現(xiàn)頻率最多的錢 168 個詞,函數(shù)其中 withWeight=True 表示結(jié)果中出現(xiàn)詞頻權(quán)重數(shù)值,例如不使用 withWeight=True 結(jié)果如下:
不開啟 withWeight 結(jié)果則顯示:
此時結(jié)果已經(jīng)得到了,發(fā)現(xiàn)老外最喜歡、提的次數(shù)最高的竟然是醬油,然后是喜歡。看來是真的挺喜歡的。
接著咱們先做個詞云,再做分析。詞云需要字符串,不能使用數(shù)組,使用以下代碼使其成為字符串:
wcstr = " ".join(words)接著創(chuàng)建詞云對象:
wc = WordCloud(background_color="white",width=1000,height=1000,font_path='simhei.ttf')在詞云對象的配置中,background_color 是字符串,width 和 height 是詞云寬度,font_path 是設(shè)置字體。在此注意,字體一定要設(shè)置,否則將會看不到任何文字。
接著將字符串傳遞給創(chuàng)建的詞云對象 wc的generate函數(shù):
wc.generate(wcstr)接下來就使用plt顯示就可以了:
plt.imshow(wc) plt.axis("off") plt.show()完整代碼如下:
import jieba,re,jieba.analyse from wordcloud import WordCloud import matplotlib.pyplot as pltdef get_str(path):f = open(path,encoding="utf-8" ) data = f.read()f.close()return data def 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()最終的結(jié)果如下:
四、從數(shù)據(jù)中找到TOP之最
由于數(shù)據(jù)太多,不方便用折線圖之類統(tǒng)計,我從權(quán)重中找到了老外提到最Top的幾個緯度。
所有排名如下:
老外提到最多 Top :
美食圣地依次是香港、澳門、廣東、無錫、廣州、北京、閩南;
提到食物最多的是:炒飯、米飯、豆腐、大豆、牛肉、面條、火鍋、炒菜、餃子、蛋糕、包子
提到最多口味:糖醋、咸味
提到最多的廚具:火鍋、陶罐、石鍋、灶臺
不過第一是醬油是啥情況,而且喜歡第二,看來大家都比較喜歡我們的食物呀!很贊!
總結(jié)
以上是生活随笔為你收集整理的python 数据分析找到老外最喜欢的中国美食【完整代码】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十三、制作 iVX音乐分享小程序
- 下一篇: python 全解坦克大战 辅助类 附完