爬取必胜客-连享会爬虫系列

论坛 期权论坛 期权     
Stata连享会   2019-3-29 02:35   4867   0
作者:游万海 (福州大学)
Stata 连享会: 知乎 | 简书 | 码云
python 爬虫与文本分析专题-现场班
连享会-Python爬虫与文本分析现场班-山西大学 2019.5.17-19[h2]一起学空间计量……[/h2]
空间计量专题-西安 2019.6.27-30
Stata 与 R:好基友背景爬虫之工具:R,Stata 和 Python本文要干的事儿一. 网页结构图解分析1. 分析网页结构2. 编码转换二. 正则表达式--零宽断言1. 基本函数2. 零宽断言
连享会 Stata 爬虫和文本分析系列推文:
「Stata: 正则表达式和文本分析」
[h2]背景[/h2][h3]爬虫之工具:R,Stata 和 Python[/h3]统计计量软件众多,例如 R,Stata 和 python 等,每个软件都有自己的优点和缺点。
就爬虫而言,python 和 R 软件的功能已较为成熟,拥有一系列实现各类功能的包 (package)。比如 R 中的 rvest 包在爬取静态网站数据方面功能很强大,此外,还有 RCurl 和 XML 包等。
相比而言,Stata 虽然在格式化数据处理和计量分析方面非常高效,但在爬虫方面可能还处于 爬行 阶段。曾经有人调侃道:利用 Stata 软件来爬虫的都是比较文艺的 \^-^。
事实并非如此。自 Stata 发布 14.0 版本以来,其字符处理功能已大幅改善,再配合
  1. copy
复制代码
  1. curl
复制代码
等命令,Stata 的爬虫能力日渐强大。
  1. curl
复制代码
(https://curl.haxx.se/) 是一个在命令行下工作的文件传输工具,支持文件的上传和下载,可发送各种 http 请求 给网站,进而抓取网站内容保存到本地。
[h3]本文要干的事儿[/h3]本文将利用实例来对比 R,Stata 和 python 在爬虫方面的功能。「 100 行代码爬取全国所有必胜客餐厅信息」 一文中,作者利用 python 爬取了全国所有 必胜客餐厅信息 ,包括:餐厅名,地址和电话号码。借鉴该文的分析思路,本文利用 Stata 和 R 软件对其结果进行重现,爬取全国必胜客餐厅相关信息,以此说明使用 Stata 和 R 爬取数据的步骤和流程。
爬虫的第一步是分析网址,找出其中的规律,以便写循环实现自动爬取;接下来就是把网页信息复制 ( copy ) 下来,保存为 .txt 或其他便于读入统计或计量分析软件的数据文件。
  1. copy
复制代码
命令是 Stata 中常用的一个爬虫命令,但是在本例中却无法使用。分析必胜客官网网址可以发现,当切换城市时,网址不会随之改变,这时就不能构造有效的地址对其进行循环爬取。为此,我们使用外部命令
  1. curl
复制代码
命令来实现。
数据的爬取主要包括两部分:第一,从网站上将包含数据信息的源代码下载到本地。这里就涉及到需要对爬取的网站进行详细分析,对于这个网站更加详细的分析,大家可以看之前作者写的推文;第二,利用字符函数或正则表达式对下载的文本文件进行处理,这部分可以详细看之前的一个推文(https://blog.csdn.net/arlionn/article/details/85156842)。
本文分如下部分进行说明:第一,对网页结构进行分析;第二,讲解正则表达式中的零宽断言;第三,对必胜客餐厅分布信息进行抓取;第四,对文章内容进行总结;第五,参考资料说明。
[h2]一. 网页结构图解分析[/h2][h3]1. 分析网页结构[/h3]打开(http://www.pizzahut.com.cn/StoreList) 可以发现下图,当我们切换城市时,相应城市网址不会改变。此时利用 copy 命令,那只能下载其中某个城市一页的数据。

为了进一步了解网站信息,可以利用 google 浏览器,按 F12 会跳出一个页面,再按 F5 刷新 (注意:如果是 win 10 系统,要按 ctrl + R),可以看到如下页面:

我们点击 StoreList,然后出现页面如下,我们可以看到网页的一些 cookie 信息,其中 iplocation 其实就是城市的转码,也就是说,变换这个字段,其实就是切换城市。

[h3]2. 编码转换[/h3]为了进一步验证,我们利用 R 中 curl 包的 curl_escape 函数将字符进行URL转码。例如
    1. library(curl)
    复制代码
    1. x = "福州"
    复制代码
    1. curl_escape(x)  ## 输出  %E7%A6%8F%E5%B7%9E
    复制代码
对比上述输出结果与 iplocation 的并不相同,根据开始介绍那篇推文作者,我们可知其实是 福州|0|0 的转码,
    1. x="福州|0|0"
    复制代码
    1. curl_escape(x) ## 输出   %E7%A6%8F%E5%B7%9E%7C0%7C0
    复制代码
当然,这里主题是讲 Stata 软件,我们若想所有程序都在 Stata 环境中运行,那么可以通过
  1. rcall
复制代码
命令在 Stata 中调用 R 程序。详细的用法可以查看 (https://github.com/haghish/rcall), 这个命令已经在 Stata Journal 2019年第1期正式刊登出来。
    1. github install haghish/rcall /**利用github安装rcall**/
    复制代码
    1. rcall:print("Hello world")
    复制代码
    1. rcall:library(curl)
    复制代码
    1. rcall:x="北京市|0|0"
    复制代码
    1. rcall:print(curl_escape(x))
    复制代码
大家可以发现,这正是 城市|0|0 的 URL 转码恰好是 iplocation 所表示的,通过改变这个字段就可以实现城市的切换。但是,对于同一城市不同页码切换,还需要进一步发现。当我们点击左边的下一页时,可以发现在列表会多一个 Index 选项,点进去发现 From Data 下面有 pageIndex和 pageSize 两个字段,至此我们知道了如何定义页码,以便进行循环。

[h2]二. 正则表达式--零宽断言[/h2][h3]1. 基本函数[/h3]Stata 14 版本主要的正则表达式函数有:
  1. ustrregexm
复制代码
  1. ustrregexrf
复制代码
  1. ustrregexra
复制代码
  1. ustrregexs
复制代码
,ustr 代表 unicode string 。
     
  1. ustrregexm
复制代码
:   匹配
     
  1. ustrregexrf
复制代码
: f 代表 first ,表示只替代第一次出现的匹配字符。
     
  1. ustrregexra
复制代码
: a 代表 all ,表示替代全部匹配到的字符。
     
  1. ustrregexs
复制代码
:   截取
[h3]2. 零宽断言[/h3]正则表达式中有许多的匹配规则,这里不在一一说明,请大家花几分钟看 (https://blog.csdn.net/arlionn/article/details/85156842), 这里再给大家介绍一种用法,即 零宽断言,主要有如下四种类型:
      (?=exp): 零宽度正预测先行断言,它断言自身出现位置的后面能匹配表达式 exp
      (?[h3]3. 应用实例[/h3]例如,如下数据为 6 位同学的各科成绩,我们想计算每位同学的总成绩,那么需要把数字部分提取出来
    1. clear
    复制代码
    1. input str64 x
    复制代码
    1. "math:96 chinese:85 english:92 physical:90"
    复制代码
    1. "math:91 chinese:82 english:88 physical:98"
    复制代码
    1. "math:86 chinese:85 english:81 physical:90"
    复制代码
    1. "math:93 chinese:85 english:88 physical:90"
    复制代码
    1. "math:70 chinese:85 english:83 physical:91"
    复制代码
    1. "math:80 chinese:85 english:81 physical:92"
    复制代码
    1. end
    复制代码
方法一 :可以利用 moss (Find multiple occurrences of substrings) 命令,代码如下:
    1. moss x, match("([0-9]+|[a-z]+)") regex
    复制代码
    1. list _match*
    复制代码
方法二:利用零宽断言方法进行提取,我们观察到这些数字都是位于
  1. :
复制代码
符号之后,那么我们想是否可以通过如下提取:
  • [code]local regex "(?
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:190
帖子:39
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP