在做内容測试的时候。发现我的爬虫(前些文章略有提及)在 netbeans 里面可以成功爬取网页内容,而单独执行时,给定一个 url,爬到的网页却与在浏览器里面打开 url 的网页全然不一样,这是一个非常诡异的问题。我在相应位置添加代码。把网页写入某一个文件。
结果发现,在 netbeans 里执行和单独执行两次写的文件的编码不一样。一个是 GBK 的编码,一个是 UTF-8 的编码,(我希望爬虫以 UTF-8 的方式执行,考虑到程序里面的字符串和数据库里面的字符串相应,都应该使用 UTF-8 编码)。于是,我推測。在 netbeans 里面是以 UTF-8 编码方式执行的,而单独执行是以 GBK 的编码方式执行的。当从数据库(UTF-8编码存储)读入一个带中文的 url 时。前者可以正确处理。而后者由于採用 GBK 编码,它以 GBK 的眼光去看待这个 UTF-8 编码的 url,就造成了 url 的扭曲。
如,我想抓取的 url 是
http://news.baidu.com/ns?ct=1&rn=20&ie=utf-8&bs="湖北法雷奥车灯有限公司"&rsv_bp=1&sr=0&cl=2&f=8&prevct=no&word="湖北法雷奥车灯有限公司"&tn=newstitle&inputT=0&companyId=21510
它在数据库中以 UTF-8 的方式存储。结果读入一个执行环境为 GBK 语言环境的程序里面。程序会以 GBK 的方式去识别这个 url ,那么。原始 url 在进入程序后,就变成了
http://news.baidu.com/ns?
ct=1&rn=20&ie=utf-8&bs="某些字符"&rsv_bp=1&sr=0&cl=2&f=8&prevct=no&word="某些字符"&tn=newstitle&inputT=0&companyId=21510
它把原先我要在百度新闻里面搜索的关键串:“湖北法雷奥车灯有限公司”变成了 “某些字符”。
(这里的“某些字符”并非这个字符串本身,而确实指某些字符)
显然它并不能按我所想的去訪问某个网页。因此,相当于它会去搜索一些稀奇古怪的内容。
在单独执行一个 jar 时,加上 -Dfile.encodeing=UTF-8 的选项。即是选择使用 UTF-8 的环境去执行这个程序。
如:
java -Dfile.encoding=UTF-8 -jar Spider.jar