作者: pingc

介绍

JProcessor是一个抽象数据处理器类,用于对请求返回的数据进行系统的处理,并且可进一步对解析出来的url进行抓取。

使用JProcessor需要创建一个类来继承JProcessor,实现process方法。


实例

process方法的形参是Jpage,这个方法就是用来处理请求返回的数据,可调用addGoUrl或addGoUrls来添加url继续爬虫任务。

这里用一个小说网站的爬虫来演示:

继承Jprocessor抽象类

  1. import com.jnewbie.request.JPage;
  2. import com.jnewbie.JProcessor;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.util.List;
  8. public class DemoJProcessor extends JProcessor {
  9. @Override
  10. public JPage process(JPage jPage) {
  11. String url = jPage.getUrl();
  12. //判断url是不是搜索页面
  13. if(url.contains("s?q")){
  14. //获取搜索结果url,写个替换域名进去,因为出来的url没有带域名/book/28659/
  15. List<String> urls = jPage.xpath("//h4[@class='bookname']/a/@href").replaceFirst("/","https://www.biquge7.com/").getAll();
  16. //把结果加入到爬取列表
  17. jPage.addGoUrls(urls);
  18. }
  19. //判断url是不是详情页面
  20. else if(url.contains("book") && !url.contains("html")) {
  21. //获取书名
  22. String name = jPage.xpath("//h1/text()").get();
  23. //打印书名
  24. System.out.println(name);
  25. //获取章节列表url,写个替换域名进去因为出来的url没有带域名/book/28659/
  26. List<String> urls = jPage.xpath("//div[@class='listmain']//dd/a/@href").replaceFirst("/","https://www.biquge7.com/").getAll();
  27. //把章节列表url,加入到爬取列表
  28. jPage.addGoUrls(urls);
  29. }
  30. //判断url是不是章节内容页面
  31. else if(url.contains("book") && url.contains("html")){
  32. //获取小说名
  33. String name = jPage.xpath("//div[@class=\"path wap_none\"]/a[2]/text()").get();
  34. //获取章节标题
  35. String title = jPage.xpath("//span[@class=\"title\"]/text()").get();
  36. //获取正文
  37. List<String> text = jPage.xpath("//div[@id='chaptercontent']/text()").trim().getAll();
  38. //打印小说标题
  39. System.out.println(title);
  40. //存储的目录
  41. String path = "C:\\Users\\YRJ\\Desktop\\xs";
  42. try {
  43. File file=new File(path+"\\"+name);
  44. if(!file.exists()){//如果文件夹不存在
  45. file.mkdir();//创建文件夹
  46. }
  47. //创建流
  48. BufferedWriter out = new BufferedWriter(new FileWriter(path+"\\"+name+"\\"+title+".txt"));
  49. //写入到本地
  50. for (String s : text) {
  51. out.write(s);
  52. out.newLine();
  53. }
  54. out.close();
  55. } catch (IOException e) {
  56. System.out.println(e);
  57. }
  58. }
  59. return jPage;
  60. }
  61. }

开始入口

  1. public class Demo {
  2. public static void main(String[] args) {
  3. //创建请求客户端
  4. JHtml jHtml = new JHtml();
  5. //创建数据处理器
  6. DemoJProcessor demoJProcessor = new DemoJProcessor();
  7. //将客户端加入到处理器
  8. demoJProcessor.setJHtml(jHtml)
  9. //设置请求方式
  10. .setGetMethod(JHtml.GET)
  11. //设置抓取url
  12. .setUrl("https://www.biquge7.com/s?q=斗破苍穹")
  13. //追加抓取url
  14. //.addUrl("")
  15. //单线程
  16. //.run();
  17. //异步多线程数
  18. .start(5);
  19. }
  20. }