java网络爬虫与mysql数据库(二)

21 篇文章 1 订阅
如何去写网络爬虫
1.原理部分
在写一个爬虫之前,我们首先需要知道网络爬虫的原理,知道其原理了,写起来很是简单。

       为了简单起见,我简单绘制了一个流程图。首先呢,需要输入url(需要爬取的种子节点,可能是一个,可能是多个,多个对应的是集合的形式,如list等)。
接着是使用httpclient模拟浏览器请求资源,HttpClient支持所有定义在HTTP/1.1版本中的HTTP方法:GET,HEAD,POST,PUT,DELETE,TRACE和OPTIONS。对于每个方法类型都有一个特殊的类:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace和HttpOptions。最常用的方法是GET和POST。通过String entity = EntityUtils.toString (response.getEntity(),"utf-8");返回实体内容,内容为html文件。
        接着是解析html文件,这里采用的是很实用且功能强大的DOM解析器——Jsoup。
       最后是将Jsoup解析后的内容写入txt、或者插入到数据库或excel中,这样就完成爬虫的一个流程了。


2.HttpClient的介绍与使用
2.1 http请求
      httpclient是用来模拟浏览器请求资源的,常用的请求方法是GETPOST
2.2 http响应

HTTP响应是由服务器在接收和解释请求报文之后返回发送给客户端的报文。响应报文的第一行包含了协议版本,之后是数字状态码和相关联的文本段。正常情况下,如果成功地获得请求的资源,则返回的状态码为200,表示响应成功。如果请求的资源不存在,通常返回404错误。

常见的状态码有:

   200   OK    客户端请求成功,获取资源

   400   Bad Request   由于客户端请求有语法错误,不能被服务器所理解。

   401   Unauthonzed   请求未经授权。

   403   Forbidden   服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因

   404   Not Found   请求的资源不存在,例如,输入了错误的URL,在爬虫中如果url不存在了,就会报错。

   500   Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。 

   503   Service Unavailable   服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。 

2.3 响应后的实体(html文件)

获取实体内容

String entity = EntityUtils.toString (response.getEntity(),"utf-8");

关闭流实体

EntityUtils.consume(response.getEntity());

如下是我写的一个测试实例
public class httpTest {
public static void main(String[] args) throws IOException {
HttpClient client = new DefaultHttpClient();   //初始化httpclient
String personalUrl="http://xueqiu.com/";         //指定一个种子url
HttpPost postMethod = new HttpPost(personalUrl);   //post方法请求
System.out.println("postMethod====="+ postMethod+"=====");
HttpGet getMethod = new HttpGet(personalUrl); // get方法请求
System.out.println("Method======"+getMethod+"=====");
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");                        //初始化response        
response = client.execute(getMethod);                //执行响应
System.out.println("response========"+response+"=====");
int StatusCode = response.getStatusLine().getStatusCode(); //获取响应状态码
System.out.println("StatusCode===="+StatusCode+"=====");
System.out.println(response);
if(StatusCode == 200){                          //状态码200表示响应成功
//获取实体内容
String entity = EntityUtils.toString (response.getEntity(),"utf-8");
//输出实体内容
System.out.println(entity);
EntityUtils.consume(response.getEntity());       //消耗实体
}else {
//关闭HttpEntity的流实体
EntityUtils.consume(response.getEntity());        //消耗实体
}
}

}
控制台输出的内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值