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

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

  •  
  •   LetFoxRun · 2014-04-08 22:59:41 +08:00 · 12899 次点击
    这是一个创建于 3883 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,我想写个爬虫登录北邮人论坛,地址: 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=UTF-8
    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
        19
    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   ·   实用小工具   ·   2968 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:16 · PVG 08:16 · LAX 16:16 · JFK 19:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.