可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!
本文作者:寇晓璇,中南财经政法大学统计与数学学院
本文编辑:刘子艳
技术总编:戴 雯
Stata&Python云端课程来啦!
好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
端
午
佳
节
方块三角圆
01
抓取菜谱——粽子篇
https://home.meishichina.com/search/recipe/%E7%B2%BD%E5%AD%90/
https://home.meishichina.com/search/recipe/%E7%B2%BD%E5%AD%90/page/2/
https://home.meishichina.com/search/recipe/%E7%B2%BD%E5%AD%90/page/3/
https://home.meishichina.com/search/recipe/%E7%B2%BD%E5%AD%90/page/4/
……
首先,创建文件夹、更改工作路径。clear all
cap mkdir "D:\Stata\美食天下\爬虫"
cd "D:\Stata\美食天下\爬虫"
然后,使用forvalues循环抓取多个网页源代码,利用正则表达式对网页源代码进行处理。我们发现使用 copy命令不能成功获取到网页源代码,所以这里使用的是命令行工具 curl。*提取多个网页标题链接、标题、原料
forvalues p = 1/50 {
!"C:\eSupport\Stata16\64位\curl.exe" "https://home.meishichina.com/search/recipe/%E7%B2%BD%E5%AD%90/page/`p'/" -o temp.txt
clear all
infix strL v 1-10000 using temp.txt, clear
keep if strpos(v, `"<h4><a href=""') | strpos(v, `"<p class="subcontent">"')
if _N == 0 {
continue, break
}
replace v = ustrregexra(v, `"<h4><a href=""', "", .)
split v, p(`"" target="_blank">"')
drop v
gen v3 = v1[_n+1] if mod(_n, 2) == 1
keep if mod(_n, 2) == 1
replace v2 = ustrregexra(v2, "<.*?>", "", .)
replace v3 = ustrregexra(v3, "<.*?>", "", .)
rename _all (url title raw)
compress
save `p', replace
}
最后,将抓取到的多个页面数据汇总到一个文件中。clear all
fs *.dta
foreach f in `r(files)'{
append using `f'
}
save 菜谱.dta, replace
所有代码运行完成后,所有菜谱的链接、标题、原料都被抓取下来了(下图仅展示部分抓取结果)。02
寻找最受欢迎的粽子
python
import csv
from selenium import webdriver
import time
import pandas as pd
def get_data(url):
brower = webdriver.Chrome() # 创建浏览器对象
brower.get(url) # 打开要访问的页面
time.sleep(5)
dzrs = brower.find_elements_by_xpath('//a[@title="点赞"]/span')[0].text
scrs = brower.find_elements_by_xpath('//a[@title="收藏"]/span')[0].text
plrs = brower.find_elements_by_xpath('//a[@title="评论"]/span')[0].text
return dzrs,scrs,plrs
brower.quit()
with open('C:/Users/Coco/Desktop/美食天下/comment.csv','a',newline='') as f:
writer = csv.writer(f)
writer.writerow(['粽子口味','点赞人数','收藏人数','评论人数'])
def write_data(comment):
with open('C:/Users/Coco/Desktop/美食天下/comment.csv','a',newline='') as f:
writer = csv.writer(f)
writer.writerow(comment)
df = pd.read_stata('C:/Users/Coco/Desktop/美食天下/爬虫/菜谱.dta')
url_list = list(df['url'])
title_list = list(df['title'])
comment_list = []
comment_dict = {}
for url_title in zip(url_list,title_list):
comment_dict['title'] = url_title[1]
comment_dict['dzrs'],comment_dict['scrs'],comment_dict['plrs'] = get_data(url_title[0])
print(comment_dict)
comment = list(comment_dict.values())
write_data(comment)
end
这样一来,所有粽子菜谱的标题、点赞、收藏、评论数这四列信息都被保存到csv文件中了。(下图仅展示部分结果)接下来,进一步对获取到的信息进行整理、排序,并用正则表达式提取粽子口味。
*导入抓取到的数据
clear
cd "C:\Users\Coco\Desktop\美食天下"
import delimited comment.csv, encoding(GB18030)
format 粽子口味 %-60s
*保存收藏、点赞、评论数最多的粽子
gsort -收藏人数
keep if 收藏人数>750
replace 粽子口味 = ustrregexs(0) if ustrregexm(粽子口味, "[\u4e00-\u9fa5]+$")
replace 粽子口味 = ustrregexra(粽子口味, "(.*?)", "", .)
drop if 粽子口味 == "包粽子"
order 粽子口味 收藏人数 点赞人数 评论人数
format 粽子口味 %-20s
*可视化
graph hbar 收藏人数 点赞人数 评论人数, over(粽子口味, sort(1) descending) ///
title(粽子口味受欢迎度) ///
subtitle(——基于收藏人数、点赞人数、评论人数) ///
legend(row(1) ring(1) position(6) label(1 "收藏人数") label(2 "点赞人数") label(3 "评论人数")) ///
ylabel(0(300)3600, tposition(inside) labsize(*0.8) angle(0)) ///
ytitle("人数", tstyle(smbody)) ///
blabel(bar, size(vsmall) format(%4.0f))
graph export "taste.png", replace
03
奇葩口味粽子一览
金蚝粽子皇
锅包虾球粽子
04
粽子制作原料汇总
clear all
cd C:\Users\Coco\Desktop\美食天下
*原料拆分
use ".\爬虫\菜谱.dta", clear
drop url title
replace raw = ustrregexra(raw, "原料:|。", "", .)
split raw, p("、")
drop raw
*分类汇总
stack raw1 - raw21, into(raw) clear
drop _stack
drop if raw==""
bysort raw: gen frequency = _N
gsort -frequency
duplicates drop
save word, replace
*绘制词云图
clear
cd C:\Users\Coco\Desktop\美食天下
use word.dta, clear
keep in 1/100
wordcloud raw frequency using 词云图.html, replace ///
size(15 80) range(3480 2160)
shellout 词云图.html
粽子口味虽多,原料虽丰富,但思念只有一种。最后,再次祝大家端午节安康,多吃粽子!
注:本文完整代码及相关文件可通过后台发送“ 粽子 ”获取~最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐好玩有趣的手绘图形库——cutecharts
爬虫实战|摩尔庄园微博话题讨论
一季度财报出炉,哪些公司最烧钱?
一季度财报出炉,哪些公司最赚钱?
技能篇 | 图片合并大法
批量空气质量数据文件合并分析
Stata17之日期时间新功能
Stata17之Lasso新功能
爱奇艺视频弹幕爬取之《小舍得》 数据可视化利器——Matplotlib从第七次人口普查看中国人口变化|Stata与Python交互绘图
200万投资者关注!!哪家公司这么牛?
带你领略一天天气之变化
利用pyecharts看微博粉丝地区分布
零值太多怎么办?解锁Stata17新命令ziologit
Stata17新功能之Python API 小罗肥归升级啦|解锁Stata17之新命令xtmlogit 初识PyStata
辞旧迎新——Stata17之Do-file编辑器优化
Stata17新亮点——解放表格输出生产力
【爬虫+可视化】链家网北京租房信息
手把手教你如何获取股票数据和可视化
Countvalues——数数的超级小帮手
下拉选择框如何变成“小猫咪” | selenium小技巧
Python中的运算符知多少?
快来get缺失值的正确打开方式
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。