最近看上了ATH-CKM77,打算从萌购入一个。众所周知萌购的汇率是中国银行日元人民币汇率中间价的1.01倍。于是想爬一下最近的汇率看看趋势。
找到URL
中行的官网
币种选成日元然后用firebug分析。
发现是向http://srh.bankofchina.com/search/whpj/search.jsp发送post请求:erectDate=¬hing=&pjname=1323&page=1
于是很明确,我们只用迭代page参数(pjname应该是日元的代号)就可以了。
curl的使用和html的解析
curl的使用也很方便,比起wget来说curl更适合写小型爬虫
1 | curl -d "erectDate=¬hing=&pjname=1323&page=$i" http: //srh .bankofchina.com /search/whpj/search .jsp
|
会爬出html。
那么
数据的获得
即可得到以两行为周期的html
在这里注意,awk可以和perl一样省略正文,像这样
1
|
grep 'hui12_20"' | awk 'NR%8==7||NR%8==0'
|
会自动被print $0
(当然不需要可读性的化还可以用(NR+1)%8 接下来
1
|
awk -F "[<>]" '{print $3}'
|
获得第三项(也就是正文)
awk和perl一样,也是容易被不懂的人认成“线路噪声”的语言
-F相当于在正文中指定NF,也就是字段分隔符,这是awk的一大特性,天然的行分隔,于是可以很方便地取出第几个字段。
“[<>]“看起来很中二(拖)但其实是很正常的表示,awk的NF可以使用正则语法,所以它表示的是小于号和大于号之中的一个,如果考虑通用性的化还可以在后面加上一个+,表示一个或以上<>的组合,诸如中间的><会被认成一个。
1
|
awk '{getline s;printf "%6.4f@%s\n",$0,s}'
|
这个就有意思了~getline可是好玩的东西
getline表示从某地方(如果不指定的话就是当前文件,可以用<指定从哪个文件读)读出一行,不指定位置(可以指定为getline s)会写到$0去。
于是这里表示把当前行的下一行(也就是日期的行)读到s,$0保持不变(中间价)然后printf出来。
把上面的用管道都连起来是这样:
1
2
3
4
5
|
curl -d "erectDate=¬hing=&pjname=1323&page=1" http: //srh .bankofchina.com /search/whpj/search .jsp 2> /dev/null
| grep 'hui12_20"'
| awk 'NR%8==7||NR%8==0'
| awk -F "[<>]" '{print $3}'
| awk '{getline s;printf "%6.4f@%s\n",$0,s}'
|
迭代和整理
当然,我们立刻就可以写成迭代,也就是
1
2
3
4
5
6
7
|
for ((i=1;i<100;i++)); do
curl -d "erectDate=¬hing=&pjname=1323&page=1" http: //srh .bankofchina.com /search/whpj/search .jsp 2> /dev/null
| grep 'hui12_20"'
| awk 'NR%8==7||NR%8==0'
| awk -F "[<>]" '{print $3}'
| awk '{getline s;printf "%6.4f@%s\n",$0,s}'
done
|
这会把前100页都爬下来。
然后我们还可以uniq一下,看汇率是什么时候变的
1
2
3
4
5
6
7
8
|
for ((i=1;i<100;i++)); do
curl -d "erectDate=¬hing=&pjname=1323&page=1" http: //srh .bankofchina.com /search/whpj/search .jsp 2> /dev/null
| grep 'hui12_20"'
| awk 'NR%8==7||NR%8==0'
| awk -F "[<>]" '{print $3}'
| awk '{getline s;printf "%6.4f@%s\n",$0,s}'
done
| uniq -w6
|
uniq的-w k参数表示只比较前面k个字符,如果是一样就直接认为整行相同。这也是我们在前面为什么要用%6.4f打价格的原因。
更加装那啥的写法是写成一行:
1
|
for ((i=1;i<100;i++)); do curl -d "pjname=1323&page=$i" srh.bankofchina.com /search/whpj/search .jsp| grep hui12_20\ "|awk -F" [<>] " '(NR+1)%8<2{print $3}'|awk '{getline s;printf " %6.4f@ "s" \n",$0}'; done | uniq -w6
|
共204字节