nwang1986的个人博客分享 http://blog.sciencenet.cn/u/nwang1986

博文

[原][Matlab][01] 做一个简单的爬虫或下载器

已有 15206 次阅读 2015-10-4 12:04 |个人分类:[原创]|系统分类:科研笔记| MATLAB, 爬虫, 代理, 批量下载

使用matlab的urlread,regexpi,urlwrite函数可以用来做简单的爬虫或下载器。

读了一些资料,然后进行实验(用的是MATLAB R2014a)可行,将基本内容整理。


urlread函数读取网页的源代码,用法是:

[pagecode,status]=urlread('http://www.baidu.com','Timeout',15);

其中pagecode是访问成功后获得的html源码;status表示页面是否读取成功,1为成功,0为失败。'http://www.baidu.com'是要读取页面的链接,为字符串类型,其中'http://'的前缀是必须的。'timeout'和15两个参数表示如果页面没有响应的时间达到15秒,则放弃读取这个链接。虽然不用'timeout'参数也能使用该函数,但如果程序卡在这个页面读取上,后面的程序就无法继续执行,所以最好使用'timeout'参数。


当获取了网页的html源码后,需要摘出自己需要的资源。有时需要的是文本内容,有时要图片地址,有时要网页链接,这时可以用正则表达式匹配html代码。需要提前了解HTML源码和正则表达式的语法。

HTML的语法可以参考:http://www.w3school.com.cn/ 

正则表达式的入手可以参考:http://deerchao.net/tutorials/regex/regex.htm 


接下来使用regexpi函数进行内容匹配。regexpi函数对字母大小写不敏感,如果需要大小写严格匹配可使用regexp函数,以一个小例子显示用法是:

sourcestr='abcdefg src="something"';  

takestr='"(.*?)"';

result=regexpi(sourcestr,takestr,'tokens');

%注释1:字符串sourcestr为待匹配的母字符串。

%注释2:字符串takestr为用于匹配所需内容的子字符串,代表双引号""之内的不包括换行的所有字符。

%注释3:表示从字符串sourcestr中取出满足字符串takestr格式的所有匹配结果放到result中。


运行得到的result为cell类型的数据,内容为'something'。

如果想匹配并剔除字符串中的特定字符,可以用regexprep函数,用法是:

str=regexprep(str,'[^!/]',''); %将str中出现的所有'!'或'/'字符去掉。


将sourcestr换成urlread得到的html源码字符串,takestr换成感兴趣的网页内容对应的匹配正则表达式,就可以将网页源码内容摘选出来存到cell中进而写到本地文件。由于各个网站的网页源码格式不同,使用简单的正则表达式去匹配,比如'href="(.*?)"'是把链接内容摘选出来,可以匹配出很多结果,可能包含css文件或js文件的地址,甚至只是相对网页地址。所以要么使用复杂的正则表示式严格匹配内容要么采用复杂的内容判断程序来甄别数据以剔除冗余的数据。如果只是对某一个网站感兴趣,最好专门分析这个网站的网页源码格式,然后写对应的正则表达式去匹配,可以在最短的时间内完成所需要的内容的采集。


当获取到网站的某个资源地址,想要下载下来,可以使用urlwrite函数。用法是:

[savestr,status]=urlwrite('http://www.XXXX.com/a.jpg','myfile/1.jpg','timeout',15);

其中savestr是存储字符串,status表示是否存储成功,'http://www.XXXX.com/a.jpg'为目标文件的地址,'myfile/1.jpg'是本地地址,表示将XXXX网站的'a.jpg'图片存到了当前'myfile'文件夹下并命名为'1.jpg'。'timeout'和15表示若下载文件15秒没有响应则放弃。


至此,通过使用urlread函数读取网页,regexpi函数甄选内容,urlwrite函数存储内容,结合程序循环和判断已经可以做成一个小型的批量下载器,也可以进行广度或深度的网页抓取。具体代码略。由于批量下载会给目标网站造成较大的服务器压力,搞不好还会被封IP,还得适当使用。


这样得到的matlab小爬虫的弱点在于重复性检查,通常的python爬虫可以使用hash函数进行哈希表映射,从而避免重复下载甚至死循环。在matlab中需要自己写个hash函数,或者只能通过自己对字符串进行长度或内容匹配进行检查重复性,速度较慢。

有些网页是需要登录权限才能读取和下载,这时可以在urlreadurlwrite中加入'post'或'Get'参数操作。

有些网页具有防盗链功能,直接使用urlwrite难以保存。通常实现防盗链的方法是检查网页请求中的'referer'参数。'referer'携带的信息可以告诉服务器用户是从哪里索要信息,如果不是本网站内容读取或浏览器直接读取,服务器可以拒绝回复。'referer'参数在网页html源码中看不到,目前只有在服务器端、专门的程序语言中或特殊的浏览器插件才能查看。如果要使用matlab更改'referer'参数比较复杂,过。

有些网页具有IP区域的限制,或者批量下载会有被封IP的问题,可以手动或自动在matlab设置代理服务器。手动可以到“主页”-“预设”-“网页”选项改代理服务器。也可以在程序用加入以下内容设置。其中“000.000.000.000”为服务器IP,“XX”为端口。

com.mathworks.mlwidgets.html.HTMLPrefs.setUseProxy(true);

com.mathworks.mlwidgets.html.HTMLPrefs.setProxyHost('000.000.000.000');

com.mathworks.mlwidgets.html.HTMLPrefs.setProxyPort('XX');




https://blog.sciencenet.cn/blog-2857675-925203.html

上一篇:[题] 新人报到
下一篇:[原][Matlab][02] 与mysql数据库的连接
收藏 IP: 130.153.150.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-5 08:08

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部