V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
daiv
V2EX  ›  问与答

用 requests 抓取网页代码的时候,出现了一个怪异的现象。(只能获取到尾巴部分)

  •  1
     
  •   daiv · 2016-05-20 08:42:42 +08:00 · 3191 次点击
    这是一个创建于 2888 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境先说明一下。 我已经模拟了 cookies + headers 。(和浏览器一摸一样)

    用浏览器打开的源代码是: (就是没有<head>和<body>,算是js调用的一个小框框)

    <ul class="" 
    data-a="0.00"
    data-b="222"
    data-c="0"> 
    <li class="xxx"> <a href="javascript:void(0);" class="removeX">删除</a>&nbsp;test
    </button> </a> </li> </ul>
    

    而我用 request 打开却只有

    </button> </a> </li> </ul>
    

    最后一点点。

    我还用 urllib2 尝试,效果也一模一样

    更奇怪的是:

    用 requests 或 urllib2 获取的时候 response headers 里面 content-length 和浏览器那是一样的。

    获取到的内容长度一样,可惜得到的内容只有尾巴那一点点呀,,,

    请大家帮忙支招,谢谢!

    第 1 条附言  ·  2016-05-20 09:28:39 +08:00
    抓过那么那么多数据,第一次遇到这样的东东。

    再难的都抓过呀。

    view-source: 只有这么点内容,没有 js 。

    cookies headers 都一样,实在想不到问题所在了
    第 2 条附言  ·  2016-05-20 10:02:04 +08:00
    给网址大家帮忙研究 http://gg.gg/secreturl (一会回复就不要贴网址,谢谢!帮同学研究的)
    第 3 条附言  ·  2016-05-20 10:30:19 +08:00
    已经确定 是 pycharm 的 console 坑人了

    感谢各位的提醒,和帮忙
    26 条回复    2016-05-20 11:52:38 +08:00
    heaton_nobu
        1
    heaton_nobu  
       2016-05-20 08:56:24 +08:00
    可能前面的内容是 ajax 获取后添加上去的
    daiv
        2
    daiv  
    OP
       2016-05-20 08:58:54 +08:00
    @heaton_nobu 如果是 ajax 行为,我用 charles 和 chrome F12 能看到呀。
    mystryl
        3
    mystryl  
       2016-05-20 09:07:44 +08:00
    你打开 request.text 的语句是啥
    daiv
        4
    daiv  
    OP
       2016-05-20 09:12:19 +08:00
    @mystryl
    ```python
    s = requests.Session()
    s.cookies.update(cookies)
    s.headers.update(headers)
    r = s.get(url, verify=False)
    print r.headers
    print r.content
    print r.text
    ```
    daiv
        5
    daiv  
    OP
       2016-05-20 09:14:22 +08:00
    @mystryl print requests.get(url, headers=headers).content (不用 session 也尝试了,这次吧 cookies 放进 headers 里面)
    效果一样,还是只有尾巴
    cdwyd
        6
    cdwyd  
       2016-05-20 09:16:56 +08:00
    应该是 js 生成的吧, ctrl+u 看看是不是和你抓取的一样。
    daiv
        7
    daiv  
    OP
       2016-05-20 09:21:24 +08:00
    @cdwyd view-source 看到的就是我说的:
    <ul class=""
    data-a="0.00"
    data-b="222"
    data-c="0">
    <li class="xxx"> <a href="javascript:void(0);" class="removeX">删除</a>&nbsp;test
    </button> </a> </li> </ul>

    这是全部内容,根本没有 JS 。
    fork3rt
        8
    fork3rt  
       2016-05-20 09:33:53 +08:00 via iPhone
    网址发来看看
    notgod
        9
    notgod  
       2016-05-20 09:35:51 +08:00
    gzip
    daiv
        10
    daiv  
    OP
       2016-05-20 09:41:48 +08:00
    @notgod Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。 如果 gzip ,会显示乱码的
    daiv
        11
    daiv  
    OP
       2016-05-20 09:57:41 +08:00
    @fork3rt http://gg.gg/secreturl (一会回复就不要贴网址,谢谢!帮同学研究的)
    fork3rt
        12
    fork3rt  
       2016-05-20 10:22:03 +08:00   ❤️ 1
    @daiv 用 terminal 执行后可以正常获取,你是用的 Pycharm 的 console 看的吧?
    daiv
        13
    daiv  
    OP
       2016-05-20 10:23:48 +08:00
    @fork3rt 对,我是用 pycharm console 看的
    misaka19000
        14
    misaka19000  
       2016-05-20 10:23:57 +08:00
    F12 看到的是生成好的源代码

    真正的源代码需要在网页上右击 → 查看源代码
    Cynic222
        15
    Cynic222  
       2016-05-20 10:24:18 +08:00   ❤️ 1
    @daiv 同样正常结果

    Out[9]: u'<ul class="betSlip full-text " \rdata-ub="0.00"\rdata-txr="0,-1,0,1,1#"\rdata-tcm="0"\rdata-bsuis="0" \rdata-xrte="1" \rdata-xrte-us="1"\rdata-stk-inc="0-2*2#2-250*10#250-500*10#500-1000*10#1000-2500*10#2500-5000*50#5000-10000*100#10000-25000*100#25000-50000*100#50000-99999999*100"\rdata-stk-mlt-inc="0-0.1*0.1#0.1-250*1#250-500*5#500-1000*10#1000-2500*50#2500-5000*100#5000-10000*100#10000-25000*100#25000-50000*100#50000-99999999*100"\rdata-isocode="RMB"\rdata-betguid=""\rdata-cus="N"> <li class="betslipHeader"> <a href="javascript:void(0);" class="removeAll">\u5168\u90e8\u5220\u9664</a> <div class="betslip-select" data-text="\u6a19\u6e96\u6295\u6ce8\u55ae"> <div id="BetSlipTypeSelectorWrapper"><div id="BetSlipTypeSelector">\u6a19\u6e96\u6295\u6ce8\u55ae</div></div> <div id="BetSlipTypesWrapper"> <div id="BetSlipTypeArrowTip"></div> <ul id="BetSlipTypes"><li data-item="1">\u6a19\u6e96\u6295\u6ce8\u55ae<span class="selected"></span></li><li data-item="2">Bankers\u5f0f\u6295\u6ce8</li></ul> </div> <select class="bet-slip-type" disabled="disabled" ><option selected="selected" value="1">\u6a19\u6e96\u6295\u6ce8\u55ae</option><option value="2">Bankers\u5f0f\u6295\u6ce8</option></select> </div> </li> <li class="emptyBetslip "><ul><li>\u8acb\u9ede\u64ca\u8ce0\u7387\u6dfb\u52a0\u6295\u6ce8</li></ul></li><li class="bsError feedBack hidden "> <div class="content"> <div class="image"><span class="icon"></span></div> <div class="text"></div> </div> </li><li id="pro" class="feedBack hidden"> <a href="javascript:void(0);" class="placeBetProgress abetslipBtn" data-atype="plc"><button><span class="buttonTextNoMessage">\u6b63\u5728\u8655\u7406\u4e2d</span><span class="buttonSmallSpinnerNoMessage"></span></button></a> </li> <li class="footer"> <span id="totalStake"></span> <a href="javascript:void(0);" class="acceptChanges abetslipBtn hidden"> <button>\u63a5\u53d7</button></a> <a href="javascript:void(0);" class="placeBet abetslipBtn failed-min-odds" data-atype="plc" > <button> <span class="totalStake"></span>&nbsp;<span class="isocode"></span>&nbsp;\u6295\u6ce8\r</button> </a> </li> </ul>'
    fork3rt
        16
    fork3rt  
       2016-05-20 10:24:54 +08:00   ❤️ 1
    @daiv

    f = open("1.txt", "a+")
    f.write(res.text.encode('utf-8'))
    f.close()

    文本里也是有内容的。 pycharm 的 console 经常坑爹的。。
    daiv
        17
    daiv  
    OP
       2016-05-20 10:28:18 +08:00
    @fork3rt 非常感谢你的提示,我用
    print co[:1000]
    或者
    print '{}'.format(co)
    这样的方式来打印就可以看。
    daiv
        18
    daiv  
    OP
       2016-05-20 10:33:08 +08:00
    @fork3rt 你的提醒后,发现时 pycharm 的 console 的坑。 第一次遇见这个坑
    daiv
        19
    daiv  
    OP
       2016-05-20 10:33:28 +08:00
    @Cynic222 现时 pycharm 的 console 的坑。 第一次遇见这个坑
    daiv
        20
    daiv  
    OP
       2016-05-20 11:06:53 +08:00
    @Cynic222 你使用什么进行输出的。 (我用 pycharm 的 console 有坑)
    daiv
        21
    daiv  
    OP
       2016-05-20 11:31:48 +08:00
    @fork3rt 我存到数据库中 也不行。 一定要保存成文件? 你的方法是可以保存全部 源文件的。
    Cynic222
        22
    Cynic222  
       2016-05-20 11:32:35 +08:00
    直接开个 terminal 跑 ipython.
    daiv
        23
    daiv  
    OP
       2016-05-20 11:36:54 +08:00
    @Cynic222 我一般 win 环境下用 pycharm ,方便。 生产环境才是 nginx+uwsgi
    fork3rt
        24
    fork3rt  
       2016-05-20 11:44:25 +08:00
    @daiv 保存数据库的代码贴一下
    daiv
        25
    daiv  
    OP
       2016-05-20 11:47:35 +08:00
    @fork3rt 先不说数据库了。 我保存到文件,再读出的时候,还是这么现实。 我现在尝试里面的代码有什么怪异的问题。
    fork3rt
        26
    fork3rt  
       2016-05-20 11:52:38 +08:00
    @daiv 哈哈 好的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1220 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:13 · PVG 02:13 · LAX 11:13 · JFK 14:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.