在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

爬取网站数据

2016-7-29 15:47| 发布者: zhangjf| 查看: 537| 评论: 0

摘要: 自己写的爬虫(java),可扩展 package com.zzger.model;import java.util.ArrayList;i ...
自己写的爬虫(java),可扩展
  1. package com.zzger.model;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.concurrent.CountDownLatch;
  6. import com.zzger.module.queue.UrlQueue;
  7. import com.zzger.util.HttpUtils;
  8. import com.zzger.util.RegexUtils;
  9. public class WebSite {
  10. /**
  11. * 站点url
  12. */
  13. private String url;
  14. /**
  15. * 需要爬行的url队列
  16. */
  17. private UrlQueue<String> urls = new UrlQueue<>();
  18. /**
  19. * 已爬行过的页面url
  20. */
  21. private List<String> exitUrls = Collections.synchronizedList(new ArrayList<>());
  22. private static final int TOTAL_THREADS = 12;
  23. private final CountDownLatch mStartSignal = new CountDownLatch(1);
  24. private final CountDownLatch mDoneSignal = new CountDownLatch(TOTAL_THREADS);
  25. public WebSite(String url){
  26. this.url = url;
  27. urls.offer(url);//把网站首页加入需要爬行的队列中
  28. }
  29. public void guangDu(){
  30. new Thread(new Runnable() {
  31. @Override
  32. public void run() {
  33. paxing(HttpUtils.httpGet(url));
  34. }
  35. }).start();
  36. }
  37. public void paxing(String html){
  38. if(html.lastIndexOf("下一页</a></li></ul></div>")<0) return ;
  39. String strList = html.substring(html.indexOf("<li class="next-page">"),
  40. html.lastIndexOf("下一页</a></li></ul></div>"));
  41. String url = RegexUtils.RegexString("<a href="(.+?)"", strList);
  42. if(url.equals("Nothing")) return ;
  43. urls.put(url);//把url存储到队列中
  44. paxing(HttpUtils.httpGet(url));
  45. }
  46. public void dxcPx(){
  47. Page<DuanZi> page = new Gxpage(urls.take());
  48. List<Section<DuanZi>> list = page.ybhqSection().getSections();
  49. for(Section<DuanZi> section : list){
  50. new Thread(new Runnable() {
  51. @Override
  52. public void run() {
  53. mStartSignal.countDown();// 计数减一为0,工作线程真正启动具体操作
  54. try {
  55. mStartSignal.await();// 阻塞,等待mStartSignal计数为0运行后面的代码
  56. // 所有的工作线程都在等待同一个启动的命令
  57. } catch (InterruptedException e) {
  58. e.printStackTrace();
  59. }
  60. DuanZi duanzi = section.select().getModel();
  61. System.out.println(duanzi.getTitle());
  62. mDoneSignal.countDown();// 完成以后计数减一
  63. }
  64. }
  65. ).start();
  66. }
  67. try
  68. {
  69. mDoneSignal.await();// 等待所有工作线程结束
  70. }
  71. catch (InterruptedException e)
  72. {
  73. e.printStackTrace();
  74. }
  75. dxcPx();//线程任务执行完后,再次获取url队列进行任务
  76. }
  77. public static void main(String[] args) {
  78. WebSite web = new WebSite("http://duanziwang.com");
  79. web.guangDu();
  80. for(int i = 0; i<10;i++){
  81. new Thread(new Runnable() {
  82. @Override
  83. public void run() {
  84. web.dxcPx();
  85. }
  86. }).start();
  87. }
  88. }
  89. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 12:33

Copyright 2015-2025 djqfx

返回顶部