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

怎么写个通用一点的抓取某网页的内容

  •  
  •   pythonee · 2014-05-18 15:39:05 +08:00 via Android · 5750 次点击
    这是一个创建于 3837 天前的主题,其中的信息可能已经有所发展或是发生改变。
    经常碰到有人问我,他们想订阅某网站的更新,但是不是整个网页,而是某个区块,抓取后可以存为图片也可以格式化后丢到文件里,我知道用现在的库可以很方便的抓取一个网页和存为图片,主要的问题是怎么把某个div抓出来,而且通用点,因为站点有点多
    21 条回复    2014-05-23 17:49:18 +08:00
    rekey
        1
    rekey  
       2014-05-18 16:11:00 +08:00
    read it late ?
    Livid
        2
    Livid  
    MOD
       2014-05-18 16:16:09 +08:00   ❤️ 1
    PhantomJS
    lbj96347
        3
    lbj96347  
       2014-05-18 16:21:44 +08:00
    如果这些div有一个通用的特征,例如位置,class,id,甚至颜色等,应该都可以通过这些特征抓取到,这里可以通过写正则写定位的方式,定位到。

    而工具的话,可以采用phantomjs实现,因为有些时候做前端自动化测试等,或者一些比较高质量的定向爬虫,phantomjs很好用,因为这个东西可以模拟一个真实的浏览器环境出来。而且你还可以加入一个jQuery这样的包,方便你的dom操作。
    lbj96347
        4
    lbj96347  
       2014-05-18 16:22:42 +08:00
    @Livid 哈哈,我写了太多的废话,被你抢了一步。:-)
    shiny
        5
    shiny  
       2014-05-18 16:32:29 +08:00
    写过一个 bot,只要会用 css 定位出区块就可以把内容图片链接抓出来。
    抓内容需要的工作是配置下 css 即可。
    pythonee
        6
    pythonee  
    OP
       2014-05-18 19:21:45 +08:00 via Android
    @Livid PhantomJS好像有乱码问题
    ccbikai
        7
    ccbikai  
       2014-05-18 20:05:14 +08:00 via Android   ❤️ 1
    python 的 BeautiSoup 做这个正好
    ETiV
        8
    ETiV  
       2014-05-18 20:09:49 +08:00   ❤️ 1
    YQL, Yahoo 的通用性抓取引擎.

    抓 cnbeta 首页新闻标题:

    select * from data.html.cssselect where url="http://www.cnbeta.com/" and css=".items_area dt a";

    {
    "a": [
    {
    "href": "/articles/293077.htm",
    "target": "_blank",
    "content": "可打电话 三星巨屏7英寸手机平板Galaxy W现身"
    },
    {
    "href": "/articles/293075.htm",
    "target": "_blank",
    "content": "苹果收购Beats的真正目的:点缀iWatch"
    },
    {
    "href": "/articles/293073.htm",
    "target": "_blank",
    "content": "Android和iOS应该如何向对方学习?"
    },
    ...
    ]
    }
    ericls
        9
    ericls  
       2014-05-18 20:28:27 +08:00 via Android   ❤️ 1
    这是一个很古老的问题 我看过一些文章
    看到快去傅立叶变换我就关了。。。
    楼主可以搜索 connect extraction
    thanksir
        10
    thanksir  
       2014-05-18 23:29:40 +08:00
    pyquery
    shoumu
        11
    shoumu  
       2014-05-18 23:31:07 +08:00
    xpath吧
    zzNucker
        12
    zzNucker  
       2014-05-19 00:02:59 +08:00
    @pythonee 乱码问题没有啊,显示乱码一般是字体原因导致的。
    ybh37
        13
    ybh37  
       2014-05-19 08:21:07 +08:00
    看了一下,pyquery PhantomJS都不错,自己写也未尝不可。
    pythonee
        14
    pythonee  
    OP
       2014-05-19 09:32:30 +08:00 via Android
    @ETiV 这个厉害了
    looly
        15
    looly  
       2014-05-19 10:07:05 +08:00
    一般两种方式:
    1、如果是非文章类可以XPath方式获取节点内的内容或者直接用正则
    2、如果文字很多可以考虑基于区块的正文识别来获得正文,可以在github上看下cx-extractor这个项目。
    imn1
        16
    imn1  
       2014-05-19 14:04:22 +08:00
    不同站点的通用很难写的,我自写在用的,把过程提取出来作为模块,但也是每站点一堆参数,目前也就几十个站点,把参数写好,只要该网站不改版,下次还能用,改版了就要重写一次参数
    当然不少站点的参数都类似,不同仅仅在正则,例如瀑布流ajax可以写成一个模板,不同站点的瀑布流就改改提交获取json路径就可以了,又如有些站点是第1页~第N页,也可以写个递增模板,不同的应用只需填入最后的页数和路径就行

    目前遇到最难的是用js计算路径的,暂时不懂也不太想调用外部的js引擎,主要不是难,而是耗资源,算上万网页就是个问题

    能用正则就尽量用正则,xpath因为要导入一个dom树,单个页面会比正则多消耗20%的时间,如果页面过万,可能就是倍数而不仅是20%~
    ericls
        17
    ericls  
       2014-05-19 21:59:50 +08:00
    突然发现我上面的写错了 是content extraction ..
    missdeer
        18
    missdeer  
       2014-05-20 11:22:13 +08:00
    抓正文网上有各种语言实现的readability代码,抓其他元素的感觉XPath可以试试
    RangerWolf
        19
    RangerWolf  
       2014-05-20 22:04:38 +08:00
    @imn1 如果是css selector的方式呢? 之前看了一本书说css选择器的效率还不错
    另外 20%是你估算的还是有测试数据支撑?
    imn1
        20
    imn1  
       2014-05-23 15:46:37 +08:00
    @RangerWolf 实际工作的测试,约5000个html,py3,纯parse,无下载过程(用wget另外下载的,不在程序内),除了用正则regex和lxml+xpath三行代码不同外,其他语句一样,单线程,无协程,CPU是老机器T2390,如果快点的CPU可能没那么明显
    美丽汤4的css selector比lxml还要慢,这个老早有洋人测试过了,google一下,个人觉得只要载入DOM树,肯定要占资源多些的,理论上是这样,不过dom比较容易定位找到目标,正则要准确定位就要需要技巧,尤其是排除型正则比较难写
    RangerWolf
        21
    RangerWolf  
       2014-05-23 17:49:18 +08:00
    @imn1 感谢回复~ 还没有遇过这种场景。 之前写的一个网页爬虫,性能上可能电脑要好一点笔记本 i5 双核 + 4G内存。 Java + Jsoup css selector 感觉速度还行。Python的话没写过很正式的爬虫,没有经验了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5804 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.