前言:直接看爬虫框架有时会很吃力,建议从简单的程序一步步入手,看到脚本之家有一个系列讲述的一个Java爬虫程序的设计,在此拿过来大家共同学习。
http://www.jb51.net/article/57193.htm
首先以百度首页为例通过http get的方式获取百度首页的内容。
mport java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;public class Main{ public static void main(String[] args) { // 定义即将访问的链接 String url = "http://www.baidu.com"; // 定义一个字符串用来存储网页内容 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())); // 用来临时存储抓取到的每一行的数据 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(); } } System.out.println(result); }}
临时需求
一.封装get方法
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection; public class Main{ 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())); // 用来临时存储抓取到的每一行的数据 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; } public static void main(String[] args) { // 定义即将访问的链接 String url = "http://www.baidu.com"; // 访问链接并获取页面内容 String result = sendGet(url); System.out.println(result); }}这样看起来稍微整洁了一点,请原谅我这个强迫症。
接下来的任务,就是从获取到的一大堆东西里面找到那个图片的链接。
我们首先可以想到的方法,是对页面源码的字符串result使用indexof函数进行String的子串搜索。
没错这个方法是可以慢慢解决这个问题,比如直接indexOf("src")找到开始的序号,然后再稀里哗啦的搞到结束的序号。
不过我们不能一直使用这种方法,毕竟草鞋只适合出门走走,后期还是需要切假腿来拿人头的。
请原谅我的乱入,继续。
那么我们用什么方式来寻找这张图片的src呢?
没错,正如下面观众所说,正则匹配。
如果有同学不太清楚正则,可以参照这篇文章:[Python]网络爬虫(七):Python中的正则表达式教程。
简单来说,正则就像是匹配。
比如三个胖子站在这里,分别穿着红衣服,蓝衣服,绿衣服。
正则就是:抓住那个穿绿衣服的!
然后把绿胖子单独抓了出来。
就是这么简单。
但是正则的语法却还是博大精深的,刚接触的时候难免有点摸不着头脑,
向大家推荐一个正则的在线测试工具:正则表达式在线测试。
先来看个简单的小李子吧。
啊错了,小栗子。
// 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容 // 相当于埋好了陷阱匹配的地方就会掉下去 Pattern pattern = Pattern.compile("href="(.+?)""); // 定义一个matcher用来做匹配 Matcher matcher = pattern.matcher("<a href="index.html">我的主页</a>"); // 如果找到了 if (matcher.find()) { // 打印出结果 System.out.println(matcher.group(1));}运行结果
index.html
没错,这就是我们的第一个正则代码。
这样应用的抓取图片的链接想必也是信手拈来了。
我们将正则匹配封装成一个函数,然后将代码作如下修改:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
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()));
// 用来临时存储抓取到的每一行的数据
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 "";
}
public static void main(String[] args)
{
// 定义即将访问的链接
String url = "http://www.baidu.com";
String result = SendGet(url);
// // 使用正则匹配图片的src内容
String imgSrc = RegexString(result, "即将的正则语法"); //
// 打印结果
System.out.println(imgSrc);
}
}
好的,现在万事俱备,只差一个正则语法了!
那么用什么正则语句比较合适呢?
我们发现只要抓住了src="xxxxxx"这个字符串,就能抓出整个src链接,
所以简单的正则语句:src="(.+?)"
完整代码如下
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main{ 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())); // 用来临时存储抓取到的每一行的数据 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.baidu.com"; // 访问链接并获取页面内容 String result = SendGet(url); // 使用正则匹配图片的src内容 String imgSrc = RegexString(result, "src="(.+?)""); // 打印结果 System.out.println(imgSrc); }}我这里有一套Python从入门到精通的全套资料免费送给大家
转发此文,关注并私信小编“02”获取

评论列表