问题描述:用java写一个爬取百度图片的程序,在网上找了一个代码之后运行,出现了一个大的问题。除了再编写爬虫的代码中能够运行成功之外,在其他类中调用这个方法都爬取不了数据。(爬虫程序写在Test类中)
Test类中的代码如下:
package com.dfy.crawler;
import org.jsoup.nodes.Document;
import com.dfy.util.Html;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
package com.dfy.crawler;
import org.jsoup.nodes.Document;
import com.dfy.util.Html;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author:
* @Date:2018/5/22
*/
public class Test {
public static void main(String[] args) throws Exception {
Test.getPictures();
}
public static void getPictures() throws Exception {
System.out.println("开始在百度爬取图片");
int max=4;
String keyword="七百弄";
for (int page = 0; page <= max; page++) {
System.out.println("正在解析第" + page + "页面");
Document doc = null;
String url = "http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=" + keyword
+ "&cg=star&pn=" + page * 30 + "&rn=30&itg=0&z=0&fr=&width=&height=&lm=-1&ic=0&s=0&st=-1&gsm="
+ Integer.toHexString(page * 30);
doc = new Html(url).getDocument();//本质是使用Joup获取Docment,Html类是封装后的
String reg = "objURL\":\"http://.+?\\.jpg";
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(doc.html());
while (m.find()) {
String URL = m.group().substring(9);
System.out.println(URL);
// imgurl.add(URL);
// source.add("百度");
}
}
System.out.println("百度的图片爬取完成");
}
}
运行结果如下:
从运行结果可以看出:已经爬取到了图片的url。
这个时候写另一个测试类是调用原来的方法。代码如下:
package com.dfy.crawler;
public class Test2 {
public static void main(String[] args) throws Exception {
Test.getPictures();
}
}
从代码可以看出, Test2的运行结果应该和Test的运行结果一样
但是运行结果是:
从运行结果可以看出,根本没有爬取到相关的url。
那么问题出在哪里呢?
经过一段时间的观察,我发现两个文件使用的编码不同,在Test中保存的时候因为有中文提示我保存为其他编码,有utf-8和默认的编码,默认的是gbk的编码。我习惯性的选择了utf-8。导致两者的编码不同,要传递给百度的url中的word字段是中文,传递过程种会编码。百度的应该是使用utf-8这种编码方式的,所以在Test2中出现了解析不成功。
最后把Test的编码改成utf-8就可以运行成功了。(里面的中文全部乱码,需要重新改回来)
爬虫程序参考地址:https://blog.csdn.net/greatkendy123/article/details/51759040