用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语言写爬虫

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

  • 《Go语言四十二章经》第四十一章 网络爬虫

    《Go语言四十二章经》第四十一章 网络爬虫 作者:李骁 41.1 go-colly go-colly是用Go实现的...

  • Python爬虫有什么用?容易学吗?

    在爬虫领域,Python几乎是霸主地位,虽然C++、Java、GO等编程语言也可以写爬虫,但Python更具优势,...

  • [LeetCode By Go 76]Add to List 1

    本体不能用go语言写,因此用C语言 题目 Write a function that takes an unsig...

  • 爬虫练手-豆瓣top250(go版以及python版)

      最近学习go,就找了一个例子练习【go语言爬虫】go语言爬取豆瓣电影top250,思路大概就是获取网页,然后根...

  • 安装golang1.5

    golang1.5实现了自举. 意思就是用go语言写的go语言. 这样想编译安装go就不好办了...因为你都没有g...

  • [LeetCode By Go 102]141. Linked

    这道题不能用go写,所以用C语言写的 题目 Given a linked list, determine if i...

  • Docker常用命令

    Docker命令源代码 Docker的源代码全部是用Go语言写的。其中, commands.go 是docker的...

  • go语言爬虫(二)

    根据前面学习的爬虫方面的知识,自己最中国国旅网页进行了爬虫,现将代码分享如下: 未完待续

  • Go语言爬虫(一)

    过去的六个月由于一些原因在Go的学习上面花的精力很少,很庆幸在这段时间有不少人关注我,接下来主要学习Go在开发的一...

网友评论

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

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