1
feather12315 2016-03-31 19:16:55 +08:00 via Android 1
开源 OCR ?
|
2
gkiwi OP @feather12315 这个就远了。有想过用机器学习来做,成本太高。
|
3
magicdawn 2016-03-31 19:28:21 +08:00
|
4
magicdawn 2016-03-31 19:28:58 +08:00
手动写下这些 class 与 数字的关系。。。哎
|
5
armstrong 2016-03-31 19:29:24 +08:00
赞楼主的好心态,围观后续的解决方案
|
6
magicdawn 2016-03-31 19:30:10 +08:00
还有图片不一样。。。也是醉了
|
8
domty 2016-03-31 19:41:01 +08:00 1
他后端应该有详细的数字标点转图片的解决方案。
通过字符集模板图片+css 浮动来控制显示的字符。 |
9
iannil 2016-03-31 19:47:16 +08:00 1
连着标点位置 css 、标点 png 和 html 一起拿下来,存好对应关系,在 html 里抓出目标文本,在有标点的地方做好标记。
纯数字+标点的图,但做 OCR 的话,正确率很高的。也可以做另一个服务进行二次处理,每 4-6 个字符扔给验证码识别服务里去做识别。正确率也很高。 |
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 地址部分相同 |
12
magicdawn 2016-03-31 19:56:36 +08:00
拿 css 的背景图片 + class 的 background-position 去切割图片,然后拿去 ocr 识别。好复杂的说。
|
13
xujunfu 2016-03-31 20:00:09 +08:00
有 splinter 啊
|
14
domty 2016-03-31 20:06:14 +08:00 1
它的 css 和字符集模板图片是同名的,也就是说当我需要以图片的形式显示一个文字或标点符号的时候,我只要随机从几个样式中选出一个就可以了。也就是说同一份 css 文件下,一个 css class 就代表一个字符。
它给出的图片是静态资源,也就是说这样一份随机生成的样本数量应该是有限的。文件名是 584**,样本数量应该也就是( 26+26+10)的平方个样本。 可不可以人肉破解几个拿到已知的数字或符号,在抓取足够的符号样本,然后去其他页面进行穷举。 |
15
YUX 2016-03-31 20:08:50 +08:00 1
给我三个小时 我看看能不能帮上点忙
|
16
pimin 2016-03-31 20:30:07 +08:00 1
@ 3dwelcome
让算法大师给你解一下 这个确实挺有意思的 我觉得爬虫嘛,未必要真爬成文字 他图片你就解析图片成 HTML 存好了 根据他的图片和位置关系,把图片切出来. 反推的难度我感觉有点大. |
17
alexapollo 2016-03-31 20:34:08 +08:00
mark.
|
18
klmun 2016-03-31 20:45:01 +08:00
mark
看起来挺麻烦的 |
19
aaronrzh 2016-03-31 21:00:45 +08:00
OCR 可能是最简单的方法了,图片和 css 可以随机生成的
http://code.bankrate.com.cn/getProductData/financing_gRrgLT98?pos=detail 这是获取数据的接口,除非能直接看见接口代码,不然就是瞎猜了 |
20
aabbccli 2016-03-31 21:20:43 +08:00 1
试了下,浏览器禁止 JS 以后,显示正常文本
|
21
sohoer 2016-03-31 21:33:06 +08:00 1
CSS 与 PNG 图片是一一对应的,只能通过 CSS 位置再切字符图片做 OCR 处理
这个 OCR 已经很简单了,转成位图多少个字符做多少个模板,(还可以使用相似度匹配算法,基本上 100%正确) 对字符做 OCR 后可以得到一张 CLASS 对应字符的表 |
22
Rubbly 2016-03-31 21:39:33 +08:00
20L 方法亲测有效...
|
23
yixiang 2016-03-31 22:05:04 +08:00
用 20L 方法,产品成立日期和起购金额之类数据是显示不出来的。
这部分是直接服务器传过来 css 和 html ,转换成图片之前的原始数据应该一开始就不在客户端。 不管怎样都要处理图片。 |
24
WildCat 2016-03-31 22:08:09 +08:00 1
OCR 感觉清晰度可以,训练下模型应该可以用( wan )
|
25
sjlee 2016-03-31 22:14:22 +08:00 1
这种黑白数字 OCR 是最简单的。以前我用 tesseract 试过,可行。
|
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(切好的小图)) |
27
sunchen 2016-03-31 23:15:32 +08:00 1
pHash 可以试试能不能简化图片识别
|
29
gkiwi OP |
32
hiboshi 2016-04-01 00:13:46 +08:00
|
33
sjlee 2016-04-01 00:43:00 +08:00
|
34
ysmood 2016-04-01 00:55:35 +08:00
我直接 curl 就获取到内容了啊?不需要特殊处理就能拿到全部数据。它用图片混淆是为了防止人用鼠标复制内容的,不是为了防搜索引擎或爬虫的,这站点 seo 做的挺好的。
就是你想太多了吧? |
36
icedx 2016-04-01 01:05:53 +08:00 via Android
|
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 对应的是什么数字 |
38
gkiwi OP @icedx
Q: base64.b64decode('MTUwNjA0MTAwMA==') 谢谢!看了你的代码,差异的地方在于 图片识别的我用的是 tesseract (效果不如预期),看你的是利用 ximage_str 直接计算图片二值化后的相似度,这个应该会好很多,毕竟取_max 至少是不会出现 tesseract 中识别不出啥的情况。明早起来我试试看! |
39
gkiwi OP @ysmood 仔细瞅瞅数据,可以看到 curl 拿到的,部分数字是没有的,文字都是存在的。他图片化的只有标点和数字。这样子对 SEO 和网站自适应都有好处
|
40
RangerWolf 2016-04-01 09:16:40 +08:00
楼主,如果提供识别率>90%的解析 API ,你愿意付费吗?
|
41
alexinit 2016-04-01 10:56:37 +08:00
mark
|
42
zhoutianmao 2016-04-01 11:26:11 +08:00
mark 一下吧。刚开始做爬虫。
|
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% |
44
icedx 2016-04-01 12:02:24 +08:00
已提交 pr
|
45
leavic 2016-04-01 12:18:02 +08:00
我试了一下 scrapy shell ,直接 view content 完全和网站一样啊。
20L 说的禁用 js ,我觉得这都是写爬虫的基本第一步了吧,肯定不能让爬虫取解析 js 。 说白了,我真不知道楼主碰到了什么问题。 |
46
leavic 2016-04-01 12:20:59 +08:00
好吧,原来是几个基金信息那里有猫腻,研究一下。
|
47
herozzm 2016-04-01 12:21:29 +08:00
我看到和 20L , 34L 的一样,源代码中都是可以直接看到所有数字和图片,只是用 js 替换了一下,防止复制而已
|
49
herozzm 2016-04-01 12:24:23 +08:00
我忽略了部分数据, js 只是替换部分,头部表格内的数据依然是图片
|
50
herozzm 2016-04-01 12:44:55 +08:00
他的背景图片都做了干扰,但干扰的不太厉害,这和破解验证码一个道理了
|
51
shenghe 2016-04-01 13:29:15 +08:00
搞这玩意,浪费时间和金钱嘛,这里不是有一样的数据吗? http://xueqiu.com/S/FP7233387300
|
52
jswh 2016-04-01 13:48:08 +08:00
如果愿意花钱的话,可以参考人工打码解决方案,我觉得是最快的。
|
53
rale 2016-04-01 14:36:21 +08:00
期待楼主新的解决方案,看了帖子,有了很多思路,同时,假如返回的是矢量图片,那效果怎么样?
|
55
sunwei0325 2016-04-02 21:51:54 +08:00
美团也是这样的, 金额都是数字图片, 太恶心了
|
56
zvDC 2016-04-02 22:13:05 +08:00
学习很多思路
|
57
gkiwi OP 我测试了 @icedx 给的代码,裸眼了几个结果,感觉都 ok ,其实主要是数字没问题就好了。谢!!!
@rale 可以考虑把矢量图转换为位图再处理。。不过不清楚矢量图文件格式是否有更简洁的途径。 @RangerWolf 只是临时性质的任务,已经搞定。如果是大任务量的爬虫,可以联系合作:) @shenghe 算是个挑战吧。在其他网站确实都找到了数据,但是这个坑还得填啊! |
58
icedx 2016-04-04 15:21:36 +08:00
我已经发了 PR 到 https://github.com/bugkiwi/ocr_yinhang 合并下在 Github 上展示吧~
|
59
RangerWolf 2016-04-04 16:49:22 +08:00
@gkiwi 恭喜楼主搞定! 其实我这边主要也是最近有类似的识别数字的任务,并且用的是机器学习的那一套(我只负责调用 lib 接口 呵呵) 并且准确率可能要 95%以上,想着你说不定正好需要 哈哈
|
60
gkiwi OP |
61
RangerWolf 2016-04-05 08:47:59 +08:00
@gkiwi 其实是类似这个东西: https://www.kaggle.com/c/digit-recognizer
|