zoukankan      html  css  js  c++  java
  • 爬中国银行日元汇率的小爬虫

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

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

    最近看上了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字节
  • 相关阅读:
    求求你规范下你的代码风格
    为啥用ip不可以访问知乎,而百度却可以?
    漫画:htts是如何保证一台主机把数据安全发给另一台主机
    如何从亿量级中判断一个数是否存在?
    广播路由算法 :我是如何优雅着把悄悄话带给其他人的
    什么?你不知道0.0.0.0和255.255.255.255这两个地址是干嘛的?
    一篇文章带你学会Linux三剑客之一:awk
    你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?
    通俗易懂讲解TCP流量控制机制,了解一下
    一文读懂拥塞控制
  • 原文地址:https://www.cnblogs.com/lexus/p/2513007.html
Copyright © 2011-2022 走看看