Java爬虫

爬虫简介

https://blog.csdn.net/erliang20088/article/details/45790201

主要技术

典型的技术构成为:http协议相关+java se+httpclient+jsoup(httpparser)。

http协议相关,指在爬虫过程中对最为主流的http网址的内容的抓包及参数分析,最为主要的参数部分要对http协议相对了解些,包括Url、HttpHeader、Get、Post、Cookie等4项。Url即为共认的Url网址。HttpHeader,指在http请求过程中,协带的各项header信息,如refer,host,encoding,返回的type等。 Get请求,即为在浏览器中看到的网址后边的参数部分,Post请求,即为数据提交的时候对数据保护和扩大数据提交量的一种数据的提交方式。Cookie,即为小甜饼,是服务器端向客户端写的信息,往往是为了提高客户端的使用体验而添加的,更关键的是要保持住客户端与服务器的连接状态。

Java Se:   程序设计语言,好的系统必须有扎实的编程水平,故不必多说,其重点在于常用高级类应用、IO流、多线程等。

HttpClient: 是开源的Apache的著名的java net编程第三方包,其实是对Java Net包的封状,目前已为4.3版本,更为精简易用,可以免去很多Http操作的细节操作,其核心为HttpUrlConnection的封装。

Jsoup:是近来较受欢迎的html解析器,比htmlparser更简单、易用、高效,故目前应用jsoup的人员急速上升,且与老牌的htmlparser对比优势明显,尤其是其选择器的应用,太过强大,很有吸引用,使人不得选择jsoup去解析httpclient得到的网页内容。

有了以上4个主要技术点,做爬虫会得心应手很多,入门者可以逐一学之,最后集成为爬虫。

HttpClient

使用HTTP协议客户端HttpClient这个技术,来实现抓取网页数据。
GET获取数据

使用方法

 //打开浏览器
        CloseableHttpClient client = HttpClients.createDefault();
        //输入网址
        HttpGet httpGet1 = new HttpGet("https://www.jikexueyuan.com/");
        //发起请求  接收回应
        CloseableHttpResponse response = null;
        try {
            response = client.execute(httpGet1);
            if (response.getStatusLine().getStatusCode() == 200){
                HttpEntity entity = response.getEntity();
                String context = EntityUtils.toString(entity, "utf8");
                System.out.println(context);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (response != null) response.close();
        }
        client.close();

带有参数的Get方法

使用new HttpGet();传入URIBuilder.bulid()对象

        //创建URLBuild
        URIBuilder uriBuilder = new URIBuilder("https://www.jikexueyuan.com/");
        //设置参数   q=java
        uriBuilder.setParameter("q","java");
        //输入网址//"https://www.jikexueyuan.com/"
        HttpGet httpGet = new HttpGet(uriBuilder.build());

设置 多个参数时

uriBuilder.setParameter("q","java");

还可以合写为

URIBuilder uriBuilder = new URIBuilder("https://www.jikexueyuan.com/").setParameter("p", "java");

POST请求

和Get类似 只需将
``java
HttpPost httpPost = new HttpPost(uriBuilder.build());


##带参数的Post请求
```java
//打开浏览器
        CloseableHttpClient httpClient = HttpClients.createDefault();


        //设置请求地址
        HttpPost httpPost = new HttpPost("");

        //设置参数   q=java
        //uriBuilder.setParameter("q","java");
        //输入网址//"https://www.jikexueyuan.com/"
        List<NameValuePair> parms = new ArrayList<>();
        NameValuePair nameValuePair = new BasicNameValuePair("q", "java");
        parms.add(nameValuePair);
        //表单提交duixiang
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parms,"utf8");

        
        httpPost.setEntity(formEntity);

        //解析响应 获取数据
//        判断状态码
        CloseableHttpResponse response = null;
        if (response.getStatusLine().getStatusCode() ==200){
            HttpEntity entity = response.getEntity();
            String context = EntityUtils.toString(entity, "utf8");
            System.out.println(context);
        }

配置参数

RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(1000)  //设置连接最长时间,单位毫秒
                                        .setConnectTimeout(1000)   //设置创建连接最长时间,单位毫秒
                                         .setSocketTimeout(1000) //设置传输最长时间
                                        .build();

httpGet.setConfig(config);

Jsoup

导入jar包

  1. Jsoup
  2. commonts-io
  3. commonts-lang3
  4. junit

使用案例

   //获取Document对象
   //第一个参数 访问的URL,第二个是访问超时时间
   Document parse = Jsoup.parse(new URL("http://www.itcast.cn/subject/brandzly/index.html?jingjiaczpz-PC-1"), 1000)
    //通过标签选择器 获取title 里面的内容
   String title = parse.getElementsByTag("title").first().text();

为什么时用 HttpClient

PS:虽然使用Jsoup可以替代HttpClient 直接发起请求解析数据,但是往往 不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方 式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html 解析工具使用。

解析字符串

使用静态Jsoup.parse(String html) 方法或 Jsoup.parse(String html, String baseUri)

String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

解析文件

public void getFile() throws IOException {
       Document file = Jsoup.parse(new File("C:\Users\86198\Desktop\jsoup Java HTML解析器:解析一个HTML字符串.mhtml"), "utf8");
       String title = file.getElementsByTag("title").first().text();
       System.out.println(title);
   }

获取元素

      getElementsByTag("a").text();
      getElementById();
      getElementsByClass();
      getElementsByAttribute();
      getElementsByAttributeValue();
        

获取数据

//获取id
element.id();
//获取class
element.className();
Set<String>  element.classNames();
//获取属性值
element.attr(name);

//获取所有的属性和值
attributes  element.attributes();
//获取元素内容
element.text();

Webmagic

Webmagic 结构

graph TD A(Internet)==HTTP==>B(DownLoader 下载) B==Page==>C(PageProcessor 处理) C==Requset==>D(Schedlular 管理) C==ResultItem==>E(Popeline 持久化) D==Requset==>B

依赖

  1. webmagic-core
  2. webmagic-extension

注意: 0.7.3 版本对SSL的并不完全,如果是直接从Maven中央仓库下载依赖, 在爬取只支持SSL v1.2的网站会有SSL的异常抛出。。
解决方案:。
1.等作者的 0.7.4的版本发布。
2.直接从github上下载最新的代码,安装到本地仓库。

也可以参考以下资料自己修复。
https://github.com/code4craft/webmagic/issues/701

自己修复了半天也没能解决,以后解决了在出个教程

在resource中添加日志配置文件
在resource创建log4j.properties 文件

log4j.rootLogger=INFO, A1 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

免费代理服务器

米扑代理
西刺免费代理

原文地址:https://www.cnblogs.com/passer-byZe/p/12570320.html