大数跨境
0
0

30行代码教你选一个优秀的英文名

30行代码教你选一个优秀的英文名 Stata and Python数据分析
2018-12-25
1
导读:好好学习!

本文作者:杨慧琳

本文编辑:张    宇

技术总编:李春涛

爬虫俱乐部郑重推出中国高校上市公司高管排行榜,受到社会各界的广泛关注。我们所采用的数据全部来源于百度词条、新浪财经、国泰安等,客观公正!如有需要,可联系爬虫俱乐部!

爬虫俱乐部将于2019年1月19日至25日在武汉举行两期Stata编程技术定制培训,此次采取初级班和高级班分批次培训模式,采用理论与案例相结合的方式,旨在帮助大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前还有少量名额大家抓紧时间报名啦!详细培训大纲及报名方式,请见往期推文《2019寒假Stata编程技术定制培训班》。报名表下载请点击文末阅读原文呦~

一个好听的名字能让人眼前一亮,英文取名也是如此。但是,大部分人对于英文名的内涵不甚了解,随意取名也往往闹出笑话。其实,每个名字都有其特殊的寓意。在这篇推文中,小编教大家如何用Stata爬虫技术挑选一个满意的英文名。

首先,我们登陆名字大全网站(http://www.resgain.net/index.html),可看到如下界面:

直接切换到“英文名”一栏下,如图所示,可以看到该网站为我们提供了大量的英文名字,及其对应的中文释义、名字印象、适合性别、来源、相关名人等内容。页面上方将英文名按照首字母A-Z分为26类,下拉到页面底端可以在当前首字母分类下进行翻页操作,例如点击字母“B”,选择页码“2”,即显示首字母为“B”的第2页英文名。除末页外,每页均排列20个不同名字。

在进行网页抓取之前,我们首先观察网页链接的变化规律。我们发现,点击不同的字母和页码,网页链接的开头部分http://www.resgain.net/english_names并不发生变化,只有后半部分的首字母和页码会改变。在网页源代码中,也可查看我们需要抓取的信息。因此,我们可通过copy命令,改变网页链接中的首字母和页码信息来循环抓取这个页面。

接下来,我们由浅入深,教大家如何获取该网站的所有英文名信息。

一、单个页面的英文名信息爬取

我们以字母“A”首页为例(http://www.resgain.net/english_names_a_1.html#),使用copy命令将该网页保存至文件 temp.txt 中,并读入Stata,执行程序:

clear
copy http://www.resgain.net/english_names_a_1.html#  temp.txt, replace
infix strL v 1-10000 using temp.txt, clear

此时,515行网页源代码均读入Stata中了。为更直观查看到源代码信息,我们返回页面,将鼠标定在该页空白处,单击右键→查看网页源代码,便可看到该网页的html编码信息(不同浏览器查看源代码的方式可能有差异,推荐大家使用chrome浏览器)。我们定位到该网页的1对表格符“ <table>...</table>”,位于源代码的第159行及第369行,两行之间的内容便是我们所需信息。

其次,进一步分析发现,“<tr>…</tr>”是1对行标识符,该标记中的内容显示在同一行。每对行标识符之间有3对列标识符“<td>...</td>”,该标记中的内容显示在同一列,即每行包括3列信息。在英文名下面,有时也另起一行,加入1-3对强调符“<div><strong>...</strong>...</div> ”,说明该英文名的适合性别、来源及相关名人。在表格符“ <table>...</table> ”之间正好出现60对列标识符“ <td>...</td> ”和部分强调符“<div><strong>...</strong>...</div> ”,即是我们需要提取的20行英文名、中文名、名字印象及相关注释等表格信息。同时,以上两对符号也仅存在于表格符之间。

经过分析,我们采用正则表达式,首先匹配到格式为“<td>.+</td> ”及“ <div>.+</div> ”的观测值,并将其保留。执行程序:

keep if ustrregexm(v,"<td>.+</td>|<div>.+</div>")

这时,dta文件中便只剩各表项值了,即是我们所需信息。list结果如下:

接着,我们生成一个新变量a用于定位含有不同英文名的观测值,即每行的开头位置。其次,采用长宽数据转换的方法将20个英文名下的6项信息排列至同一行。在转换宽型数据之前,我们先将所有尖括号“ <.*?>”里的内容替换为空,并去除“适合性别:”、“来源:”、“相关名人:”等字样。执行程序:

gen a = 1 if ustrregexm(v,"<td>(.+)<a href=")
gen b = sum(a)
bysort b: gen id = _n
drop a 
replace v = ustrregexra(v,"<.*?>", "")
replace v = ustrregexra(v, "适合性别:|来源:|相关名人:","")
reshape wide v, i(b) j(id)
drop b

由于每行并不都存在规律排列的6项信息,因此在转换后的数据中,有部分观测值出现错位问题。如下:

因此,我们进行必要的调整,使观测值位于相应的变量下,并更改变量名称。程序及最终结果如下:

replace v6 = v5 if v3 == "男"| v3 == "女"
replace v5 = v4 if v4 != "男"& v4 != "女"
replace v4 = "" if v4 != "男"& v4 != "女"
replace v3 = "" if v3 == "男"| v3 == "女"
rename (v1-v6) (英文名 中文名 名字印象 适合性别 来源 相关名人) save a_1.dta, replace

二、单个字母的英文名信息爬取

在这部分,我们将提取出字母“A”下所有页面的英文名信息。我们首先列出第1页至最后一页的网页链接,分析它们的规律。如下:

http://www.resgain.net/english_names_a.html

http://www.resgain.net/english_names_a_2.html

http://www.resgain.net/english_names_a_3.html

http://www.resgain.net/english_names_a_4.html

......

从第2页开始,除“a”后的阿拉伯字母变动外,所有链接其余部分均相同。我们再次分析第一页链接是否也有一样的规律,将链接补全为:www.resgain.net/english_names_a_1.html,仍能到达先前第一页的界面。可见所有页面均符合阿拉伯字母排序的规律。因此,我们采用循环句式,设置最大循环页码为100页,下载字母“A”下所有页面数据。其次,将单个网页爬取的思路套入循环中,生成多个页面的dta文件,并进行最终合并,将首字母“A”的英文名信息保存到一个dta文件中。

由于部分页面的英文名可能含有少于6项信息,如字母“A”下的第14页。在初步处理之后,数据如下:

因此,我们需先将其补全至6个变量,再进行调整观测值并重新命名变量。增加程序:

while `c(k)'<6 {
    local i = `c(k)'+1
    gen v`i'=""
}                    //若变量数小于6,则生成空值变量补全至6个变量

单个字母下英文名爬取完整程序如下:

clear
cap mkdir F:/英文姓名
cd F:/英文姓名
forvalues page = 1/100 {
  cap copy http://www.resgain.net/english_names_a_`page'.html#  temp.txt, replace
  infix strL v 1-10000 using temp.txt, clear
  keep if ustrregexm(v,"<td>.+</td>|<div>.+</div>")
  if _N == 0 {
            continue, break
  }           //若观测值为空,即页面不存在,到达了该字母页面的最后一页,终止循环
  gen a = 1 if ustrregexm(v,"<td>(.+)<a href=")
  gen b = sum(a)
  bysort b: gen id = _n
  drop a 
  replace v = ustrregexra(v,"<.*?>", "")
  replace v = ustrregexra(v, "适合性别:|来源:|相关名人:","")
  reshape wide v, i(b) j(id)
  drop b
  while `c(k)'<6 {
            local i = `c(k)'+1
            gen v`i' =""
  }                    //若变量数小于6,则生成空值变量补全至6个变量
  replace v6 = v5 if v3 == "男"| v3 == "女"
  replace v5 = v4 if v4 != "男"& v4 != "女"
  replace v4 = "" if v4 != "男"& v4 != "女"
  replace v3 = "" if v3 == "男"| v3 == "女"
  rename (v1-v6) (英文名 中文名 名字印象 适合性别 来源 相关名人)
  save a_`page'.dta, replace
}
***合并字母A的所有页面的dta文件
clear local file : dir "." files "a_*.dta" append using `file' save Aall.dta, replace

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙30000+粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了三节全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:

https://ke.qq.com/course/286526?tuin=1b60b462

敬请关注!

三、多个字母的英文名信息爬取

在以上两节的学习中,我们已经掌握了单个字母多个页面的爬取方法。在该部分,我们将爬取“英文名”一栏下的所有信息。首先列出字母A-Z的第一页网页链接,如下:

http://www.resgain.net/english_names_a_1.html

http://www.resgain.net/english_names_b_1.html

http://www.resgain.net/english_names_c_1.html

http://www.resgain.net/english_names_d_1.html

......

可见,所有链接均以“a”-“z”的顺序编排,且每个字母下的页面均可以按照页码循环。因此,我们只需要在第二节的基础上,增加一层关于字母的循环。最后,依然将单个网页爬取的思路套入循环中,将字母A-Z的所有英文名信息保存到一个dta文件中。完整程序如下:

clear
cap mkdir F:/英文姓名
cd F:/英文姓名
***获取所有英文名信息
foreach letter in `c(alpha)'{      //对字母进行循环
  forvalues page = 1/100 {        //每个字母下对页码进行循环
    cap copy http://www.resgain.net/english_names_`letter'_`page'.html#  temp.txt, replace
    infix strL v 1-10000 using temp.txt, clear
    keep if ustrregexm(v,"<td>.+</td>|<div>.+</div>")
    if _N == 0 {
             continue, break
    }           //若观测值为空,即页面不存在,到达了该字母页面的最后一页,终止循环
    gen a = 1 if ustrregexm(v,"<td>(.+)<a href=")
    gen b = sum(a)
    bysort b: gen id = _n
    drop a 
    replace v = ustrregexra(v,"<.*?>", "")
    replace v = ustrregexra(v, "适合性别:|来源:|相关名人:","")
    reshape wide v, i(b) j(id)
    drop b
    while `c(k)'<6 {
             local i = `c(k)'+1
             gen v`i' =""
    }                      //若变量数小于6,则生成空值变量补全至6个变量
    replace v6 = v5 if v3 == "男"| v3 == "女"
    replace v5 = v4 if v4 != "男"& v4 != "女"
    replace v4 = "" if v4 != "男"& v4 != "女"
    replace v3 = "" if v3 == "男"| v3 == "女"
    rename (v1-v6) (英文名 中文名 名字印象 适合性别 来源 相关名人)
    save `letter'_`page'.dta, replace
  }
}
***合并当前文件夹下格式为*_*的dta文件
clear local file : dir "." files "*_*.dta" append using `file' save english.dta, replace

如此,我们便用短短30余行代码将名字大全网站上的全部英文名信息爬取下来了,最终成果如下:

我们可轻松查看到5000多个英文名的中文释义、名字寓意及适用性别等信息,整个过程是不是非常轻松有趣呢?最后,让我们一起挑选一个心仪的英文名吧。若你喜欢“创造力强”这一印象,则执行如下程序:

use english.dta, clear
keep if index(名字印象,"创造力强")    //保留名字印象下含有"创造力强"一词的观测值

如下,便是所有包含该层含义的英文名了。现在,选择权交给你!

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


【声明】内容源于网络
0
0
Stata and Python数据分析
爬虫俱乐部,新的启航
内容 1337
粉丝 0
Stata and Python数据分析 爬虫俱乐部,新的启航
总阅读244
粉丝0
内容1.3k