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

Android+Jsoup,为网站自定义api

  •  
  •   dichengsiyu · 2013-10-22 14:19:13 +08:00 · 3661 次点击
    这是一个创建于 4058 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求:在Android应用开发中,对于没有API的网站,如果想通过抓数据的形式组织数据。

    1. Android+Jsoup,在客户端直接抓取数据解析,使用Jsoup.parse的方法产生document类,很慢。考虑进行预处理,例如v2ex.com/recent?p=1,如果为了组织列表数据,只需要读取id=Main的div下面的数据,多余的数据并不需要传入parse方法进行解析。针对网站可能会改版,可以将对于节点的访问采用selector或正则的方式与具体解析分离,将这部分规则打成包单独维护。

    2. Android+网络爬虫程序中转请求。还是用v2ex.com/recent举例,如果希望访问列表数据,可以写一个服务端程序,用于接收客户端访问,然后抓取数据,解析产生json数据返回。有没有现成的服务可以将定制数据转换为json和xml调用?

    对于预处理,或者其他的方法,大家有什么建议么?欢迎讨论。
    6 条回复    1970-01-01 08:00:00 +08:00
    westlinkin
        1
    westlinkin  
       2013-10-22 14:21:13 +08:00
    我最近正在做这个事情,朝方法2努力
    dichengsiyu
        2
    dichengsiyu  
    OP
       2013-10-22 14:28:45 +08:00
    @westlinkin 第二种方案在简单客户端开发中感觉性价比不高。即便解析服务定制后可通用,但是无形中把对于目标站的访问压力又复制到爬虫服务上。
    oa414
        3
    oa414  
       2013-10-22 16:02:13 +08:00
    我做过这种事情

    1的缺点是耗流量,速度可能会慢。但是我爬的网站最后在客户端的抓取和解析速度还不错。此外,网站改版几乎是致命的,必须修改客户端。LZ的将解析规则分离想法不错,不过不知道实践起来能不能切合改版后的网站,因为之前没办法知道网站会改版成什么样,没办法调试

    2用脚本爬网站比在客户端上调试爬取解析方便多了,我觉得主要问题是自己要增加一个服务器的维护成本。我最近在试验用PHP写,客户端第一次请求的时候去抓取,结果缓存到本地,第二次直接返回本地结果,好处是PHP虚拟空间便宜又多,也不用专门开VPS
    icyflash
        4
    icyflash  
       2013-10-22 16:05:06 +08:00   ❤️ 1
    YQL ?
    dichengsiyu
        5
    dichengsiyu  
    OP
       2013-10-22 19:29:45 +08:00
    dichengsiyu
        6
    dichengsiyu  
    OP
       2013-10-22 19:33:02 +08:00
    @oa414
    1. 想是可以把规则做成“正则表达式字符串”,然后可以动态的做成一个表,通过一个固定的api可以访问,做一下简单的版本管理,每次加载的时候读取一下规则数据,如果有变化重新加载。不过还没有具体试验。我使用Jsoup解析,感觉很慢。我想即便是采用这种方式也需要做好预处理,其实有很多信息在构建parser树的时候是不需要的。

    2. 维护成本是这个方法的硬伤。@icyflash的推荐的YQL感觉很有意思,可以看看~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.