利用linux curl爬取网站数据

  1. 看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在结果嘛,呵呵。

    技术分享

2.首先利用curl工具后者wget工具把整个网站数据爬取下来

curl 网址 >wangzhan.txt

3.查看wangzhan.txt文件,找出规则,看到数据是存放在哪个地方,本人是把txt文件拷到本机上用UE打开方便查看。通过查看文件,我发现数据是存储在“var automultiMatchList”与 “var setSingleMulti”这间的所有行,每个行后面的},结束代表一行:

技术分享

4. 截取所需的数据我是通过以下5个步骤

技术分享

shell脚本分析:

(1)sed -n ‘/var automultiMatchList/,/var setSingleMulti/p‘ wangzhan.txt 

这步是指从wangzhan.txt文件中查找到包含“var automultiMatchList”的行与包含“var setSingleMulti”的行之间的所有行:

技术分享···

···

技术分享

(2)sed ‘$d‘ 是指删除最后一行的内容,因为这不是我们需要的数据。

(3)awk ‘NR<2‘ 是指把第一行取出来做特殊处理,因为第一行包含不要的数据(红色线框的内容)

技术分享

(4)awk -F‘= {‘ ‘{print $2}‘ 是指通过 ={ 分隔域,输出$2就把上步红色线框的内容去掉了

技术分享

(5)>1.txt 把第一行的数据输出到1.txt文件中

(6)第二条shell脚本中的awk ‘/[0-9]/{print $0}‘ 就是把最后的空行都去掉

技术分享

去掉最后的空行变成:

技术分享

(7)第二条shell脚本中的awk ‘NR>=2‘ >2.txt 是指把第二行及以下的所有行都输出到2.txt脚本

(8)awk 1 1.txt 2.txt>3.txt 这条命令是指把第一行和第二行及以下的所有行合并3.txt文件中,因为之前把第一行单独处理了,所以现在需要在合并到一块,相当于sql中union all。

(9)awk ‘{a=match($0,"\"3\"");print substr($0,a)}‘ 3.txt  这条命令,因为通过wangzhan.txt文件发现,我们需要的内容都是在“3”这个字符之后:

技术分享

这里用了awk的match和substr函数,就是找到“3”在这一行的所在位置之后,再截取需要的内容,这里不用过awk函数的同学可以复习一下awk函数。到这一步,我们要截取的数据的雏形就出来了。

技术分享

(10)tr -d ‘ ‘ 是指把空格都去掉

技术分享

(11)awk -F‘,‘ ‘{print $1" "$2" "$3" "$4" "$5" "$6" "$7}‘>data.txt  是指通过逗号分隔域,然后再通过空格隔开:

技术分享

(12)sed ‘s/"[[:alnum:]]\+"://g‘ 是指把冒号前面的数据都去掉,例如"3": 这种数据:

技术分享

(13)awk ‘{print $1,$2,$3,$4,$5,$6}‘ 是指只打印我们需要的6个域:

技术分享

(14)xargs -n3 是指按照每3列输出,我们执行下第5条命令,然后33.txt的数据,就是我们要的数据:

技术分享

总结:用shell爬取网站数据,需要熟悉sed,grep,awk等文本操作工具以及还运用到正则表达式,需要了解的内容比较多,比较繁琐复杂,

猜你喜欢

转载自www.cnblogs.com/hai-better/p/10013055.html