fileexists:双管齐下提高效率

2017-08-21 闫续文 爬虫俱乐部 爬虫俱乐部

大大大大大新闻————自公众号推送视频讲解环节以来,深受广大读者朋友的喜爱。近日向我们提问的粉丝也是大幅增加呐!为了便捷管理相关信息,提高工作效率,我们对提问方式做了略微调整哟~提问者需点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

今天给大家介绍的是程序函数fileexists(“f”),它用来检查一个文件是否存在,如果某文件f存在,则输出结果为1,不存在或f为文件夹,则输出结果为0。

比如,我们想检查E盘里有没有“爬虫俱乐部.txt”这个文件:

clear

set more off

cd E:/

set obs 1

gen v = fileexists("爬虫俱乐部.txt")

list v

输出结果为1,说明E盘里有“爬虫俱乐部.txt”这个文件。

我们再来检查E盘里有没有文件“600900_1.dta”:

clear

cd E:/

set more off

set obs 1

gen v = fileexists("600900_1.dta")

list v

输出结果为0 ,说明E盘里没有文件“600900_1.dta”

我们进行网络爬虫时,如果要抓取的数据量很大,抓取的过程将会花费大量的时间,比方说抓取新浪上市公司公告,一共有将近240万条数据,那么有没有办法提高效率呢?我 们可以结合fileexists()函数,使用两个stata同时运行,一个stata用来copy网页源代码,另一个stata进行字符串处理并提取出 公告的内容,也就是说一个stata用来copy源代码,另一个stata进行判断,如果对应的源代码抓取了下来,就进行字符串处理并提取出公告的内容。

我们用抓取新浪上市公司公告为例,来讲解如何在爬虫过程中用fileexists()函数使copy网页源代码和字符串处理同时进行。

往期推文《朝花夕拾|新浪网上市公司公告整理》中介绍过如何抓取新浪上市公司的公告链接,这里我们使用抓取好的两个上市公司的公告链接,分别是600900长江电力和600000浦发银行,并在链接后附加股票代码和编号,用分号隔开,保存为“E:/新浪公告/公告链接.dta”,如下图所示:

1

我们打开一个stata使用“公告链接.dta”copy这两个上市公司所有公告的网页源代码。

clear

set more off

cap mkdir E:/新浪公告/公告内容

cd E:/新浪公告/公告内容

use E:/新浪公告/公告链接, clear

levelsof v, local(levels)

foreach v in `levels' {

    if ustrregexm("`v'","(.+?);") local url = ustrregexs(1)

    if ustrregexm("`v'",";(.+?);") local stkcd = ustrregexs(1)

    if ustrregexm("`v'",";(\d+)$") local num = ustrregexs(1)

    cap copy "`url'" `stkcd'_`num'.txt, replace

    while _rc != 0 {

         sleep `=10000*uniform()'

         cap copy "`url'" `stkcd'_`num'.txt, replace

    }

    dis "`stkcd'_`num'"

}

2

我们将所有的公告链接放在一个局部宏`levels’中,对所有的公告链接做循环。使用正则表达式"(.+?);"把开头到第一个分号前的网址提取出来放入`url’中,使用";(.+?);"把两个分号中间的股票代码提取出来放入`stkcd’中,使用";(\d+)$"把第二个分号后的数字提取出来放入`num’中。

这里需要注意一点,local后面是不能接if选项的:

所以我们把if提前,相当于

if ustrregexm("`v'","(.+?);") {

    local url = ustrregexs(1)

}

3

我们打开另一个stata来进行字符串处理并提取公告内容,我们用同样的方法将股票代码和编号放在局部宏`stkcd'、`num'中,使文件名一一对应。这个时候就轮到fileexists()函数出场啦!我们用fileexists()函数判断文件是否存在,如果不等于1即不存在,则休息2秒。程序如下:

clear

set more off

cd E:/新浪公告/公告内容

use E:/新浪公告/公告链接, clear

levelsof v, local(levels)

foreach v in `levels' {

    if ustrregexm("`v'",";(.+?);") local stkcd = ustrregexs(1)

    if ustrregexm("`v'",";(\d+)$") local num = ustrregexs(1)

    while fileexists("`stkcd'_`num'.txt") != 1 {

         sleep 2000

         continue

    }

    clear

    unicode encoding set gb18030

    unicode translate `stkcd'_`num'.txt, transutf8

    unicode erasebackups, badidea

    set obs 1

    gen v = fileread("`stkcd'_`num'.txt")

    replace v = ustrregexra(v,"[\d\D]+<pre>","")

    replace v = ustrregexra(v,"<br>[\d\D]+","")

    save `stkcd'_`num', replace

}

由于<pre>在源代码中是唯一的,我们删除开头到<pre>的所有内容,然后删除从<br>开始到结尾的所有内容。

需要注意,由于公告内容行与行之间存在换行符,而正则表达式“.”不能匹配换行符与回车符,因此,我们使用含义相反的一组元字符\d\D来匹配任意字符(详见推文《元字符“.”真的能够匹配任意单个字符吗?》)。

这样两个stata同时运行就大大提高效率啦!

什么?!没看懂!!不要紧!!戳下面,听爬虫小将的详细讲解,也欢迎大家的批评指正哟!

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

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过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分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号