前两天,我打算下载点图片。用fiddler分析了下,结果那个网页大量使用js来操做cookie,弄得我头大。python
go却是有V8引擎的封装包,但是必须还得编译这个引擎,挺麻烦的。浏览器
想起来还有selenium-python能够用。就决定这个了。由于selenium没有python3.4的版本,不得不重装了python2.7。cookie
多说一句,python3确实比python2的组织等各个方面改进不少,写起来感受更好。惋惜第三方库稀少是硬伤。网络
当时个人思路是这样的,用python和selenium来操做浏览器,提取网页图片地址和标题,传递给go,由go下载。python2.7
之因此由go下载,是由于python2的urllib等网络库有问题,常常会下载资源失败却不返回错误。相比之下,go的net库能够保证只要错误值是nil,下载必然完整。编码
我写了个python脚本,该python脚本会从标准输入接受一个网址,而后返回标题,以后,会依次访问每一个漫画页面并返回图片网址。最后会输出一个结束标志。下载完毕后,能够再次接受网址进行下一次下载。url
能够用go的exec.Command启动python脚本,而后用*Cmd类型返回值的StdinPipe()、StdoutPipe()方法的返回值来实现与子进程的交互,使用Start()方法启动命令就好了。code
实际上是个很简单的程序,算上go程,log,加锁,监视剪贴板等等部分也不到80行。进程
戏肉来了。我发现当标题中包含汉字时,程序就会出问题。主程序没有得到标题,子命令挂掉了。图片
检查了一下,我认为有两种可能的缘由:
1)汉字编码问题。python会将汉字编码为本地编码(gbk)输出到标准输出;可是go会把它们看成utf-8编码处理。
2)这种调用外部命令并进行交互的状况,就不支持非ASCII码。
最后个人解决方案是在python脚本里将unicode字符串编码为utf-8字节串而后用base64编码,go里采用base64解码。这样无论是哪一个缘由确定都没问题了。由于主要耗时在下载上,这点不便无所谓。
不过具体是哪一种缘由,我就不清楚了。