本文do-file及相关文件 链接:https://pan.baidu.com/s/1smVkcUh 密码:40uq
若链接失效,请私信,看到会复,谢谢。
下面开始抓取1000个网页的源代码,分别为temp1.txt—temp1000.txt保存在 e 盘 2 文件夹中,并再次使用 “合并.bat” 将1000个 txt 合并为一个文件 all.txt,先把命令放在这,下面逐一解释:
注意:第一行的 local 命令必须与下面两次循环一起 run,否则提示错误,原因下面解释。
使用 local 命令生成一个临时变量 N = _N(注:在stata中 _n 与 _N 都是默认变量,有其固定含义,_N表示的是obsevations的个数,这里当然就等于 1000,_n则表示从1到1000,若要理解这两个,可以使用 gen N = _N,与 gen n = _n,然后browse查看 N 与 n 有何区别),但是 local 命令生成的变量 N 不会显示在变量窗口中,而是暂时存储在stata的内存中,需要的时候可以进行调用。下面举一个小小的例子演示 local 的作用(需要注意的是 local命令行与下一行调用local 生成的变量的命令必须一起运行,否则会提示出错,因为local 宏命令产生的变量只是临时的,一旦遇到end of do-file【观察stata主界面,每运行完一条命令都会提示end of do-file】便会将生成的临时变量删除,无法再次调用,详见下下图中官方给出的英文解释,已用蓝色部分标出,尤其是最后一句):
关于 marco 宏的进一步解释,有兴趣的可以参见官方给的 help 文件中相关说明,如下:
理解了local 之后再去看接下来的两次循环就容易得多,第二次循环是将 url 变量与 purl 变量(purl变量是之前的1000个链接)一一对应并储存起来,但不显示在变量窗口,而第三次循环则是调用 url 变量储存的1000个网址,并将这1000个网页的源代码 copy 下来,储存在e盘的 2 文件夹中,命名为temp1.txt—temp1000.txt,此一过程得看网速,大约耗时30分钟左右,像下图这样就看着数字变,最后到 temp1000.txt 就是完成了。之所以会提示not found是因为我们在抓取命令后附加了 replace 的 option,也就是告诉 stata 如果发现 e 盘 2 文件夹中有同名文件就将其替换掉,但是stata发现没有同名文件,于是它就提示 not found 并按要求生成新文件,若stata发现有同名文件,则不会有此提示,而是直接将其替换。
漫长的等待之后,最后再用我们之前在 part 1中用过的 bat 批处理命令调用dos将1000个 txt 合并为 all.txt(这次是在文件夹 2 中进行处理,与之前 all.txt 是不一样的哦)。至此就得到了1000个网页的源代码,这1000个网页源代码就很重要了,因为我们需要的GDP信息全部都包含在里面了。同理,我们用 infix 命令将其读进 stata 进行处理,命令见文初的图,因文本辆较大,读文本之前最好先clear一下,不然有可能会导致stata崩溃,写了半天的dofile要是没保存就不好了(具体原因不知道,推测可能是内存不够用?.?)。
文本读进去之后为一个变量 v,然后开始过滤,提纯工作,这也是最为繁杂的工作了,因为要从共 735748 行代码中提取出仅两个信息,一个是 “某某地区几几年”,一个是 “GDP”。根据我们需要的信息,我们去寻找包含这两个信息的关键行,观察其所在的行都有什么共同的特点,通过观察我们看到,地区名字所在的行都含有 <title> 这样的字符,而GDP或者是生产总值所在的行都含有 “生产总值” 这样的字符(如下图),故我们只需要将包含有这两个字符的代码行保留即可。
第1步:设置两个指标变量(以dummy variable虚拟变量的形式出现)a 和 b。对 a 变量来说,如果 v 变量(即全部代码行所在的变量)中含有 <title> 则让 stata 返回值1,表示 “是含有”,否则返回0,表示 “不含”。同理以 “生产总值” 为指标生成 b 变量。然后,keep if a==1 | b==1表示将含有 <title> 或者含有 “生产总值” 的行 keep 下来。这一步就将代码行数迅速过滤,缩减至至仅 4570 行。
第2步—第N步:全部是切割,保留,切割,保留,切割,保留.....因为处理方式可以仁者见仁智者见智,我的不一定就是最好的,但原理是一样的。因此仅对使用的部分命令与函数进行解释,见do-file中相关注释【strpos、duplicates drop】。
可以看到,有些数据前面还有一些乱七八糟的字符,这是因为每份公报的书写格式不统一造成的,需要继续进行处理,方法同上面一样,split,replace and keep,这里不做继续演示,感兴趣的可以继续。
随机找几个数据去网站上查询核对,看对应的数据是否准确。如我这里从上图的左右分别随便挑出合肥市2015年 与 九江市2013年去验证,查询结果如下,经核对,准确无误:
最后,对于空缺的部分,可以单独去网站寻找数据将其补齐。此外,本次应得1000行数据,但是最终却得到了 1015 行数据,究其原因可能还是公报的格式不完全统一造成的,而且有的数据是省的GDP(较少),有的是市的GDP,因此有重复部分。这类错误还得根据研究者需求自行处理。
好了,至此本篇详解就完结了,撒花!(0.0)
最后一个tips:stata 12、13 白色主界面默认是不支持中文的,显示中文为乱码,可以在主界面任意位置右键—>Preferences,然后将 color scheme 的模式由 Standard 改成 Classic 经典模式即可正常显示中文。