需要爬取一个网站内容,需登录和验证码(简单字母数字),怎么破?

2013-07-05 23:50:38 +08:00
 daoluan
学校教务系统的网站,最近添加了验证码,不知如何爬取了。

一个方案:收集验证码图片,降噪处理什么的,标记对应的验证码,生成一个验证码数据集。在需要输入验证码的时候,用图片与数据集中的验证码数据集比较~

「一个方案」可行么?
9565 次点击
所在节点    问与答
29 条回复
manoon
2013-07-06 00:11:08 +08:00
人工打码。。。
manoon
2013-07-06 00:12:23 +08:00
armoni
2013-07-06 00:55:23 +08:00
http://code.google.com/p/tesseract-ocr/ 英文和数字识别率还行,python库比较成熟
daoluan
2013-07-06 09:13:54 +08:00
@manoon 嗯,这个方法不错,但是会产生不必要的流量。

@denger 的那篇博文,有意思。

PS:怎么在回复框里 @ 别人啊???
daoluan
2013-07-06 09:15:57 +08:00
@armoni 哈哈,非常有意思,写写分享。
denger
2013-07-06 22:37:38 +08:00
有码图片看看么?我可以提供你一些思路。

@manoon 最近把diz的码给破了( http://www.v2ex.com/t/73685 )" 这个文章仔细看看还是有点老了,不过值得参考
manoon
2013-07-06 22:55:24 +08:00
@denger 对DZ没有丝毫性趣。
但是对验证码很有兴趣,以后有机会向你多多请教。^_^
nsxuan
2013-07-06 22:59:29 +08:00
地址发来
daoluan
2013-07-07 00:47:35 +08:00
@manoon
@nsxuan
@denger
@armoni

图片的处理解决的差不多来。爬取网页的时候用的是 urllib2,又遇到新的问题:如何让 HTTP header 中的 connection 状态是 keep-alive。

自己的想法:学校的教务系统好似没有用 cookie 来保持登录状态,所以如果不是 keep-alive,那么即使是登录成功,我也无法陆续读取后来的信息。不知道大家是怎么做的?

我的想法有没有问题?
daoluan
2013-07-07 00:55:27 +08:00
@nsxuan
@manoon
@denger
@armoni

一个支持「自己的想法」的证据:我在 request 中加入了 cookie,同样在登录成功后无法陆续查看诸多个人信息,相反,返回的是要我重新登录的东东。

用 wireshark 看了浏览器中发送和接收的 HTTP 和 用 urllib2 发送和接收的 HTTP,两者一模一样,但是得到的结果就是不对。

怎么破?
flowerfly
2013-07-07 06:04:12 +08:00
可参考这一篇
flowerfly
2013-07-07 06:04:18 +08:00
msg7086
2013-07-07 06:49:27 +08:00
@daoluan 先用fiddler做重发测试吧。另外keep-alive的HTTP应该也是stateless的。
daoluan
2013-07-08 21:36:08 +08:00
@denger http://jwc.scnu.edu.cn/ 这里有图片,谢谢。
daoluan
2013-07-12 14:45:16 +08:00
@denger http://jwc.scnu.edu.cn/ 这里有图片,能不能提供一点思路?这种验证码算是简单的吧?
denger
2013-07-12 18:26:52 +08:00
@flowerfly 这个文章写的挺不错, 很具参考意义.


@daoluan 嗯,看上去不难. 如果是我弄的话我会分为下面主要的几步:
1. 去噪点. 从码图上看字的颜色基本不随机固定色值范围(淺蓝->深蓝), 根据这个规则即可删掉那些随机颜色的噪点. 再根据处理后的效果可考虑是否进行再次处理, 比如将独立的相素点删除(上下左右无相邻的相素点).
2. 分割. 算是这个码的重难点了. 对于字符之间有粘连的情况如果对识别要求不是特别高(>80%)的话建议忽略该码.其它只有字符间有缝隙的码基本上都能通过扫描线法(自行Google)来搞定.
3. 分割之后就是为分割之后的字符建立字库了. 起先可人工建立一下字库, 后期使用程序识别+人工纠错的方式建立字库,具体算法为Levenshtein Distance, 参见我的post: http://denger.me/2013/03/hack-sina-weibo-verify-code/
daoluan
2013-07-12 20:02:28 +08:00
@flowerfly 推荐的文章收藏了。

@denger 现在着手手工建立字库。有一个关于效率的问题,因为是在开发微信的应用,微信有个恶心的规定:微信服务器在五秒内收不到响应会断掉连接。所以这就要求处理的速度要够快够迅速。

不知道上述的匹配过程能不能在 5s 内完成。
daoluan
2013-07-12 20:19:05 +08:00
@denger 嗯,Levenshtein Distance 算法就是计算两个字符串的相似度,我看了你的文章后来提到的识别效率问题,无法突破微信的「5 秒」的限制,是个问题。
zhwei
2013-07-12 20:55:46 +08:00
微信的话, 用户输入验证码算不算一个解决方案

http://v2ex.com/t/73559#r_672016
okidogi
2013-07-12 22:12:55 +08:00
# 登录获取cookie,只需要一次获取。
wget --save-cookies cookies.txt \
--post-data 'user=username&password=password' \
http://www.xxx.com

# 然后加载cookie 就可以随意访问抓取了。。。
wget --load-cookies cookies.txt \
-p http://www.xxx.com/article/xxx

飘过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/74907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX