项目场景:
最近项目种需要我去搜索引擎上按需求搜索网页并将其内容爬取出来,在爬取过程生成html文件时遇到一些问题,现在记录下来
问题描述:
1.爬取到部分页面加载速度满,或者不能加载出来;
2. 一些页面出现中文乱码
注:此次用到的技术包括webmagic,jsoup等页面抓取技术,webmagic通过Spider将目标url添加,并且复写process方法,参数为目标url的page,在这个方法里,可以通过xpath来获取各个节点的信息,我是通过这个方法将百度搜索的列表种的herf链接获取到,并将这些链接添加到待爬取的目标页面中,process方法类似递归方法,将目标url添加到待爬取的队列中后,继续执行process的方法.
String str = page.getHtml().xpath("//div[@id=wrapper_wrapper]/div[@id=container]/div[@id=content_left]/div/div[@id='"+i+"']/div/h3/a/@href").toString();
//获取目标页面的节点信息,也就是herf链接
//如果获取到,添加到待爬url
if (str != null){
page.addTargetRequest(str);
}
//利用jsoup来获取目标url的html内容
private String getUrlBody(String pageURL) {
try {
Document doc= Jsoup.parse(new URL(pageURL),(50000));
return doc.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
原因分析:
1.上述方法在百度爬取的时候,大概率不会出现中文乱码的问题,但是在一些网站,比如说中国搜索中使用,就会出现中文乱码的问题,这是因为页面的字符编码可能是GBK等其他编码方式。
2.部分网页加载慢的问题是因为拉取代码中很多herf省略了http://,造成加载慢。
解决方案:
1.首先,通过jsoup方法得到页面的编码类型
Document document = Jsoup.parse(new URL("https://www.cnblogs.com/blog5277/p/6704168.html"),5000);
//获取编码
String charset = document.charset().toString();
2.通过io流来设置流的编码类型
URL url = new URL("https://www.cnblogs.com/blog5277/p/6704168.html");
InputStream in =url.openStream();
buffreader = new BufferedReader(new InputStreamReader(in,charset));
String line;
StringBuffer buff = new StringBuffer();
while (null != (line = buffreader.readLine())) {
buff.append(line);
}
if (charset.toLowerCase().equals("utf-8")){
}
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\\Users\\Lenovo\\Desktop\\新建文件夹\\hh.html")),charset));
3.解决加载慢的问题,在得到buff后,使用replaceAll,将所有herf="//"更换为herf=“https://”
4.关于百度搜索反爬,每爬一次,设置过长的等待时间再进行第二次爬取。也可设置代理ip(),通过setDownloader()方法,将httpClientDownloader对象赋值setProxyProvider。(我没有成功)
5.某些网页需要证书认证,建议放弃