转载自 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)

最近在找java的小项目自己写着玩,但是找不到合适的,于是写开始学一点爬虫,自己也是感觉爬虫比较有趣。这里自己找了一个教程,这一次写的是基于Socket和http方式爬取.

小项目结构图:

(1)SystemContorl类,实现整个爬虫任务调度,爬取任务

package com.simple.control;  import com.simple.Level.TaskLevel;
import com.simple.manger.CrawlerManger;
import com.simple.pojos.CrawlResultPojo;
import com.simple.pojos.UrlPojo;  import java.util.ArrayList;  /** * * * Created by lewis on 2016/10/15. */
public class SystemControl {  public static void main(String []args){  ArrayList<UrlPojo> urlPojoArrayList = new ArrayList<>();  urlPojoArrayList.add(new UrlPojo("https://www.taobao.com/", TaskLevel.HIGH));  urlPojoArrayList.add(new UrlPojo("https://www.taobao.com/", TaskLevel.HIGH));  int count=0;  for( UrlPojo urlPojo:urlPojoArrayList){  CrawlerManger crawlerManger = new CrawlerManger(false);  CrawlResultPojo crawlResultPojo = crawlerManger.crawl(urlPojo);  System.out.println(crawlResultPojo.getPageContent());  count++;  System.out.println("已经抓取了:"+count+"个页面");  }  }
}  

(2)接口Icrawl为2种爬取方式进行统一的规范,2种爬取方式均实现此接口。

package com.simple.Icrawl;  import com.simple.pojos.CrawlResultPojo;
import com.simple.pojos.UrlPojo;  /** * 实现类接口 * Created by lewis on 2016/10/15. */
public interface ICrawl {  public CrawlResultPojo crawl(UrlPojo urlpojo);
}  

(3)为每个任务分优先级

package com.simple.Level;  /** * 抓取任务的level级别 * Created by lewis on 2016/10/15. */
public enum TaskLevel {  HIGH,MIDDLE,LOW
}  

(4)爬虫的任务类和结果类

1).爬虫所需的任务类,包含具体的爬取内容url,任务优先级等

package com.simple.pojos;  import com.simple.Level.TaskLevel;
import com.simple.crawImpl.HttpUrlConnectionCrawlerImpl;  import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;  /** * @author lewis * url任务的类 * Created by lewis on 2016/10/15. */
public class UrlPojo {  private String url;                          //网页URL  private TaskLevel tasklevel=TaskLevel.MIDDLE;//URL的优先级等级  public UrlPojo(String url) {  this.url = url;  }  public UrlPojo(String url, TaskLevel tasklevel) {  this(url);  this.tasklevel = tasklevel;  }  public String getUrl() {  return url;  }  public void setUrl(String url) {  this.url = url;  }  public TaskLevel getTasklevel() {  return tasklevel;  }  public void setTasklevel(TaskLevel tasklevel) {  this.tasklevel = tasklevel;  }  public String getHost(){            //获得主机名  URL Url=null;  try {  Url= new URL(this.url);  } catch (MalformedURLException e) {  e.printStackTrace();  }  return Url.getHost();  }  public HttpURLConnection getConnection(){  URL Url=null;  try {  Url= new URL(this.url);  URLConnection conn = Url.openConnection();  if(conn instanceof HttpURLConnection)  return  (HttpURLConnection) conn;  else  throw new Exception("打开衔接失败");  } catch (MalformedURLException e) {  e.printStackTrace();  } catch (IOException e) {  e.printStackTrace();  } catch (Exception e) {  e.printStackTrace();  }  return null;  }  }

2).爬取后的结果集,所有的爬取结果保存在这个类中

package com.simple.pojos;  /** * 抓取结果的封装 * Created by lewis on 2016/10/15. */
public class CrawlResultPojo {  private boolean isSuccess; //是否已经成功  private String pageContent;//网页内容  private int HttpStatuCode;//HTTP 状态码  public boolean isSuccess() {  return isSuccess;  }  public void setSuccess(boolean success) {  isSuccess = success;  }  public String getPageContent() {  return pageContent;  }  public void setPageContent(String pageContent) {  this.pageContent = pageContent;  }  public int getHttpStatuCode() {  return HttpStatuCode;  }  public void setHttpStatuCode(int httpStatuCode) {  HttpStatuCode = httpStatuCode;  }
}

(5)爬虫管理,包括爬取方式的选择,查询查询爬取结果

package com.simple.manger;  import com.simple.Icrawl.ICrawl;
import com.simple.Level.TaskLevel;
import com.simple.crawImpl.CrawlerImpl;
import com.simple.crawImpl.HttpUrlConnectionCrawlerImpl;
import com.simple.pojos.CrawlResultPojo;
import com.simple.pojos.UrlPojo;  import java.net.Socket;
import java.util.Objects;  /** * @author lewis * 包含业务逻辑的抓取管理器 * Created by lewis on 2016/10/15. */
public class CrawlerManger {  private ICrawl crawler;  public CrawlerManger(boolean isSocket) {  if(isSocket){  this.crawler = new CrawlerImpl();  }else {  this.crawler = new HttpUrlConnectionCrawlerImpl();  }  }  public CrawlResultPojo crawl(UrlPojo urlPojo){  return this.crawler.crawl(urlPojo);  }
}

(6)2种爬取方式:

1).Socket方式:

package com.simple.crawImpl;  import com.simple.Icrawl.ICrawl;
import com.simple.Level.TaskLevel;
import com.simple.pojos.CrawlResultPojo;
import com.simple.pojos.UrlPojo;  import java.io.*;
import java.net.Socket;  /** * *  实现接口类 * Created by lewis on 2016/10/15. */
public class CrawlerImpl implements ICrawl{                 //Socket抓取方式  @Override  public CrawlResultPojo crawl(UrlPojo urlpojo) {                 //爬取url的内容,返回结果集合  CrawlResultPojo crawlResultPojo = new CrawlResultPojo();  if(urlpojo==null||urlpojo.getUrl()==null) {                  //若url为空,或URLpojo  crawlResultPojo.setPageContent(null);  crawlResultPojo.setSuccess(false);  return crawlResultPojo;  }  String host=urlpojo.getHost();  BufferedWriter bw = null;  BufferedReader br = null;  Socket socket=null;  if(host!=null){  try {  /** *  socket编程一般步骤 *(1) 创建Socket; *(2) 打开连接到Socket的输入/出流; *(3) 按照一定的协议对Socket进行读/写操作; *(4) 关闭Socket. * 其中address、host和port分别是双向连接中另一方的IP地址、主机名和端 口号, * stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号, * localAddr和 bindAddr是本地机器的地址(ServerSocket的主机地址) * */  socket=new Socket(host,80);  bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));  /** * HTTP1.1 * 它支持持续连接. * 与之相对的 * HTTP1.0 * 当连接建立起来以后,浏览器发送一个请求,之后一个回应消息被送回来.然后TCP连接被释放. * 所以发生了阻塞 * */  bw.write("GET "+urlpojo.getUrl()+" HTTP/1.0\r\n");//HTTP/1.1会发生组成  bw.write("HOST:"+host+"\r\n");  bw.write("\r\n");//在行的结束符\r\n之前没有任何数据,代表http head输出给服务器端的数据结束并完成  bw.flush();      //清空缓冲区  br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));  String line = null ;  StringBuilder stringBuilder = new StringBuilder();  while((line=br.readLine())!=null){  stringBuilder.append(line+"\n");  }  crawlResultPojo.setSuccess(true);  crawlResultPojo.setPageContent(stringBuilder.toString());  return crawlResultPojo;  } catch (IOException e) {  e.printStackTrace();  } finally {  try {  if (socket!=null)//防止出现空指针异常  socket.close();//释放资源,防止内存泄漏  if(br!=null)  br.close();  if(bw!=null)  bw.close();  } catch (IOException e) {  e.printStackTrace();  System.out.println("流关闭失败");  }  }  }  return null;  }  public static void main(String []args){  CrawlerImpl cl = new CrawlerImpl();  System.out.println(cl.crawl(new UrlPojo("https://www.taobao.com/", TaskLevel.HIGH)).getPageContent());  System.out.println("done");  }
}  

2).HTTP方式:

package com.simple.crawImpl;  import com.simple.Icrawl.ICrawl;
import com.simple.Level.TaskLevel;
import com.simple.pojos.CrawlResultPojo;
import com.simple.pojos.UrlPojo;  import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.nio.Buffer;  /** * Created by lewis on 2016/10/15. */
public class HttpUrlConnectionCrawlerImpl implements ICrawl{            //http 抓取方式  @Override  public CrawlResultPojo crawl(UrlPojo urlpojo) {  CrawlResultPojo crawlResultPojo = new CrawlResultPojo();  if(urlpojo==null||urlpojo.getUrl()==null) {                  //若url为空,或URLpojo  crawlResultPojo.setPageContent(null);  crawlResultPojo.setSuccess(false);  return crawlResultPojo;  }  HttpURLConnection httpURLConnection = urlpojo.getConnection();  if(httpURLConnection!=null){  BufferedReader bufferedReader=null;  try {  bufferedReader= new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(),"utf-8"));  String line =null;  StringBuilder stringBuilder = new StringBuilder();  while((line=bufferedReader.readLine())!=null){  stringBuilder.append(line+"\n");  }  crawlResultPojo.setPageContent(stringBuilder.toString());  crawlResultPojo.setSuccess(true);  return crawlResultPojo;  } catch (IOException e) {  e.printStackTrace();  }finally {  try {  if (bufferedReader!=null)  bufferedReader.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }  return null;  }  public static void main(String []args){  System.out.println(new HttpUrlConnectionCrawlerImpl().crawl(new UrlPojo("https://www.taobao.com/", TaskLevel.HIGH)).getPageContent());  System.out.println("done");  }
}  

java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)相关推荐

  1. 七月算法课程《python爬虫》第五课: scrapy spider的几种爬取方式

    本节课介绍了scrapy的爬虫框架,重点说了scrapy组件spider. spider的几种爬取方式: 1.爬取1页内容 2.按照给定列表拼出链接爬取多页 3.找到'下一页'标签进行爬取 4.进入链 ...

  2. JAVA爬虫-上海公交线路爬取

    最开始的数据获取也有两个思路  虽然我的数据不是这么来的 一 .http://www.zuobus.com/line-overview.php?c=2 这个网站有所有的上海的公交线路 二.百度poi ...

  3. java爬虫自动识别验证码_简单Java爬虫(一)爬取手机号码

    原创 野狗菌 希望你能喜欢 今天 关于本文: 本文介绍一个简单Java爬虫,获取网页源码,爬取电话号码. 本篇教程用我的博客一个测试网页演示. --野狗菌[希望你能喜欢] 测试页面: https:// ...

  4. Java爬虫学习一一Jsoup爬取彼岸桌面分类下的图片

    最近在找工作,在这个过程中我感到很迷茫,投了很多简历,被查看的却很少,其中也有到现场去面试,结果也很不理想(╥╯^╰╥). 哈哈,跑题了,我在看之前所做的项目时,在我的收藏夹中看到了以前收藏的有关爬虫 ...

  5. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    为什么80%的码农都做不了架构师?>>>    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影**<海王>**详细信息[电影名称.电影迅雷下载地址列表] ...

  6. java爬虫,提供链接直接爬取网页代码

    其实我只想要爬到整个网页的源代码的就好.通过java的一个包jsoup,就可以直接爬取了,后面有下载源代码(含jsoup包)的链接. 输入:网页链接 输出:网页源代码 代码比较简单,解析都在代码中: ...

  7. Java爬虫_资源网站爬取实战

    对 http://bestcbooks.com/  这个网站的书籍进行爬取 (爬取资源分享在结尾) 下面是通过一个URL获得其对应网页源码的方法 传入一个 url  返回其源码 (获得源码后,对源码进 ...

  8. 几十行代码实现Java爬虫,结合jsoup爬取网名昵称

    原文链接:点击打开链接 crawler4j是一个开源爬虫框架(https://github.com/yasserg/crawler4j), 我们可以使用它进行爬虫.以爬取 http://www.nib ...

  9. Java爬虫——B站弹幕爬取

    如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号,cid=14295428 弹幕存放位置为  h ...

最新文章

  1. 各种小的 dp (精)
  2. Exchange笔记之使用OWA加密访问邮箱
  3. [Android1.5]Android2.0版本以下Activity切换动画效果
  4. cx_Oracle.DatabaseError: ORA-12514
  5. 9.JAVA-抽象类定义
  6. Android ViewPager2 真的香么?
  7. 【Linux学习】Linux的文件权限(一)
  8. javasrcipt的作用域和闭包(二)续篇之:函数内部提升机制与Variable Object
  9. DMAR(DMA remapping)与 IOMMU
  10. 基于JAVA+SpringMVC+MYSQL的图书管理系统
  11. 当开发人员遇上非功能性需求
  12. xcode swift_CocoaPods Swift XCode教程
  13. 电脑怎么找到tomcat端口_更换内存条的时候我怎么找到自己电脑配置的详细信息...
  14. oracle sql执行计划分析
  15. 2018年的生活及工作计划
  16. 数据结构--创建并输出二叉树的c语言实现(超详细注释/实验报告)
  17. 翻转单词顺序(python)
  18. word2016撤销无效解决办法
  19. 201771010101 白玛次仁 《2018面向对象程序设计(Java)》第七周学习总结
  20. 【公告】博客新皮肤上线啦

热门文章

  1. [RabbitMQ]什么是MQ
  2. C++ const修饰符的简单介绍
  3. [PAT乙级]1023 组个最小数
  4. [剑指offer]面试题22:栈的压入、弹出序列
  5. 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,使其和等于 m
  6. 微软100题第11题
  7. #3771. Triple 生成函数 + FFT + 容斥
  8. Codeforces Round #712 (Div. 2) F. Flip the Cards 思维 + 贪心
  9. Acwing 1089. 烽火传递
  10. 【每日一题】8月10日题目精讲—排座椅