爬取俱乐部网站,获取推文目录及网址

2017-11-30 胡俊电子科技大学 爬虫俱乐部 爬虫俱乐部

11

30

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

ps:(1)喜大普奔,爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~(2)爬虫俱乐部将于2018年1月20日至28日在武汉举行两期Stata编程技术定制培训。详情请戳《stata编程技术定制培训班》

本菜鸟初学stata,偶然间通过一篇推文(具体哪一篇已经忘记)查找到“爬虫俱乐部”的微信公众号。仿佛打开了新世界,stata居然也可以爬虫?!人生苦短,请用python,生活不止python,还可以stata,哈哈哈……

于是我立马打开微信公众号的历史消息:

然后就翻啊翻啊,这不错那也不错,收藏,收藏……统统收藏,留着以后慢慢学习。

可是,翻啊,翻啊,如果我期间回复个消息,又要从新开始翻……其实我的内心是崩溃的。于是我就想要是有个目录就好了,这样的话,想要的推文一目了然,方便随时查看。但是怎么做呢?

有一天,我在一篇推文的底部发现了一个惊喜:

stata主站不仅可以让我们在电脑上查看推文,还能找到往期推文,简直不要太方便啊。

于是迫不及待的我打开电脑,输入网址,看到:

原来爬虫俱乐部的推文已经有31页了,随着时间的推移,推文的数量还会继续增加,而且点击的时候网速还很慢,不方便查找,怎么办,怎么办?

正在为其苦恼的我突然灵光一闪。咦!为什么不试试爬取所有的推文名称和网址,然后把它们制作成目录,这样不就一目了然了吗?此所谓师夷长技以制夷,真是被自己聪明坏了。

查看URL

第一页网址:

第二页网址:

第三页网址:

通过分析,我们可以发现,每一页的url是有规律的,变化的部分只有最后的页码。这就证明了本菜鸟的想法是十分可行的,而且难度还不大。

查看源代码

点击其中一篇推文,可以看到推文网址链接的一部分是该推文的题目:

因此只要我们爬取每篇推文的题目,就可以构建相应的的链接。

首先爬取第一页试试:

clear

cap mkdir e:/推文合集

cd e:/推文合集

 cap copy "https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/" temp.txt,replace

shellout temp.txt

得到github主站的源代码:

fileread()函数导入源代码,并进行字符串处理:

clear

set obs 1

gen v = fileread("temp.txt")

split v ,p(`"<a href="/推文"')

sxpose ,clear

drop in 1/2

gen title = ustrregexs(1) if ustrregexm(_var1,"/(.+?)/")

gen url = "https://stata-club.github.io/推文/" + title + "/"

drop _var1

结果如下图所示:

这样第一页推文的题目和链接我们就拿到了,那么怎么做循环抓取所有页面呢?我们前边已经分析推文的网页链接,第一页的网址为:https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/;(注意网址中的%E6%8E%A8%E6%96%87为推文的百分比编码)第二页及以后为:https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/page/2/https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/page/3/...

因此我们可以对页码进行循环,那么页数怎么确定呢?有两种思路:(1)先抓取页码信息,再将页码放入局部宏中,然后进行循环;(2)设置一个足够大的页码,当超过网页的最大页码,设置条件终止循环。下边介绍一下第二种方法。

forvalue i = 1(1)500 {

              if `i' == 1 {

                     dis "第`i'页"

                     cap copy "https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/" `i'.txt,replace

              }

              else {

                     dis "第`i'页"

                     cap copy "https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/page/`i'/" `i'.txt,replace

                if _rc != 0 {

                        dis "一共`=`i'-1'页,抓取完毕"

                        continue ,break

               }

       }

  }

通过执行以上程序,我们就可以拿到所有页的网页源代码,这里我们设置最大页为500进行抓取,当超过网页最大页码时,就会终止循环。拿到了源代码,字符串处理就非常简单了,上边我们已经给出处理过程,下边是完整程序:

clear

cap mkdir e:/推文合集

cd e:/推文合集

forvalue i = 1(1)500 {

      if `i' == 1 {

           dis "第`i'页"

           cap copy "https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/" temp.txt,replace

           }

           else {

                 dis "第`i'页"

                 cap copy "https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/page/`i'/" temp.txt,replace

                 if _rc != 0 {

                      dis "一共`=`i'-1'页,抓取完毕"

                      continue ,break

                 }

           }

           clear

           set obs 1

           gen v = fileread("temp.txt")

           split v ,p(`"<a href="/推文"')

           sxpose ,clear

           drop in 1/2

           gen title = ustrregexs(1) if ustrregexm(_var1,"/(.+?)/")

           gen url = "https://stata-club.github.io/推文/" + title + "/"

           drop _var1

           save `i',replace

 }

得到如下结果:

到此你已经拿到了31页的推文题目和链接,接下来进行合并并导出到excel:

clear

fs *.dta

foreach c in `r(files)' {

      append using `c'

}

export excel using 推文合集.xlsx ,replace firstrow(variables)

利用excel 函数 =HYPERLINK( )将链接生成超链接(excel中点击就可以打开网页),经测试有效。

那么在接下来的学习中,我就可以轻松找到之前的推文啦!!!开心ing。

附完整代码

clear

cap mkdir e:/推文合集

cd e:/推文合集

forvalue i = 1(1)500 {

      if `i' == 1 {

           dis "第`i'页"

           cap copy "https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/" temp.txt,replace

           }

           else {

                 dis "第`i'页"

                 cap copy "https://stata-club.github.io/categories/%E6%8E%A8%E6%96%87/page/`i'/" temp.txt,replace

                 if _rc != 0 {

                      dis "一共`=`i'-1'页,抓取完毕"

                      continue ,break

                 }

           }

           clear

           set obs 1

           gen v = fileread("temp.txt")

           split v ,p(`"<a href="/推文"')

           sxpose ,clear

           drop in 1/2

           gen title = ustrregexs(1) if ustrregexm(_var1,"/(.+?)/")

           gen url = "https://stata-club.github.io/推文/" + title + "/"

           drop _var1

           save `i',replace

      }

clear

fs *.dta

foreach c in `r(files)' {

    append using `c'

}

export excel using 推文合集.xlsx ,replace firstrow(variables)

注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

文字编辑/徐露露

技术总编/刘贝贝


往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.命令sum2docx输出统计量表到docx文件

4.reg2docx报告你的实证结果吧!

5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件

6.putdocx+wordconvert—将实证结果输出到Word.docx)文档

7.Stata 15Markdown——没有做不到,只有想不到!

8.矩阵和宏的故事

9.shelloutopen anything

10.Putpdf--神奇的转换工具



关于我们

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

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

投稿邮箱:statatraining@163.com

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

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号

公开收集正在保存拖拽至此处以完成收集私密