用go语言写爬虫

作者: lazypos | 来源:发表于2017-11-20 17:53 被阅读165次

            go语言写爬虫是十分方便的,关键是要有写爬虫的思想,网上例子很多,这里用一个原创的例子来重新简单说明下如何使用go语言写爬虫。

            这次要爬的是孔夫子旧书网,该网站主要是卖旧书的,有一些网友比较期待的旧书,一上架就会被人抢购,那么可以写一款爬虫来监控自己关心的旧书有新上架。

            首先示范下该网站的使用方法,主要是通过搜索自己想要的书来获取结果列表。

    搜索书名

    结果集如下:

    搜索结果

            我们选择按上架时间倒序排列,这样才会拿到最新上架的图书!可以看到我们访问的网址是http://search.kongfz.com/product/y0zk6bdbk4e3bk5e2dk8bedk5f55v6/ 这个网址显然经过了编码,经过点击别的排序方式,发现URL最后的v6是按上架时间排序的意思。

            把谷歌浏览器的开发者功能打开,来抓取当排序当时改变时候,向服务器发起的请求是什么。

    http请求抓取

            当尝试后发现这个请求比较可疑,我们复制下直接用浏览器访问:

    直接访问尝试

            很高兴!我们发现了服务器的查询接口,经过多次查询不同的图书名字,发现URL是固定的,type=1是在售图书的意思,变的参数只有params=后面的字符串,而且该串的前4个字母和后2个字幕是不变的,y0zk和v6,v6的意思是按上架时间倒序,前4个字母什么意思暂时不知道。

            那么问题来了,主要是params串中间值是什么,明显是加密过的,能想到的有2种方式破解,第一种是通过查找JS代码去找到加密的函数,另一种是尝试直接简单破解。先选第二种,毕竟不用看别人写的代码。

            先搜索1按上架时间倒序看看:

    搜索1

    似乎有眉目!除去前4位和后2位,31是1的16进制ASCII编码! 为了测试是否正确,搜索hello试试,

    hello

            去掉头尾,68k65k6ck6ck6f  哈哈,是hello的十六进制ASCII编码! 只是中间添加了K! 那么我们继续看之间搜索的 毛主席语录 去除头尾的编码:  6bdbk4e3bk5e2dk8bedk5f55, 去掉K后: 6bdb  4e3b 5e2d 8bed 5f55 ! 刚好五个段!看上去像是中文的unicode编码,去网上找找 6bdb 是什么字

    编码表

    果然在汉字编码表里找到了“毛”这个字。继续查找发现 后面几个字也符合,那么大公告成了!

    我们只要把需要的搜索内容进行编码(中文转编码,英文数字转16进制ascii,中间用k拼接,前后加y0zk和v6就可以组成params参数的内容了。)

    通过编码表尝试了几个搜索,确实正确,那么可以开始写代码了,代码难点在于如何把汉子转成编码,其实写代码是没有难点的,经过百度和查手册,写出这个函数:

    搜索内容编码

    另外就是解析json 了,这里不需要写成结构体解析,直接用map获取我们关心的信息(这里取最新的2条图书信息):

    解析json

    完成后运行测试效果还不错,我们可以通过配置多个关键字,去监控关心的图书,一旦有新书上架,就打印出来(可以进一步做提醒之类的):

    最终效果

    代码放在百度网盘,链接: https://pan.baidu.com/s/1hsb7xIW 密码: euix

    如果您觉得有用,请给点施舍, 啊哈哈哈哈哈哈。。。

    相关文章

      网友评论

        本文标题:用go语言写爬虫

        本文链接:https://www.haomeiwen.com/subject/vqavvxtx.html