爬中国银行日元汇率的小爬虫
最近看上了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一样省略正文,像这样会自动被print $0 (当然不需要可读性的化还可以用(NR+1)%8 接下来
1grep
'hui12_20"'
|
awk
'NR%8==7||NR%8==0'
获得第三项(也就是正文) awk和perl一样,也是容易被不懂的人认成“线路噪声”的语言 -F相当于在正文中指定NF,也就是字段分隔符,这是awk的一大特性,天然的行分隔,于是可以很方便地取出第几个字段。 “[<>]“看起来很中二(拖)但其实是很正常的表示,awk的NF可以使用正则语法,所以它表示的是小于号和大于号之中的一个,如果考虑通用性的化还可以在后面加上一个+,表示一个或以上<>的组合,诸如中间的><会被认成一个。
1awk
-F
"[<>]"
'{print $3}'
这个就有意思了~getline可是好玩的东西 getline表示从某地方(如果不指定的话就是当前文件,可以用<指定从哪个文件读)读出一行,不指定位置(可以指定为getline s)会写到$0去。 于是这里表示把当前行的下一行(也就是日期的行)读到s,$0保持不变(中间价)然后printf出来。 把上面的用管道都连起来是这样:
1awk
'{getline s;printf "%6.4f@%s\n",$0,s}'
12345curl -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}'
迭代和整理
当然,我们立刻就可以写成迭代,也就是这会把前100页都爬下来。 然后我们还可以uniq一下,看汇率是什么时候变的
1234567for
((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的-w k参数表示只比较前面k个字符,如果是一样就直接认为整行相同。这也是我们在前面为什么要用%6.4f打价格的原因。 更加装那啥的写法是写成一行:
12345678for
((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
共204字节
1for
((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