使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

原文链接:https://www.cnblogs.com/blog5277/p/9334560.html

原文作者:博客园--曲高终和寡

上述查看原文链接****************

当你在工作中使用爬虫的时候,你会遇到如下问题:

1.网站的反爬虫机制(验证码,封IP,投毒,js动态渲染页面)

2.分布式爬虫的效率与去重

但是基本上讲,只要是web浏览器上能打开的数据,你都能爬到,因为我们只要尽量模拟真人的操作就行了呗,反爬虫手段只是提升了爬虫的成本,不可能杜绝爬虫的,因为这样一定会误伤很多真人用户.

更多的就不细讲了,有点跑题,我在爬虫(或者高大上点叫数据挖掘?)上还有很多的路要走,参考别的大神的思路.

又扯远了,回归主题,介绍Jsoup

Jsoup是一款Java的HTML解析器,主要用来对HTML解析。官网 中文文档
在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,
就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。

1.引入依赖,maven(百度谷歌"jsoup maven",个人推荐用最新的,时刻追上发展的脚步嘛)

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> 
<dependency> 
<groupId>org.jsoup</groupId> 
<artifactId>jsoup</artifactId> 
<version>1.11.3</version> 
</dependency>

2.发送get请求

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

3.发送post请求

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

是的,就是这么简单,再也不用管编码,再也不用管GZIP了,你敢发,jsoup就能解析好返回给你.

4.发送post,带参数

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

要么多.几个data,要么传个map,最后.post();

5,发送post,带requestbody

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

6,设置超时(个人建议必设)

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

7,设置动态代理IP,再配合你自己写一个代理的IP池,就可以防止反爬虫封你的IP了

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

8,设置cookie

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

9,设置浏览器

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

10,设置各种header

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

好了,不谈了,更多的你们自己点一点看一看,非常的容易,另外我个人建议

.ignoreContentType(true) //解析文档时 忽略 内容的类型

.ignoreHttpErrors(true)  // 连接HTTP 请求 报错时 忽略

这俩一定要开启

细心的朋友一定发现了,返回值是Document

那么怎么返回String类型的html源码呢,直接在get(),或者post()后面这样就行了

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

如果是调的接口,返回值是json,或者你只需要返回不带html标签的正文,那么这样就可以了

使用Jsoup爬取网络请求的方法(java,post,get,代理IP)

记得随时trim的好习惯哦.

这里放两个我自己常用的get和post通用的方法吧

 

    public static Document getJsoupDocGet(String url) {
        //三次试错
        final int MAX = 10;
        int time = 0;
        Document doc = null;
        while (time < MAX) {
            try {
                doc = Jsoup
                        .connect(url)
                        .ignoreContentType(true)
                        .ignoreHttpErrors(true)
                        .timeout(1000 * 30)
                        .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
                        .header("accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
                        .header("accept-encoding","gzip, deflate, br")
                        .header("accept-language","zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7")
                        .get();
                return doc;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                time++;
            }
        }
        return doc;
    }

    public static Document getJsoupDocPost(String url, Map<String,String> paramMap) {
        //三次试错
        final int MAX = 10;
        int time = 0;
        Document doc = null;
        while (time < MAX) {
            try {
                doc = Jsoup
                        .connect(url)
                        .ignoreContentType(true)
                        .ignoreHttpErrors(true)
                        .timeout(1000 * 30)
                        .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
                        .header("accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
                        .header("accept-encoding","gzip, deflate, br")
                        .header("accept-language","zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7")
                        .data(paramMap)
                        .post();
                return doc;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                time++;
            }
        }
        return doc;
    }

其实返回值Document还有更加强大的作用,它是个DOM解析器,我写爬虫全用它,具体怎么实现的,请自己去

https://www.jsoup.org/

学习,然后去

https://try.jsoup.org/

实验,(建议直接复制源码进来,不要用这里面自带的fetch)

我这里就不谈了,真的好用

原文链接:https://www.cnblogs.com/blog5277/p/9334560.html

原文作者:博客园--曲高终和寡

上一篇:App Store内部购买产品总结--Java版(三)


下一篇:HTML5的十大新特性