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

爬虫挑战。。求支援

  •  
  •   gkiwi · 2016-03-31 19:07:06 +08:00 · 6676 次点击
    这是一个创建于 3163 天前的主题,其中的信息可能已经有所发展或是发生改变。
    栗子:
    http://www.yinhang.com/licaichanpin_gRrgLT98.html

    以前一直觉得爬虫的难度可能在 ip ,频次,模拟鼠标操作等等,从来不觉得解析 html 是问题,但是这次是真给跪了。

    网页上的 数字和标点 都是图片生成的,而且每次请求图片都不一样。

    第一次遇见这种,如果爬不了,多问一句,有没有这样子的开源库可以拿来做防爬虫。。
    第 1 条附言  ·  2016-03-31 19:48:03 +08:00
    其实是被打脸了,别人问我怎么防爬虫,我说没办法防住,模拟人工操作,怎么着都能分分钟解析,特别是数据量有限的情况下。然后分分钟我就遇到这个了。。蛋疼
    第 2 条附言  ·  2016-03-31 23:51:57 +08:00
    ocr 效果暂时不太好(姿势不对估计)。
    直接按照 css 切图出来,使用 tesseract 做了识别,只有部分能识别,图片还需要处理;

    https://github.com/bugkiwi/ocr_yinhang

    :(
    第 3 条附言  ·  2016-04-04 14:31:43 +08:00
    参照:承接全球五个大洲海淘爬虫 @icedx 提供的代码
    https://drive.google.com/file/d/0B3Y1POZM1XkEeTh6bFlXbDVIWkU/view

    搞定!
    61 条回复    2016-04-05 08:47:59 +08:00
    feather12315
        1
    feather12315  
       2016-03-31 19:16:55 +08:00 via Android   ❤️ 1
    开源 OCR ?
    gkiwi
        2
    gkiwi  
    OP
       2016-03-31 19:19:35 +08:00
    @feather12315 这个就远了。有想过用机器学习来做,成本太高。
    magicdawn
        3
    magicdawn  
       2016-03-31 19:28:21 +08:00
    magicdawn
        4
    magicdawn  
       2016-03-31 19:28:58 +08:00
    手动写下这些 class 与 数字的关系。。。哎
    armstrong
        5
    armstrong  
       2016-03-31 19:29:24 +08:00
    赞楼主的好心态,围观后续的解决方案
    magicdawn
        6
    magicdawn  
       2016-03-31 19:30:10 +08:00
    还有图片不一样。。。也是醉了
    gkiwi
        7
    gkiwi  
    OP
       2016-03-31 19:37:20 +08:00
    @magicdawn 你刷新下看看, class 也是不一样的。。。
    domty
        8
    domty  
       2016-03-31 19:41:01 +08:00   ❤️ 1
    他后端应该有详细的数字标点转图片的解决方案。
    通过字符集模板图片+css 浮动来控制显示的字符。
    iannil
        9
    iannil  
       2016-03-31 19:47:16 +08:00   ❤️ 1
    连着标点位置 css 、标点 png 和 html 一起拿下来,存好对应关系,在 html 里抓出目标文本,在有标点的地方做好标记。

    纯数字+标点的图,但做 OCR 的话,正确率很高的。也可以做另一个服务进行二次处理,每 4-6 个字符扔给验证码识别服务里去做识别。正确率也很高。
    gkiwi
        10
    gkiwi  
    OP
       2016-03-31 19:49:28 +08:00
    @iannil
    嗯,有这个思路。已经下载 tesseract 准备尝试了,看看效果吧:)
    magicdawn
        11
    magicdawn  
       2016-03-31 19:54:00 +08:00   ❤️ 1
    可变这个我找到了这个,是一个 jsonp 请求,数据都在这个里面

    curl 'http://code.bankrate.com.cn/getProductData/financing_gRrgLT98?pos=detail' -H 'DNT: 1' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: zh-CN,zh;q=0 .8,en-US;q=0.6,en;q=0.4,zh-TW;q=0.2' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36' -H 'Ac cept: */*' -H 'Referer: http://www.yinhang.com/licaichanpin_gRrgLT98.html' -H 'Cookie: yinhangphp=3d875ac5e500d51a632d4959018a0ed9; uuid=NDc0ODQxMjg0|1459423300|c0639c96 ddb05e0ff90a9e021cbea2d93f6917f5; origin_referer="http%3A//v2ex.com/t/267702"' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed

    里面包含了 css 地址, css 地址跟 bg 地址部分相同
    magicdawn
        12
    magicdawn  
       2016-03-31 19:56:36 +08:00
    拿 css 的背景图片 + class 的 background-position 去切割图片,然后拿去 ocr 识别。好复杂的说。
    xujunfu
        13
    xujunfu  
       2016-03-31 20:00:09 +08:00
    有 splinter 啊
    domty
        14
    domty  
       2016-03-31 20:06:14 +08:00   ❤️ 1
    它的 css 和字符集模板图片是同名的,也就是说当我需要以图片的形式显示一个文字或标点符号的时候,我只要随机从几个样式中选出一个就可以了。也就是说同一份 css 文件下,一个 css class 就代表一个字符。

    它给出的图片是静态资源,也就是说这样一份随机生成的样本数量应该是有限的。文件名是 584**,样本数量应该也就是( 26+26+10)的平方个样本。

    可不可以人肉破解几个拿到已知的数字或符号,在抓取足够的符号样本,然后去其他页面进行穷举。
    YUX
        15
    YUX  
       2016-03-31 20:08:50 +08:00   ❤️ 1
    给我三个小时 我看看能不能帮上点忙
    pimin
        16
    pimin  
       2016-03-31 20:30:07 +08:00   ❤️ 1
    @ 3dwelcome
    让算法大师给你解一下

    这个确实挺有意思的

    我觉得爬虫嘛,未必要真爬成文字
    他图片你就解析图片成 HTML 存好了
    根据他的图片和位置关系,把图片切出来.

    反推的难度我感觉有点大.
    alexapollo
        17
    alexapollo  
       2016-03-31 20:34:08 +08:00
    mark.
    klmun
        18
    klmun  
       2016-03-31 20:45:01 +08:00
    mark
    看起来挺麻烦的
    aaronrzh
        19
    aaronrzh  
       2016-03-31 21:00:45 +08:00
    OCR 可能是最简单的方法了,图片和 css 可以随机生成的
    http://code.bankrate.com.cn/getProductData/financing_gRrgLT98?pos=detail
    这是获取数据的接口,除非能直接看见接口代码,不然就是瞎猜了
    aabbccli
        20
    aabbccli  
       2016-03-31 21:20:43 +08:00   ❤️ 1
    试了下,浏览器禁止 JS 以后,显示正常文本
    sohoer
        21
    sohoer  
       2016-03-31 21:33:06 +08:00   ❤️ 1
    CSS 与 PNG 图片是一一对应的,只能通过 CSS 位置再切字符图片做 OCR 处理
    这个 OCR 已经很简单了,转成位图多少个字符做多少个模板,(还可以使用相似度匹配算法,基本上 100%正确)
    对字符做 OCR 后可以得到一张 CLASS 对应字符的表
    Rubbly
        22
    Rubbly  
       2016-03-31 21:39:33 +08:00
    20L 方法亲测有效...
    yixiang
        23
    yixiang  
       2016-03-31 22:05:04 +08:00
    用 20L 方法,产品成立日期和起购金额之类数据是显示不出来的。

    这部分是直接服务器传过来 css 和 html ,转换成图片之前的原始数据应该一开始就不在客户端。

    不管怎样都要处理图片。
    WildCat
        24
    WildCat  
       2016-03-31 22:08:09 +08:00   ❤️ 1
    OCR 感觉清晰度可以,训练下模型应该可以用( wan )
    sjlee
        25
    sjlee  
       2016-03-31 22:14:22 +08:00   ❤️ 1
    这种黑白数字 OCR 是最简单的。以前我用 tesseract 试过,可行。
    icedx
        26
    icedx  
       2016-03-31 22:42:10 +08:00   ❤️ 2
    写着写着就厌倦了
    https://file.io/z6QI7F
    先用 binarization_spec()二值化图片
    再用 cut_images(图片文件,css_parse_spec(对应 CSS)) 切图
    然后 compare_picture(load_image(切好的小图))
    sunchen
        27
    sunchen  
       2016-03-31 23:15:32 +08:00   ❤️ 1
    pHash 可以试试能不能简化图片识别
    gkiwi
        28
    gkiwi  
    OP
       2016-03-31 23:54:13 +08:00
    @domty 不想当人肉。。
    gkiwi
        29
    gkiwi  
    OP
       2016-03-31 23:56:42 +08:00
    @feather12315
    @sohoer
    @WildCat
    @sjlee
    @icedx
    @sunchen

    ocr 效果不好,不太懂图片预处理的事情,大家有思路么?

    @icedx 链接挂了~
    gkiwi
        30
    gkiwi  
    OP
       2016-03-31 23:59:41 +08:00
    @pimin 这个思路棒,不过在我的场景下不适合,数据库索引就跪了。。
    hiboshi
        31
    hiboshi  
       2016-04-01 00:10:42 +08:00
    @pimin 将图片部分之间切成图片是可行,但是 很多时候 爬出来的数据时要做 查询的。
    hiboshi
        32
    hiboshi  
       2016-04-01 00:13:46 +08:00
    楼组

    我觉得 可以 找出 css 里面的规律 然后 对应起来
    http://b1r.cn/dicss/584vX.css
    sjlee
        33
    sjlee  
       2016-04-01 00:43:00 +08:00
    @gkiwi

    那些图片的数据貌似在渲染后网页上有固定位置,或者你可以把要爬的网页截屏,再把想要的数据抠出来,然后 OCR 就简单了。
    ysmood
        34
    ysmood  
       2016-04-01 00:55:35 +08:00
    我直接 curl 就获取到内容了啊?不需要特殊处理就能拿到全部数据。它用图片混淆是为了防止人用鼠标复制内容的,不是为了防搜索引擎或爬虫的,这站点 seo 做的挺好的。

    就是你想太多了吧?
    icedx
        35
    icedx  
       2016-04-01 00:57:11 +08:00 via Android
    @gkiwi 楼主 QQ 多少
    icedx
        36
    icedx  
       2016-04-01 01:05:53 +08:00 via Android
    icedx
        37
    icedx  
       2016-04-01 01:17:27 +08:00 via Android
    用 phantomjs 或者 QWebkit 渲染页面

    然后能拿到一个 css 地址
    可以推导出含有字符图片的地址
    先用 binarization_spec()二值化字符图片
    再用 cut_images(二值化后的字符图片文件,css_parse_spec(对应 css)) 进行切图
    然后用 load_image(切好的小图)) 得到一个 list
    然后 compare_picture() 进行对比 得到一个 list
    根据 list 包含的文件名 就能知道相应的 css ID 对应的是什么数字
    gkiwi
        38
    gkiwi  
    OP
       2016-04-01 02:05:16 +08:00
    @icedx

    Q: base64.b64decode('MTUwNjA0MTAwMA==')

    谢谢!看了你的代码,差异的地方在于 图片识别的我用的是 tesseract (效果不如预期),看你的是利用 ximage_str 直接计算图片二值化后的相似度,这个应该会好很多,毕竟取_max 至少是不会出现 tesseract 中识别不出啥的情况。明早起来我试试看!
    gkiwi
        39
    gkiwi  
    OP
       2016-04-01 02:06:48 +08:00
    @ysmood 仔细瞅瞅数据,可以看到 curl 拿到的,部分数字是没有的,文字都是存在的。他图片化的只有标点和数字。这样子对 SEO 和网站自适应都有好处
    RangerWolf
        40
    RangerWolf  
       2016-04-01 09:16:40 +08:00
    楼主,如果提供识别率>90%的解析 API ,你愿意付费吗?
    alexinit
        41
    alexinit  
       2016-04-01 10:56:37 +08:00
    mark
    zhoutianmao
        42
    zhoutianmao  
       2016-04-01 11:26:11 +08:00
    mark 一下吧。刚开始做爬虫。
    icedx
        43
    icedx  
       2016-04-01 11:58:02 +08:00
    本站监测到来自您这个 IP 地址不友好的访问行为。暂时对来自这个 IP 的访问请求进行了限制。如您对银率网的数据有合作意向,请提交如下申请,本站将据此决定是否解除限制或商谈合作方式:

    只好写个本地的了
    https://drive.google.com/file/d/0B3Y1POZM1XkEeTh6bFlXbDVIWkU/view
    把图片和对应的 css 放到 test 目录里
    然后调用 learn.py 里的函数
    test('test'+os.sep+'584Gh.css','test'+os.sep+'584Gh.png')
    第一个填 css 路径 第二个填图片路径
    识别率应该是 90%
    icedx
        44
    icedx  
       2016-04-01 12:02:24 +08:00
    已提交 pr
    leavic
        45
    leavic  
       2016-04-01 12:18:02 +08:00
    我试了一下 scrapy shell ,直接 view content 完全和网站一样啊。
    20L 说的禁用 js ,我觉得这都是写爬虫的基本第一步了吧,肯定不能让爬虫取解析 js 。

    说白了,我真不知道楼主碰到了什么问题。
    leavic
        46
    leavic  
       2016-04-01 12:20:59 +08:00
    好吧,原来是几个基金信息那里有猫腻,研究一下。
    herozzm
        47
    herozzm  
       2016-04-01 12:21:29 +08:00
    我看到和 20L , 34L 的一样,源代码中都是可以直接看到所有数字和图片,只是用 js 替换了一下,防止复制而已
    ysmood
        48
    ysmood  
       2016-04-01 12:23:55 +08:00
    @ysmood 具体是哪部分数字没有,都有的吧?根本就不需要用 phantom 去渲染页面
    herozzm
        49
    herozzm  
       2016-04-01 12:24:23 +08:00
    我忽略了部分数据, js 只是替换部分,头部表格内的数据依然是图片
    herozzm
        50
    herozzm  
       2016-04-01 12:44:55 +08:00
    他的背景图片都做了干扰,但干扰的不太厉害,这和破解验证码一个道理了
    shenghe
        51
    shenghe  
       2016-04-01 13:29:15 +08:00
    搞这玩意,浪费时间和金钱嘛,这里不是有一样的数据吗? http://xueqiu.com/S/FP7233387300
    jswh
        52
    jswh  
       2016-04-01 13:48:08 +08:00
    如果愿意花钱的话,可以参考人工打码解决方案,我觉得是最快的。
    rale
        53
    rale  
       2016-04-01 14:36:21 +08:00
    期待楼主新的解决方案,看了帖子,有了很多思路,同时,假如返回的是矢量图片,那效果怎么样?
    jalen
        54
    jalen  
       2016-04-01 15:40:27 +08:00
    @shenghe 23333
    sunwei0325
        55
    sunwei0325  
       2016-04-02 21:51:54 +08:00
    美团也是这样的, 金额都是数字图片, 太恶心了
    zvDC
        56
    zvDC  
       2016-04-02 22:13:05 +08:00
    学习很多思路
    gkiwi
        57
    gkiwi  
    OP
       2016-04-04 14:39:21 +08:00   ❤️ 1
    我测试了 @icedx 给的代码,裸眼了几个结果,感觉都 ok ,其实主要是数字没问题就好了。谢!!!

    @rale 可以考虑把矢量图转换为位图再处理。。不过不清楚矢量图文件格式是否有更简洁的途径。

    @RangerWolf 只是临时性质的任务,已经搞定。如果是大任务量的爬虫,可以联系合作:)

    @shenghe 算是个挑战吧。在其他网站确实都找到了数据,但是这个坑还得填啊!
    icedx
        58
    icedx  
       2016-04-04 15:21:36 +08:00
    我已经发了 PR 到 https://github.com/bugkiwi/ocr_yinhang 合并下在 Github 上展示吧~
    RangerWolf
        59
    RangerWolf  
       2016-04-04 16:49:22 +08:00
    @gkiwi 恭喜楼主搞定! 其实我这边主要也是最近有类似的识别数字的任务,并且用的是机器学习的那一套(我只负责调用 lib 接口 呵呵) 并且准确率可能要 95%以上,想着你说不定正好需要 哈哈
    gkiwi
        60
    gkiwi  
    OP
       2016-04-04 23:06:16 +08:00
    @icedx ok~~

    @RangerWolf 哈哈,可以分享出来,让我们学习学习:)
    RangerWolf
        61
    RangerWolf  
       2016-04-05 08:47:59 +08:00
    @gkiwi 其实是类似这个东西: https://www.kaggle.com/c/digit-recognizer
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3477 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 925ms · UTC 10:48 · PVG 18:48 · LAX 02:48 · JFK 05:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.