阿里云服务器免费领卷啦。

捡代码论坛-最全的游戏源码下载技术网站!

 找回密码
 立 即 注 册

QQ登录

只需一步,快速开始

搜索
关于源码区的附件失效或欺骗帖, 处理办法
查看: 2105|回复: 0

爬取百度网盘用户分享

[复制链接]

4208

主题

210

回帖

12万

积分

管理员

管理员

Rank: 9Rank: 9Rank: 9

积分
126198
QQ
发表于 2016-10-25 16:37:07 | 显示全部楼层 |阅读模式
最近在找工作,有点无聊,没事搞,研究了下爬百度网盘的用户分享
上面3个连接请求必须带上 ("Referer", "https://yun.baidu.com/share/home?uk=23432432#category/type=0"),uk多少无所谓,否则请求不到json数据,
获取用户订阅和获取用户粉丝每次请求一次休眠2s的话可以无限制请求,对ip没要求,获取用户分享超坑,一个ip只能请求10次,并且休眠也没用.
因为没有那么多ip,我就去研究手机版的用户分享,手机版获取用户分享可以一次性连续请求60次,60次后必须休眠35s左右在继续请求就可以,不会像pc版那样必须换ip,
但是手机版只能请求网页源码,然后用正则进行匹配.

下面上源码:

  1. private Logger log = LoggerFactory.getLogger(FollowStartIndex.class);
  2. public void startIndex() {
  3.         //无限循环
  4.         while (true) {
  5.             //从数据库获取可用uk,可用首先从某个粉丝超多的用户入手,获取他粉丝的uk,存入数据库
  6.             Avaiuk avaiuk = Avaiuk.dao.findFirst("select * from avaiuk where flag=0  limit 1");
  7.             //更新数据库,标记该uk已经被用户爬过
  8.             avaiuk.set("flag", 1).update();
  9.             getFllow(avaiuk.getLong("uk"), 0);
  10.         }
  11.     }

  12.     static String url = "http://yun.baidu.com/pcloud/friend/getfollowlist?query_uk=%s&limit=24&start=%s&bdstoken=e6f1efec456b92778e70c55ba5d81c3d&channel=chunlei&clienttype=0&web=1&logid=MTQ3NDA3NDg5NzU4NDAuMzQxNDQyMDY2MjA5NDA4NjU=";
  13.     static Map map = new HashMap();

  14.     static {
  15.         map.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36");
  16.         map.put("X-Requested-With", "XMLHttpRequest");
  17.         map.put("Accept", "application/json, text/javascript, */*; q=0.01");
  18.         map.put("Referer", "https://yun.baidu.com/share/home?uk=325913312#category/type=0");
  19.         map.put("Accept-Language", "zh-CN");
  20.     }

  21.     //获取订阅用户
  22.    public void getFllow(long uk, int start, boolean index) {
  23.            log.info("进来getFllow,uk:{},start:{}", uk, start);
  24.            boolean exitUK = false;
  25.            try {
  26.                exitUK = Redis.use().exists(uk);
  27.            } catch (Exception e) {
  28.                exitUK = true;
  29.            }
  30.            if (!exitUK) {
  31.                Redis.use().set(uk, "");
  32.                if (index) {
  33.                    indexResource(uk);
  34.                }
  35.                recFollow(uk,start,true);
  36.            } else {
  37.                if (start > 0) {//分页订阅
  38.                    recFollow(uk,start,false);
  39.                } else {
  40.                    log.warn("uk is index:{}", uk);
  41.                }
  42.            }
  43.    
  44.    
  45.        }
  46.     public void recFollow(long uk,int start,boolean goPage){
  47.            try {
  48.                Thread.sleep(4000);
  49.            } catch (InterruptedException e) {
  50.                e.printStackTrace();
  51.            }
  52.            String real_url = String.format(url, uk, start);
  53.            ResponseBody body = OkhttpUtil.syncGet(real_url, Headers.of(map));
  54.            if (body != null) {
  55.                try {
  56.                    Follow follow = JSON.parseObject(body.string(), Follow.class);
  57.    
  58.                    if (follow.getErrno() == 0) {
  59.                        List<Follow.FollowListBean> followListBeen = follow.getFollow_list();
  60.                        if (followListBeen != null && followListBeen.size() > 0) {
  61.                            log.info("不为空:{}", follow);
  62.                            for (Follow.FollowListBean bean : followListBeen) {
  63.                                int follow_count = bean.getFollow_count();
  64.                                int shareCount=bean.getPubshare_count();
  65.                                if (follow_count > 0) {
  66.                                    if (shareCount > 0) {
  67.                                        getFllow(bean.getFollow_uk(), 0, true);
  68.                                    } else {
  69.                                        getFllow(bean.getFollow_uk(), 0, false);
  70.                                    }
  71.                                }
  72.                            }
  73.                            if(goPage){
  74.                                int total_count = follow.getTotal_count();
  75.                                //log.warn("分页页数:{}",total_count);
  76.                                //分页
  77.                                int total_page = (total_count - 1) / 24 + 1;
  78.    
  79.                                for (int i = 1; i < total_page; i++) {
  80.                                    getFllow(uk, i * 24,false);
  81.                                }
  82.    
  83.                            }
  84.                        } else {
  85.                            log.info("为空:{}", follow);
  86.                        }
  87.                    }
  88.    
  89.                } catch (IOException e) {
  90.                    e.printStackTrace();
  91.                }
  92.            }
  93.        }

  94.     long uinfoId = 0;
  95.     long nullStart = System.currentTimeMillis();

  96.     public void indexResource(long uk) {
  97.         while (true) {
  98.             String url = "http://pan.baidu.com/wap/share/home?uk=%s&start=%s&adapt=pc&fr=ftw";
  99.             String real_url = String.format(url, uk, 0);

  100.             YunData yunData = DataUtil.getData(real_url);

  101.             if (yunData != null) {
  102.                 log.info("{}", yunData.toString());
  103.                 int share_count = yunData.getUinfo().getPubshare_count();
  104.                 if (share_count > 0) {
  105.                     Uinfo uinfo = new Uinfo();
  106.                     uinfo.set("uname", yunData.getUinfo().getUname()).set("avatar_url", yunData.getUinfo().getAvatar_url()).set("uk", uk).set("incache", 1).save();
  107.                     uinfoId = uinfo.getLong("id");
  108.                     List<Records> recordses = yunData.getFeedata().getRecords();
  109.                     for (Records record : recordses) {
  110.                         new ShareData().set("title", record.getTitle()).set("shareid", record.getShareid()).set("uinfo_id", uinfoId).save();
  111.                     }

  112.                 }
  113.                 int totalPage = (share_count - 1) / 20 + 1;

  114.                 int start = 0;
  115.                 if (totalPage > 1) {
  116.                     for (int i = 1; i < totalPage; i++) {
  117.                         start = i * 20;
  118.                         real_url = String.format(url, uk, start);
  119.                         yunData = DataUtil.getData(real_url);
  120.                         if (yunData != null) {
  121.                             log.info("{}", yunData.toString());
  122.                             List<Records> recordses = yunData.getFeedata().getRecords();
  123.                             for (Records record : recordses) {
  124.                                 //用户分享的数据存入数据库
  125.                                 new ShareData().set("title", record.getTitle()).set("shareid", record.getShareid()).set("uinfo_id", uinfoId).save();
  126.                             }
  127.                         } else {
  128.                             i--;
  129.                             log.warn("uk:{},msg:{}", uk, yunData);
  130.                             long temp = nullStart;
  131.                             nullStart = System.currentTimeMillis();
  132.                             if ((nullStart - temp) < 1500) {
  133.                                 try {
  134.                                     Thread.sleep(60000);
  135.                                 } catch (InterruptedException e) {
  136.                                     e.printStackTrace();
  137.                                 }
  138.                             }

  139.                         }

  140.                     }

  141.                 }
  142.                 break;
  143.             } else {
  144.                 log.warn("uk:{},msg:{}", uk, yunData);
  145.                 long temp = nullStart;
  146.                 nullStart = System.currentTimeMillis();
  147.                 //在1500毫秒内2次请求到的数据都为null时,此时可能被百度限制了,休眠一段时间就可以恢复
  148.                 if ((nullStart - temp) < 1500) {
  149.                     try {
  150.                         Thread.sleep(60000);
  151.                     } catch (InterruptedException e) {
  152.                         e.printStackTrace();
  153.                     }
  154.                 }
  155.             }
  156.         }


  157.     }
复制代码
  1. public class DataUtil {
  2.     public static YunData getData(String url) {
  3.         //自己对okhttp的封装
  4.         ResponseBody body = OkhttpUtil.syncGet(url);
  5.         String html = null;
  6.         if (body == null) {
  7.             return null;
  8.         }
  9.         try {
  10.             html = body.string();
  11.         } catch (IOException e) {
  12.             return null;
  13.         }
  14.         Pattern pattern = Pattern.compile("window.yunData = (.*})");
  15.         Matcher matcher = pattern.matcher(html);
  16.         String json = null;
  17.         while (matcher.find()) {
  18.             json = matcher.group(1);
  19.         }
  20.         if (json == null) {
  21.             return null;
  22.         }
  23.         //fastjson
  24.         YunData yunData = JSON.parseObject(json, YunData.class);
  25.         return yunData;
  26.     }
  27. }
复制代码

YunData自己获取下json数据,就能创建出来,代码就不放了.

这么爬取速度很快,3台服务器一天就爬取了100多万.


原文地址:

http://zhangguodong.me/2016/09/18/%E7%88%AC%E5%8F%96%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%94%A8%E6%88%B7%E5%88%86%E4%BA%AB/
https://github.com/gudegg/yunSpider



捡代码论坛-最全的游戏源码下载技术网站! - 论坛版权郑重声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与捡代码论坛-最全的游戏源码下载技术网站!享有帖子相关版权
3、捡代码论坛版权,详细了解请点击。
4、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
5、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
6、如无法链接失效或侵犯版权,请给我们来信:jiandaima@foxmail.com

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立 即 注 册

本版积分规则

技术支持
在线咨询
QQ咨询
3351529868

QQ|手机版|小黑屋|捡代码论坛-专业源码分享下载 ( 陕ICP备15015195号-1|网站地图

GMT+8, 2024-5-2 06:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表