北大青鸟分享Java多线程爬虫实现

发布:2019-06-03  
  • 类 别:
  • 形 式:
    工作日班
  • 价 格:
    1
  • 区 域:
  • 联 系:
    18487352740 李老师
  • 详细信息
一、需求
  
  1.定时抓取固定网站新闻标题、内容、发表时间和来源。
  
  2.程序需要支持分布式、多线程
  
  二、设计
  
  1.网站是固定,但是未来也可能添加新的网站去抓取,每个网站内容节点设计都不一样,这样就需要支持动态可配置来新增网站以方便未来的扩展,这样就需要每次都需要开发介入。
  
  2.网站html节点的结构可能发生变化,所以也要支持提取节点可配置。
  
  3.怎样支持分布式?暂时最简单的想法就是:多机器部署程序,还有新搞一台或者部署程序其中一台制作一个定时任务,定时开启每台机器应该抓取哪个网站,暂时不能支持同一个网站同时可以支持被多台机器同时抓取,这样会比较麻烦,要用到分布式队列。所以暂时一个网站同时只会被单台机器抓取。
  
  4.多线程,怎样多线程?多线程抓取我这边有两个实现:
  
  (1)一个线程抓取一个网站,维护一个自己的url队列做广度抓取,同时抓取多个网站。如图:
  
  (2)多个线程同时抓取不同的网站。如图:
  
  以上两张办法其实各有优点,也给有缺点,看我们怎么取舍了。
  
  方法1:每个线程创建一个自己的队列,图中的queue可以不用concurrentQueue,优点:不涉及到控制并发,每个网站一个线程抓取一个网站,抓取完毕即自动回收销毁线程。控制方便。缺点:线程数不可以扩展,例如当只有3个网站,你最多只能开3个线程来抓取,不能开更多,有一定的局限性。
  
  方法2:N个线程同时抓取N个网站,线程数和网站数目不挂钩,优点:线程数可以调整并且和和抓取网站数量无关。3个网站我们可以开4个5个或者10个这个可以根据您的硬件资源进行调整。缺点:需要控制并发,并且要控制什么时候销毁线程(thread1空闲,并且queue为空不代表任务可以结束,可能thread2结果还没返回),当被抓取的网站响应较慢时,会拖慢整个爬虫进度。
  
  三、实现
  
  抓取方式最终还是选择了方法二,因为线程数可配置!
  
  使用技术:
  
  jfinal 用了之后才发现这东西不适合,但是由于项目进度问题,还是使用了。
  
  maven项目管理
  
  jetty server
  
  mysql
  
  eclipse 开发
  
  项目需要重点攻破的难点:
  
  (1)合理的控制N个线程正常的抓取网站,并且当所有线程工作都完成了并且需要抓取的队列为空时,N个线程同时退出销毁。
  
  (2)不同网站设计节点不一样,需要通过配置解决各个网站需要抓取的URL和抓取节点内容在html节点的位置。
  
  (3)个性化内容处理,由于html结构设计问题,北大青鸟http://www.kmbdqn.com/认为抓取的内容可能有些多余的html标签,或者多余的内容该怎么处理。
联系我时,请说是在老客网上看到的,谢谢!
发布者信息
联  系  人:李老师(商家)
注册日期:2019年04月01日
用户认证:
声明:以上内容(如有图片或视频,也包括在内)为平台注册用户上传并发布,本平台仅提供信息存储服务。任何权利(如著作权、肖像权、名誉权等)的主张者,可提供权属证明后,经本平台审核后做出处理。
关于老客 | 服务条款 | 常见问题 | 法律声明 | 联系我们
2005-2025 laoke.com 京ICP备06019010号 京ICP证050484号  京公网安备 11010502036214号  营业执照