follow大神教程——实践java爬虫之一

学习http://blog.csdn.net/pleasecallmewhy/article/details/17594303html

 

抓取搜狗首页logo

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

http://www.sogou.com/images/logo/new/sogou.pngpython

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中的正则表达式教程

其中,

相关文章
相关标签/搜索