发布时间:2022-08-09 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印

爬中国银行日元汇率的小爬虫

最近看上了ATH-CKM77,打算从萌购入一个。众所周知萌购的汇率是中国银行日元人民币汇率中间价的1.01倍。于是想爬一下最近的汇率看看趋势。

找到URL

中行的官网

币种选成日元然后用firebug分析。

发现是向http://srh.bankofchina.com/search/whpj/search.jsp发送post请求:erectDate=&nothing=&pjname=1323&page=1

于是很明确,我们只用迭代page参数(pjname应该是日元的代号)就可以了。

curl的使用和html的解析

curl的使用也很方便,比起wget来说curl更适合写小型爬虫

1
curl -d "erectDate=&nothing=&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=&nothing=&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=&nothing=&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=&nothing=&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字节