首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

互联网信息的合理采集

本文作者郑勇升本文主要讲述怎样合理地自动采集互联网信息,包括一些常用工具的使用和字符验证码识别的解决方案。

01

背景介绍

在日常生活工作中,经常需要从互联网获取各种各样的信息,有时候需要采集的信息比较多,比如在各种NLP模型中,常常需要获取大量的语料集去训练才能获得比较好的结果。这个时候如果单纯的依靠人工检索采集信息是十分耗费生命的,也是不现实的,如果能借助一些工具进行自动化的合理的采集,那将是十分美好的事情。这里必须要强调“合理”两个字,合理指的是什么呢?一是要控制访问量,不要给网站造成负担;二是遵守对方给的规矩,这个规矩主要是robots.txt文件,哪些是可以采集的,哪些是不可以采集的,要按照规矩办事。

02

采集方法

先简单的介绍下网页访问的过程,一般网页访问请求有两种类型:GetPost,他们的区别主要是参数传递方式的不同,网站服务器接受到请求后会返回一个网页,一般会包含了静态的HTML文件、样式、图片、JS等等。

下面介绍下python常用的访问工具。Python提供了多种网页访问库,常用的有Urllib/Urllib2、Requests,也可以使用tornado的httpclient实现无阻塞的访问。以Requests为例简单介绍下访问代码,可以说十分简洁,几行代码就可以完成一个页面的访问。

s = requests.session()

url=''

response = s.get(url, headers=headers) #get 方式访问

response = s.post(url,data=params, headers=headers) #post方式访问,把参数params以字典方式进行传递

print (respinse.content)

这种方式进行访问只会获取URL对应的页面,资源消耗比较少,适合访问一些静态页面;有些页面需要借助开发者工具(浏览器按F12)去获取对应的URL。有时候比较懒,计算资源又比较多,这个时候可以使用selenium,它是一个网站的自动化测试工具,可以调用多种浏览器去访问网页,并模拟鼠标键盘等操作,使用也很简单。访问页面可以用如下几行代码搞定,元素的选取可以借助开发者工具,模拟鼠标键盘可以自行查找资料。

from selenium import webdriver

driver = webdriver.Chrome()

driver.get(url)

print (driver.page_source))

03

信息提取

当一个页面获取下来之后怎么提取想要的信息呢?主要有几种方式,一种是使用正则表达式,正则表达式往往让人头疼,这里只介绍两个组合:.*?[\s\S]*?。前者可以匹配除换行之外任意多个字符,后者可以匹配包括换行之内任意多个字符,使用这两个组合基本上可以获取到想要的信息。其他方式包括selenium工具的一些函数,还有beautifulSoupPyquery等工具可以对html文件进解析,并通过对应函数获取想要的信息。

04

验证码识别

有时候会碰到需要输入验证码才能登陆访问的情况,一种方法是先人工输入验证码登录,还有就是尝试去自动识别验证码,对一些简单的字符验证码(没有任何变形干扰的)可以使用pytesseract等工具去识别,对于比较复杂的可以尝试使用tensorflow cnn模型去自动识别。使用cnn模型去识别的一种方法是先对验证码进行字符分割,对分割后的单个字符进行识别,优点是识别类别少,缺点是增加了分割的步骤,需要验证码易于可分割;另一种方法是对验证码进行整体识别,优点是无需分割,直接端到端识别,缺点是类别多,训练时间长。从第二种方法可以衍生出第三种方法,就是在cnn网络中使用多个输出层,每个输出层对应一个字符[2]。这里介绍下第二种方法,具体步骤如下。

Step1:模拟验证码生成,可以使用Pillow去模仿验证码的生成,实验中使用了Captcha这个工具直接生成验证码去做测试;

Step2:训练样本生成&编码,把图片转成灰度再转为一维向量,对验证码字符进行onehot编码后拼接转为一维向量;

Step3:定义cnn网络,使用了3个转换层,1全连接层,1输出层,损失函数使用交叉熵(sigmoid_cross_entropy_with_logits);

Step4:准确率验证,需要4个字符都正确,先把结果转回2维向量,再用tf.argmax进行比较;

Step5:验证码识别,先采用跟step2一样的方法对图片编码,再调用模型验证,然后把输出的结果向量重新转回文本。

当然以上用cnn去识别验证码只是从技术分享的角度出发探讨实现网页自动访问的方法,可能要花费大量的时间去研究验证码的生成和训练模型;而且人家使用了验证码可能就表示不欢迎机器自动去访问他这个网站,所以实际使用中要既要注重方法的投入产出比,也要尊重对方网站的一些规定。

05

补充知识点

最后补充一下sigmoid_cross_entropy_with_logitssoftmax_cross_entropy_with_logits两个函数的区别,网上找了好多资料没怎么说清楚,只是说sigmoid适用于二分类,softmax适用于多分类,当然在理解了他们的原理之后这么说也没多大问题。sigmoid函数把输出向量里的每一项都映射到0~1之间,而softmax是计算输出向量里每一项的概率值,他们的和为1。对于本例,以字符集是1,2两个值为例,进行onehot编码之后1可以表示为[0,1],2可以表示为[1,0],如果验证码样本是2 1,他们可以表示[1,0,0,1],对于softmax函数输出为[p1,p2,p3,p4],sigmoid函数输出为[y1,y2,y3,y4],用列向量表示如下。

01_softmax输出&样本

02_sigmoid输出&样本

softmax求交叉熵后的优化目标就是p1+p4最大,限制条件是p1+p2+p3+p4=1,p1+p4最大其实就是没有固定的优化目标,p2+p3=0,然后可以是p1=1,p4=0,也可以是p4=1,p1=0,就是p1+p4=1的任意取值,这样对于同一个样本,没法训练得到确定的参数。

sigmoid函数的输出可以知道优化目标就是y1=1,y2=0,y3=0,y3=1,是确定的。

参考文档:

1、 https://zhuanlan.zhihu.com/p/25779608?group_id=825335754321457152

2、Multi-digit Number Recognition from Street View Imagery using Deep CNN

3、CAPTCHA Recognition with Active Deep Learning

4、Number plate recognition with Tensorflow

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180421G1GA1I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券