zoukankan      html  css  js  c++  java
  • [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP)

     

    [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP)

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

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

    *******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文****************

    爬虫最近似乎越来越火了,随着各个培训班开启了各种课程,似乎用用Python里的XX框架,就能抓天抓地抓空气了

    真的是这样么?

    嘻嘻嘻,当然不是了,爬虫不是Python专属,同样,数据采集,数据清洗,AI,机器学习,都不是,语言只是工具,底层都是数学,Python有的工具java和java系的基本都有

    扯远了,这里只说爬虫好了,我看了看网上那些教程,大多数都是讲这个网站怎么获取里面的数据,把网址,解析规则自己分析一下调个方法就运行了.

    重要不重要,重要,但是写爬虫的最麻烦的不是这个.

    上面这东西说白了,任何能请求到一个页面源码的方法+DOM结构解析器,都能做.(当然,人家也是面对新手的教程)

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

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

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

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

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

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

    身为开发人员,你一定会有很多时候要发起网络请求,比如各个第三方API,比如写爬虫,那么你一定会遇到很多问题:

    网站编码是utf-8,还是GBK,GB2312或者更奇葩的编码,

    网站是否是GZIP压缩,

    post还是get

    post的参数要用raw形式放在request body里面

    每种情况你用httpclient也好,还是httpconnect也好,都要不同情况单独处理,很麻烦,你要是写个通用爬虫框架,一下子爬几百个网站,那难道说每个网站都要单独设置一下?

    我们只想要输入一个连接,输入参数,就能返回内容的方法,难道就这么难么?

    是的,挺麻烦的,直到我遇到了jsoup

    1.引入依赖,maven

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

    百度谷歌"jsoup maven",个人推荐用最新的,时刻追上发展的脚步嘛

    2.发送get请求

    3.发送post请求

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

    4.发送post,带参数

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

    5,发送post,带requestbody

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

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

    8,设置cookie

    9,设置浏览器

    10,设置各种header

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

    .ignoreContentType(true).ignoreHttpErrors(true)

    这俩一定要开启

     

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

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

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

    记得随时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)

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

  • 相关阅读:
    一种利用异常机制基于MVC过滤器的防止重复提交的机制分享
    泛型算法参考手册
    Http协议中get和post的区别----学习笔记
    Apache Commons工具类学习(一)-----CSV
    Appium 相关学习(三) 使用webdriver截图以及app点击事件
    Appium 相关学习(二) testng中的Assert类
    Appium 相关学习(一)
    Java 获取一个当前系统可以用的端口
    Java图片base64编码解码,接口使用
    myeclipse中运行maven web项目时tomcat启动报错——解决方法
  • 原文地址:https://www.cnblogs.com/blog5277/p/9334560.html
Copyright © 2011-2022 走看看