python 數據分析找到老外最喜歡的中國美食【完整代碼】

一、環境及依賴

語言:python3.8
抓取:selenium
代理:ipide
**注:**想要完整代碼的在末尾,注意新手建議慢慢看完。在此提示一下本篇文章的編寫步驟:1.獲取數據、2.翻譯、3.數據清洗、4.切詞詞權重、5.詞云

1.1 selenium 準備

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

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

pip install selenium

下載了selenium之后還需要一個driver,需要查看你瀏覽器版本,僅支持火狐或者谷歌。
在此用谷歌距離,首先點擊Chorm瀏覽器右上角三個點:

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

接下來進入到driver的下載地址:http://chromedriver.storage.googleapis.com/index.html

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

隨后點擊后選擇對應的版本即可:
在這里插入圖片描述
windows就用win32就可以了,下載后解壓到一個目錄就ok。

二、數據獲取

2.1 代理

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

第一步咱們得拿到數據,那么通過代理去進行獲取。
首先創建一個python文件名為 test1,當然名字自己隨便取。
接著使用vscode(你可以用你的),頭部引入:

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'}

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

#代理獲取
def ip_():url=r"http://tiqu.ipidea.io:81/abroad?num=1&type=2&lb=1&sb=0&flow=1&regions=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&regions=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 等待加載。

接著我們獲取頁面中一下一塊塊的數據:

為了防止遺漏出什么不好餓內容,在此我打了一下碼。
此時我們可以使用右鍵檢查,打開源碼:
在這里插入圖片描述
此時我們可以看到這一塊 html 代碼下就是對應的內容:
在這里插入圖片描述
我們從中得知,這個部分的 class 的名稱是q-box,我們可以通過driver中的 find_element_by_class_name 的方法,找到這個元素,并且得到對應的文本。

接著我們觀看所有的內容塊得知,都是使用q-box作為名稱:
在這里插入圖片描述
接著我們只需要使用代碼:

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 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&regions=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就可以了:

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

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 結果如下:

不開啟 withWeight 結果則顯示:
在這里插入圖片描述
此時結果已經得到了,發現老外最喜歡、提的次數最高的竟然是醬油,然后是喜歡。看來是真的挺喜歡的。

接著咱們先做個詞云,再做分析。詞云需要字符串,不能使用數組,使用以下代碼使其成為字符串:

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.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()

最終的結果如下:

四、從數據中找到TOP之最

由于數據太多,不方便用折線圖之類統計,我從權重中找到了老外提到最Top的幾個緯度。
所有排名如下:

在這里插入圖片描述

老外提到最多 Top :
美食圣地依次是香港、澳門、廣東、無錫、廣州、北京、閩南;
提到食物最多的是:炒飯、米飯、豆腐、大豆、牛肉、面條、火鍋、炒菜、餃子、蛋糕、包子
提到最多口味:糖醋、咸味
提到最多的廚具:火鍋、陶罐、石鍋、灶臺

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之檢查跳轉的Activity是否存在

1、需求 android我們知道經常會跳各種設置頁面,比如設置默認瀏覽器頁面、設置添加快捷方式權限頁面,我們會根據機型進行適配,但是有時候如果找到也找個頁面不try catch操作程序會奔潰 2、檢查跳轉的Activity是否存在代碼實現 public static boolean hasActivity(Context co…

hihoCoder 1257 Snake Carpet(很簡單的構造方法)

2015 ACM / ICPC 北京現場賽 I 題 構造 注意一個小坑&#xff0c;每條蛇的輸出是要從頭到尾輸出的。 還要注意的是&#xff0c;不能開數組去模擬構造過程&#xff0c;然后輸出&#xff0c;那樣會TLE的。 #include <cstdio> #include <cstring> #include <cmath&…

西北師范大學地理與環境科學學院考研真題匯總(高等數學)持續更新。。。

西北師范大學地理與環境學科學院研究生入學考試的所有專業(地圖學與地理信息系統、自然地理學、人文地理學、環境科學、環境工程)的數學均為自主命題,復習參考教材為同濟大學第五版。

操作系統與多核處理器

這篇文章解答了我心中的疑問&#xff0c;那就是操作系統會自動調度cpu資源來處理多進程&#xff0c;多線程的并發。早在上世紀90年代末&#xff0c;就有眾多業界人士呼吁用CMP(單芯片多處理器)技術來替代復雜性較高的單線程CPU。IBM、惠普、Sun等高端服務器廠商&#xff0c;更是…

Java網絡編程二:Socket詳解

Socket又稱套接字&#xff0c;是連接運行在網絡上兩個程序間的雙向通訊的端點。 一、使用Socket進行網絡通信的過程 服務端&#xff1a;服務器程序將一個套接字綁定到一個特定的端口&#xff0c;并通過此套接字等待和監聽客戶端的連接請求。 客戶端&#xff1a;客戶端程序根據你…

Android之提示Could not find com.android.support:appcompat-v7:25.3.1.

1 問題 編譯第三方項目&#xff0c;錯誤提示如下 Could not find com.android.support:appcompat-v7:25.3.1. Required by:project :sampleproject :sample > com.yanzhenjie:permission:1.0.7project :sample > com.yanzhenjie.alertdialog:alertdialog:1.0.1 Search …

在 .NET 中使用 FixedTimeEquals 應對計時攻擊

計時攻擊 在計算機安全中&#xff0c;計時攻擊&#xff08;Timing attack&#xff09;是旁道攻擊 &#xff08;Side-channel attack&#xff09; 的一種&#xff0c;而旁道攻擊是根據計算機處理過程發出的信息進行分析&#xff0c;包括耗時&#xff0c;聲音&#xff0c;功耗等…

解讀大型網站系統架構的演化

解讀大型網站系統架構的演化 大型網站的架構是根據業務需求不斷完善的&#xff0c;根據不同的業務特征會做特定的設計和考慮&#xff0c;本文只是講述一個常規大型網站會涉及的一些技術和手段。作者&#xff1a;李平來源&#xff1a;LEE的博客前言 一個成熟的大型網站&#xff…

【ArcGIS風暴】西北地區氣象臺站年均NDVI與年均氣溫和降水的相關性分析

在研究植被動態變化與氣候的關系時,通常通過計算植被NDVI值與氣溫和降水的相關系數來描述相關性的大小。如下圖所示,計算了西北地區分布的氣象臺站與氣溫和降水的相關性并作圖可視化。 下面詳細說明整個實現過程。 一、計算相關系數 1. 原理分析 通過計算年均N…

python 全解坦克大戰 輔助類 附完整代碼【雛形】

我正在博客之星評選&#xff0c;歡迎投票給我 會從投票人中抽獎機械鍵盤書&#xff0c;中了會私聊地址 投票連接是&#xff1a;https://bbs.csdn.net/topics/603955346 投票連接是&#xff1a;https://bbs.csdn.net/topics/603955346 投票連接是&#xff1a;https://bbs.csdn.…

vc++ mfc中拖動效果的實現 借助于CImageList

拖動是界面編程頻繁使用的一個效果&#xff0c;在windows系統下可謂大行其道。縱觀時下的應用軟件幾乎各個都支持各種各樣拖動的效果&#xff0c;windows7更是把拖動做到了極致。其實說起來拖動的實現也很簡單&#xff0c;對于有句柄的對象都可以通過MoveWindow或SetWindowPos實…

從瀏覽器地址欄輸入url到顯示頁面的步驟

從瀏覽器地址欄輸入url到顯示頁面的步驟(以HTTP為例)- 在瀏覽器地址欄輸入URL- 瀏覽器查看緩存&#xff0c;如果請求資源在緩存中并且新鮮&#xff0c;跳轉到轉碼步驟 - 如果資源未緩存&#xff0c;發起新請求 - 如果已緩存&#xff0c;檢驗是否足夠新鮮&#xff0c;足夠…

有序的Map集合--LinkedHashMap

提出問題&#xff1a; 在寫一個dao的時候&#xff0c;我的需求是這個dao是一個萬能的&#xff0c;目前的方法只有一個查詢出實體類對應的表中所有的數據&#xff0c;通過傳入的對象&#xff0c;利用反射獲取實體類中的屬性名&#xff0c;屬性類型&#xff0c;利用字符串拼接獲取…

Leetcode之僅僅反轉字母

1 題目 給定一個字符串 S,返回 “反轉后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置發生反轉。 示例 1:輸入:"ab-cd" 輸出:"dc-ba" 示例 2:輸入:"a-bC-dEf-ghIj" 輸出:"j-Ih-gfE-dCba" 示例 3:輸入:&qu…

【SignalR全套系列】之在.Net Core 中實現長輪詢

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請后臺留言 源碼;前文回顧【SignalR全套系列】之在.Net Core 中實現Server-Send Events消息推送【SignalR全套系列】之在.NetCore中實現WebSocket雙工通信【SignalR全套系列】之在.N…

完美解決ArcGIS10.2和Erdas9.2軟件沖突的方法:共存!

用過ArcGIS和Erdas軟件的都知道&#xff0c;二者存在著服務的沖突&#xff0c;為了解決共存的問題&#xff0c;筆者曾多次重裝系統&#xff0c;但未能如愿以償。其實不需要相互關閉服務如此麻煩。那如何在安裝有arcgis的電腦安裝erdas并解決沖突呢&#xff1f;直接上視頻教程。…

架構師之路16年精選50篇

2016精選索引&#xff0c;點擊標題閱讀相關文章。【方法論】《秒殺系統架構優化思路》《分布式ID生成器》《互聯網架構&#xff0c;如何進行容量設計》《線程數究竟設多少合理》《單點系統架構的可用性與性能優化》《關于負載均衡的一切》《異構服務器負載均衡及過載保護》《LV…

yii 前后臺分離及登陸驗證

2019獨角獸企業重金招聘Python工程師標準>>> 比較合理的做法其實是分成兩個框架來布署&#xff1b;然而這樣說法也太絕對。 事實上是針對不同系統&#xff0c;應采用不同的方法。如為CMS系統&#xff0c;則不需很復雜的權限管理&#xff0c;但如果有管理員與會員之分…

雙谷人才財務管理(序)

IT是一個迅速發展的行業&#xff0c;教育是一個良心的行業&#xff0c;兩者交集——IT培訓&#xff0c;在整個市場中占有一個不可或缺的地位。好多大學生&#xff0c;抱怨找不到工作&#xff1b;好多企業找不到合適的程序員&#xff0c;這幾年這個問題越來越嚴重。。。。于是IT…

Android之打開手機系統相冊

1、需求 打開系統相冊&#xff0c;獲取圖片進行掃描操作 2、代碼實現 Intent pickIntent new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");Ca…