一般情况下,写爬虫怎么抓取 AJAX 这种动态网页? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LetFoxRun
V2EX    问与答

一般情况下,写爬虫怎么抓取 AJAX 这种动态网页?

  •  
  •   LetFoxRun 2014-04-08 22:59:41 +08:00 13335 次点击
    这是一个创建于 4222 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,我想写个爬虫登录北邮人论坛,地址: http://bbs.byr.cn/

    我抓包发现登录地址为: http://bbs.byr.cn/user/ajax_login.json

    为什么这个登录地址状态码为200,但是网页打开后是空白?

    如果我想爬虫登录此网站,应该怎么处理?

    不会JS/AJAX,需要学的比较多,谢谢。
    23 条回复    2014-06-11 21:38:53 +08:00
    inaction
        1
    inaction  
       2014-04-08 23:28:46 +08:00   1
    先登录,导出 cookie,将cookie附在请求中,再继续抓取。
    LetFoxRun
        2
    LetFoxRun  
    OP
       2014-04-08 23:34:48 +08:00
    @inaction 你好,谢谢。普通的网站(未使用AJAX等技术的),我知道怎么登录,表单+Cookie基本上就可以了,但是我看BYR论坛里的登录地址( http://bbs.byr.cn/user/ajax_login.json)打开是空白的,但是之前未使用AJAX的网页打开不是空白的,这个登录方法一样吗?

    感谢已发送。
    FreDom
        3
    FreDom  
       2014-04-08 23:47:41 +08:00
    @LetFoxRun 地址请求返回404,看来是对请求进行了ajax请求判断,你觉得你可以修改一下报头,模拟ajax请求就好了
    sb
        4
    sb  
       2014-04-09 00:00:07 +08:00   1
    直接POST登录就可以了
    POST http://bbs.byr.cn/user/ajax_login.json
    不是GET请求
    复制一段header来看看

    POST /user/ajax_login.json HTTP/1.1
    这里写的比较清楚了 POST过去
    Host: bbs.byr.cn
    Connection: keep-alive
    Content-Length: 37
    Accept: application/json, text/Javascript, */*; q=0.01
    Origin: http://bbs.byr.cn
    X-Requested-With: XMLHttpRequest
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36
    Content-Type: application/x-www-form-urlencoded; charset=
    DNT: 1
    Referer: http://bbs.byr.cn/index
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2,nl;q=0.2
    Cookie: nforum[UTMPUSERID]=guest; nforum[UTMPKEY]=7346893; nforum[UTMPNUM]=23586; __utma=217424581.1890372499.1396972428.1396972428.1396972428.1; __utmb=217424581.1.10.1396972428; __utmc=217424581; __utmz=217424581.1396972428.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); login-user=1

    参数为:id=XXXX&passwd=XXXX&mode=XX&CookieDate=XX
    LetFoxRun
        5
    LetFoxRun  
    OP
       2014-04-09 00:13:27 +08:00
    @sb 非常感谢,感谢已发送。我有一点不解的是mode=XX&CookieDate=XX 这个参数你是怎么发现的呢?

    谢谢。
    LetFoxRun
        6
    LetFoxRun  
    OP
       2014-04-09 00:21:40 +08:00
    @FreDom 你好,感谢已发送,有个小问题,我前面说了不会AJAX,这里请教下:

    1.对请求进行了ajax请求判断,这句话是什么意思,就是ajax请求判断是干啥的?
    2.模拟ajax请求,这个用python怎么办到?需要使用phantomjs这种吗?

    问题有点多,感谢回复。
    FreDom
        7
    FreDom  
       2014-04-09 00:38:38 +08:00   1
    @LetFoxRun

    1.服务器端可以通过request headers的信息来判断请求是否属于ajax请求,好像:
    X-Requested-With: XMLHttpRequest
    这就是ajax请求特有的header信息

    2.懂了上面那一点,你就应该知道怎么用python模拟ajax请求了,你也可以google一下,应该有很多答案。还有如果你要抓取的页面太多ajax请求(如淘宝商品页面),使用phantomjs也是一种办法。
    txlty
        8
    txlty  
       2014-04-09 02:55:08 +08:00   1
    方法就两种:模拟HTTP请求。模拟浏览器。
    第一种,分析js代码,把需要的参数都发过去。尽可能的模拟真实http请求。一个http请求就搞定,执行效率较高。
    第二种,全面模拟浏览器抓取,这就自动生成一堆http请求了,而且解析html,并执行页面里的js。这种方法执行效率较低。但编写的时候更省事。
    java可以用htmlunit,c#可以用WebClient。至于各种脚本语言,可以调用phantomjs。

    楼上说得对,那个地址做了ajax请求判断。假装自己是ajax产生的请求就能访问了。
    tinyhill
        9
    tinyhill  
       2014-04-09 07:55:24 +08:00 via iPhone
    用 nodejs 跑
    Elethom
        10
    Elethom  
       2014-04-09 08:05:11 +08:00
    nForum 有 API 的...
    sb
        11
    sb  
       2014-04-09 08:15:16 +08:00
    @LetFoxRun Chrome 按下F12/右键 打开审查元素 在network选项卡有数据包看的
    ushuz
        12
    ushuz  
       2014-04-09 09:02:50 +08:00 via iPhone
    不需要模拟ajax,直接抓包,爬虫post相同的headers和body。
    LetFoxRun
        13
    LetFoxRun  
    OP
       2014-04-09 09:30:56 +08:00
    @txlty 你好,弱弱的问,你打开网址里面貌似有些json串内容,为什么我打开登录网址确实空白的?

    我猜你是假装AJAX访问吧,那你图中用的是什么插件呢?

    感谢已发送,谢谢。
    anewg
        14
    anewg  
       2014-04-09 09:34:51 +08:00
    Selenium
    LetFoxRun
        15
    LetFoxRun  
    OP
       2014-04-09 09:42:28 +08:00
    @sb 恩,谢谢,我也是这样做的,但是发现表单里只有id=XXXX passwd=XXXX ,没有你说的mode和CookieData。
    sb
        16
    sb  
       2014-04-09 10:55:25 +08:00   1
    @LetFoxRun 我是直接打开http://bbs.byr.cn/index页面进行提交的 就有这两个参数了
    binux
        17
    binux  
       2014-04-09 11:00:41 +08:00   1
    打开开发者工具,切换到 Network
    LetFoxRun
        18
    LetFoxRun  
    OP
       2014-04-09 11:17:04 +08:00
    @binux 这个我是知道的,谢谢回复,但是我想问大神师兄一个问题,我知道有selenium、phantomjs等工具模拟浏览器引擎来执行JS,但是如果我不想使用上面那几款工具,但页面包含少部分JS生成的代码,有什么解决办法吗?

    谢谢,感谢已发送。
    binux
        1
    binux  
       2014-04-09 11:27:41 +08:00
    @LetFoxRun 你关心的是数据而不是页面对吗?即使页面是 JS 生成的,它也依赖某个数据来源,直接获得它。
    txlty
        20
    txlty  
       2014-04-09 23:45:23 +08:00
    @LetFoxRun 任何可以伪造http请求头的插件都可以。我用的这个扩展就叫“修改HTTP请求头”。
    laozhao0
        21
    laozhao0  
       2014-06-10 18:15:12 +08:00
    你好,这边可以实现北邮人论坛信息的抓取,水木清华信息爬取也是可以的,示例 http://huntinfo.sinaapp.com/ 。用的是Jsoup 。不需要登录。
    LetFoxRun
        22
    LetFoxRun  
    OP
       2014-06-10 23:12:02 +08:00
    @laozhao0 你是北邮的学生吗?
    laozhao0
        23
    laozhao0  
       2014-06-11 21:38:53 +08:00
    @LetFoxRun 不是。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5823 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 02:39 PVG 10:39 LAX 19:39 JFK 22:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86