作者: pingc
介绍
JProcessor是一个抽象数据处理器类,用于对请求返回的数据进行系统的处理,并且可进一步对解析出来的url进行抓取。
使用JProcessor需要创建一个类来继承JProcessor,实现process方法。
实例
process方法的形参是Jpage,这个方法就是用来处理请求返回的数据,可调用addGoUrl或addGoUrls来添加url继续爬虫任务。
这里用一个小说网站的爬虫来演示:
继承Jprocessor抽象类
import com.jnewbie.request.JPage;import com.jnewbie.JProcessor;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.List;public class DemoJProcessor extends JProcessor {@Overridepublic JPage process(JPage jPage) {String url = jPage.getUrl();//判断url是不是搜索页面if(url.contains("s?q")){//获取搜索结果url,写个替换域名进去,因为出来的url没有带域名/book/28659/List<String> urls = jPage.xpath("//h4[@class='bookname']/a/@href").replaceFirst("/","https://www.biquge7.com/").getAll();//把结果加入到爬取列表jPage.addGoUrls(urls);}//判断url是不是详情页面else if(url.contains("book") && !url.contains("html")) {//获取书名String name = jPage.xpath("//h1/text()").get();//打印书名System.out.println(name);//获取章节列表url,写个替换域名进去因为出来的url没有带域名/book/28659/List<String> urls = jPage.xpath("//div[@class='listmain']//dd/a/@href").replaceFirst("/","https://www.biquge7.com/").getAll();//把章节列表url,加入到爬取列表jPage.addGoUrls(urls);}//判断url是不是章节内容页面else if(url.contains("book") && url.contains("html")){//获取小说名String name = jPage.xpath("//div[@class=\"path wap_none\"]/a[2]/text()").get();//获取章节标题String title = jPage.xpath("//span[@class=\"title\"]/text()").get();//获取正文List<String> text = jPage.xpath("//div[@id='chaptercontent']/text()").trim().getAll();//打印小说标题System.out.println(title);//存储的目录String path = "C:\\Users\\YRJ\\Desktop\\xs";try {File file=new File(path+"\\"+name);if(!file.exists()){//如果文件夹不存在file.mkdir();//创建文件夹}//创建流BufferedWriter out = new BufferedWriter(new FileWriter(path+"\\"+name+"\\"+title+".txt"));//写入到本地for (String s : text) {out.write(s);out.newLine();}out.close();} catch (IOException e) {System.out.println(e);}}return jPage;}}
开始入口
public class Demo {public static void main(String[] args) {//创建请求客户端JHtml jHtml = new JHtml();//创建数据处理器DemoJProcessor demoJProcessor = new DemoJProcessor();//将客户端加入到处理器demoJProcessor.setJHtml(jHtml)//设置请求方式.setGetMethod(JHtml.GET)//设置抓取url.setUrl("https://www.biquge7.com/s?q=斗破苍穹")//追加抓取url//.addUrl("")//单线程//.run();//异步多线程数.start(5);}}
