学习http://blog.csdn.net/pleasecallmewhy/article/details/17594303html
import java.io.*; import java.net.*; import java.util.regex.*; public class Javaspider { static String SendGet(String url) { // 定义一个字符串用来存储网页内容 String result = ""; // 定义一个缓冲字符输入流 BufferedReader in = null; try { // 将string转成url对象 URL realUrl = new URL(url); // 初始化一个连接到那个url的链接 URLConnection connection = realUrl.openConnection(); // 开始实际的链接 connection.connect(); // 初始化 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream(),"utf-8"));//指定编码方式 // 用来临时存储抓取到的每一行的数据 String line; while ((line = in.readLine()) != null) { // 遍历抓取到的每一行并将其存储到result里面 result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } static String RegexString(String targetStr, String patternStr) { // 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容 // 至关于埋好了陷阱匹配的地方就会掉下去 Pattern pattern = Pattern.compile(patternStr); // 定义一个matcher用来作匹配 Matcher matcher = pattern.matcher(targetStr); // 若是找到了 if (matcher.find()) { // 打印出结果 return matcher.group(1); } return "Nothing"; } public static void main(String[] args) { // 定义即将访问的连接 String url = "http://www.sogou.com"; // 访问连接并获取页面内容 String result = SendGet(url); // 使用正则匹配图片的src内容 String imgSrc = RegexString(result, "src=\"(.+?)\""); // 打印结果 System.out.println(imgSrc); } }
运行结果:java
sogou审查元素中有这句<img src="http://www.sogou.com/images/logo/new/sogou.png" width="400" height="150" alt="">jquery
源文件之中src开头的语句挺多的,那src=\"(.+?)\"是怎么匹配到这个结果的呢?请继续看正则表达式
1. 获取指定页面的html源码,存储在字符串中服务器
2. 经过正则表达式找出字符串中的匹配项。网络
以python为例ide
程序能够执行这两步,咱们也能够手动复制源码,用在线正则工具来反向验证。函数
这里注意一点,在咱们的讨论范围内,程序向百度服务器get资源,并获得响应获取html源码的过程至关于匿名用户访问。工具
也就是说使用登陆模式下看到的源码,并不能达到反向验证的目的。
让咱们退出登陆,从新看看源码以及反向验证结果。
咱们简化问题,看看如何从多组类似像中找出想要的logo1.png
In [60]: txt=''' ....: 666src="//www.baidu.com/img/bd_logo1.png" ....: src="//www.baidu.com/img/baidu_jgylogo3.gif" ....: src="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/jquery/jquery-1.10.2.min_f2fb5194.js"''' In [61]: txt Out[61]: '\n666src="//www.baidu.com/img/bd_logo1.png"\nsrc="//www.baidu.com/img/baidu_jgylogo3.gif"\nsrc="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/jquery/jquery-1.10.2.min_f2fb5194.js"' In [64]: res.group() Out[64]: 'src="//www.baidu.com/img/bd_logo1.png"'
咱们指定的正则表达式确实会匹配三个结果。可是re模块提供的search函数会从待匹配文本中找到第一个匹配项并返回。
re提供的其余重要函数包括:
match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):
这个方法将从string的pos下标处起尝试匹配pattern;若是pattern结束时仍可匹配,则返回一个Match对象;若是匹配过程当中pattern没法匹配,或者匹配未结束就已到达endpos,则返回None。
search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
这个方法用于查找字符串中能够匹配成功的子串。从string的pos下标处起尝试匹配pattern,若是pattern结束时仍可匹配,则返回一个Match对象;
split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
按照可以匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将所有分割。
findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):
搜索string,以列表形式返回所有能匹配的子串。
sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
使用repl替换string中每个匹配的子串后返回替换后的字符串。
当repl是一个字符串时,可使用\id或\g<id>、\g<name>引用分组,但不能使用编号0。
当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
count用于指定最多替换次数,不指定时所有替换。
ref
[Python]网络爬虫(二):利用urllib2经过指定的URL抓取网页内容
[Python]网络爬虫(七):Python中的正则表达式教程
其中,