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.mzph.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…