爬虫挑战。。求支援 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
gkiwi
V2EX    程序员

爬虫挑战。。求支援

  •  
  •   gkiwi 2016-03-31 19:07:06 +08:00 7146 次点击
    这是一个创建于 3482 天前的主题,其中的信息可能已经有所发展或是发生改变。
    栗子:
    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  
    PRO
       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     Solana     5506 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 01:28 PVG 09:28 LAX 18:28 JFK 21:28
    Do have faith in what you're doing.
    ubao 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