V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhonghua
V2EX  ›  程序员

这个站它是怎么做到反爬虫的?

  •  
  •   zhonghua · 2014-01-03 20:09:42 +08:00 · 4926 次点击
    这是一个创建于 3981 天前的主题,其中的信息可能已经有所发展或是发生改变。
    很喜欢www.sostart.com这个电台,于是想做一个它的APP玩

    使用自己写的工具,flash cs设计界面,导出为cocos2d-x的jsb接口

    设置了各种http header,依然无果

    代码如下
    ···var xmlReq = new XMLHttpRequest();
    var url = "http://www.sostart.com/api.php?_="+(new Date().getTime());
    D(url);
    xmlReq.open("GET", url);
    xmlReq.responseType = "json";
    xmlReq.onreadystatechange = function(){
    D(xmlReq.getAllResponseHeaders());
    if(cb){
    cb(xmlReq);
    }
    }
    xmlReq.setRequestHeader("Refer", "http://www.sostart.com/");
    xmlReq.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0");
    xmlReq.setRequestHeader("Host", "www.sostart.com");
    xmlReq.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
    xmlReq.setRequestHeader("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
    xmlReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xmlReq.setRequestHeader("Accept-Encoding", "gzip, deflate");
    if (cookie) {
    xmlReq.setRequestHeader("Cookie", this.cookie);
    }
    xmlReq.setRequestHeader("Connection", "keep-alive");
    xmlReq.send();
    ···

    依然无法获得在浏览器里得到的JSON

    求解
    3 条回复    1970-01-01 08:00:00 +08:00
    dorentus
        1
    dorentus  
       2014-01-03 20:20:33 +08:00   ❤️ 1
    > xmlReq.setRequestHeader("Refer", "http://www.sostart.com/");

    Refer -> Referer

    HTTP referrer header 的名字是 Referer。
    9hills
        2
    9hills  
       2014-01-03 20:28:10 +08:00   ❤️ 1
    要注意cookie,我用Python && requests库给你一个example

    import requests
    s=requests.Session()
    s.headers.update({'Referer': 'http://www.sostart.com/'})
    s.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36'})
    # 保存cookie到session中
    r1=s.get('http://www.sostart.com')

    import time
    r2=s.get("http://www.sostart.com/api.php?_={}".format(int(time.time())*1000))
    print r2.json()


    Out:
    [{u'album': u'Origin',
    u'artist': u'Evanescence',
    u'cover': u'http://img3.douban.com/lpic/s2362221.jpg',
    u'id': u'449',
    u'source': u'http://sostartradio-songs.stor.sinaapp.com/201307/449.mp3',
    u'title': u'My Immortal'},
    ...
    zhonghua
        3
    zhonghua  
    OP
       2014-01-04 11:24:00 +08:00
    @dorentus
    @9hills 感谢已发送
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:18 · PVG 05:18 · LAX 13:18 · JFK 16:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.