网络爬虫抓取数据一般有两种难度,一种是指对方数据内容有加密的,一般APP软件的数据内容都有加密,这时候就需要逆向解析app数据了。第二种就是,必须登录后才能抓取到数据,就登录后目标网站也会限制IP的访问次数。

对于需要登录采集抓取数据的APP,我们可以指定正确的抓取策略来完成采集工作。

就比如如何抓取脉脉APP:

1、抓取目标,抓取脉脉APP上的职业信息

2、了解脉脉如何使用和分析脉脉APP的产品形态(PC端和APP需要登录才能采集)

3、分析APP对访问的频率控制,可以进行手动测试,登录账号后快速访问页面,访问多次后,就有提示频繁访问,这时候就需要统计下访问了多少次后才会出现频繁。

4、对于脉脉需要大量账号登陆才能抓取的APP,一个账号频繁更换IP抓取也会出问题

5、分析脉脉的分享功能,通过分析功能分析出,我们可以把个人的详细页面分析到微信里,通过微信 打开,就不需要登陆了,通过分享微信后,爬虫抓包后会返回一个URL,URL链接就不需要登陆,这个这个URL链接对访问的次数频率不是很严格。

总结:登陆脉脉,指定抓取目标,解决登陆问题,分享抓取的目标详细信息分析到微信里,返回URL链接,访问URL链接获取数据信息。解决登陆问题后只需要大量的爬虫代理IP就可以成功抓取到数据。具体可以参考以下代码,仅供参考:

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Demo {

    public static void main(String[] args) {

        try{

            // 代理服务器(产品官网 www.16yun.cn)
            final static String ProxyHost = "t.16yun.cn";
            final static String ProxyPort = "31111";

            System.setProperty("http.proxyHost", ProxyHost);
            System.setProperty("https.proxyHost", ProxyHost);

            System.setProperty("http.proxyPort", ProxyPort);
            System.setProperty("https.proxyPort", ProxyPort);

            // 代理验证信息
            final static String ProxyUser = "username";
            final static String ProxyPass = "password";

            System.setProperty("http.proxyUser", ProxyUser);
            System.setProperty("http.proxyPassword", ProxyPass);

            System.setProperty("https.proxyUser", ProxyUser);
            System.setProperty("https.proxyPassword", ProxyPass);




            // 设置IP切换头
            final static String ProxyHeadKey = "Proxy-Tunnel";

            // 设置Proxy-Tunnel
            Random random = new Random();
            int tunnel = random.nextInt(10000);
            String ProxyHeadVal = String.valueOf(tunnel);



            // 处理异常、其他参数
            Document doc = Jsoup.connect(url).timeout(3000).header(ProxyHeadKey, ProxyHeadVal).get();

            if(doc != null) {
                System.out.println(doc.body().html());
            }

        }catch (IOException e)
        {
            e.printStackTrace();
        }

    }
}