顶部右侧 | 自行修改 顶部左侧内容
当前位置:网站首页 > 科技资讯 > 正文

厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员

seo秀 2019-06-07 321 浏览 1 评论

前言:直接看爬虫框架有时会很吃力,建议从简单的程序一步步入手,看到脚本之家有一个系列讲述的一个Java爬虫程序的设计,在此拿过来大家共同学习。

http://www.jb51.net/article/57193.htm
厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员 科技资讯 seo第1张


首先以百度首页为例通过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);
 }
}
厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员 科技资讯 seo第2张


没错,就是这一坨翔一样的东西。这就是百度页面的源代码。


厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员 科技资讯 seo第3张



临时需求

获取百度Logo的大熊爪子的图片链接。

一.封装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中的正则表达式教程。

简单来说,正则就像是匹配。

比如三个胖子站在这里,分别穿着红衣服,蓝衣服,绿衣服。

正则就是:抓住那个穿绿衣服的!

然后把绿胖子单独抓了出来。

就是这么简单。

但是正则的语法却还是博大精深的,刚接触的时候难免有点摸不着头脑,

向大家推荐一个正则的在线测试工具:正则表达式在线测试。

有了正则这个神兵利器,那么怎么在java里面使用正则呢?

先来看个简单的小李子吧。

啊错了,小栗子。


// 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容 
// 相当于埋好了陷阱匹配的地方就会掉下去 
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”获取


厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员 科技资讯 seo第4张


厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员 科技资讯 seo第5张


相关推荐

这三种域名,永远不会有询盘
  • 这三种域名,永远不会有询盘
  • 这三种域名,永远不会有询盘
  • 这三种域名,永远不会有询盘
  • 这三种域名,永远不会有询盘
对应微软必应、北影集团的两声母域名,又被戴跃收走了
对应微软必应、北影集团的两声母域名,又被戴跃收走了

短字母类域名资源都是比较稀缺,其价格自然也都不会低,近日,投资人戴跃斥资上百万收了by.cn。域名by.cn注册于2013年,该域名有“毕业、必应、包邮、白银、...

4个月前 (06-07) seo秀

196个国家35万个网站的访问量全在这里
  • 196个国家35万个网站的访问量全在这里
  • 196个国家35万个网站的访问量全在这里
  • 196个国家35万个网站的访问量全在这里
  • 196个国家35万个网站的访问量全在这里
厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员
  • 厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员
  • 厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员
  • 厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员
  • 厉害了,这位程序员用Java爬虫爬取百度搜索,装逼就服程序员
百度的下半场:AI能否为搜索霸主重塑未来

2011年3月24日,对于李彦宏及所有百度人来说,必然是个特殊的日子,那一天,百度市值收盘报460.72亿美元,超过当时的腾讯、阿里巴巴,夺下了中国互联网企业市值第一的头衔,那是属于百度的高光时刻。8...

这波操作不错——你真的会高效的在GitHub搜索开源项目吗?
  • 这波操作不错——你真的会高效的在GitHub搜索开源项目吗?
  • 这波操作不错——你真的会高效的在GitHub搜索开源项目吗?
  • 这波操作不错——你真的会高效的在GitHub搜索开源项目吗?
  • 这波操作不错——你真的会高效的在GitHub搜索开源项目吗?
正则表达式真的很骚,可惜你不会写!

正则基础知识点1.元字符2.重复限定符3.分组4.转义5.条件或6.区间正则进阶知识点1.零宽断言2.捕获和非捕获3.反向引用4.贪婪和非贪婪5.反义正则表达式在几乎所有语言中都可...

钉钉、企业微信,2种企业服务类原型模板(免费使用)
  • 钉钉、企业微信,2种企业服务类原型模板(免费使用)
  • 钉钉、企业微信,2种企业服务类原型模板(免费使用)
  • 钉钉、企业微信,2种企业服务类原型模板(免费使用)
  • 钉钉、企业微信,2种企业服务类原型模板(免费使用)
网络热词都得靠百度搜,哪有脸过儿童节
  • 网络热词都得靠百度搜,哪有脸过儿童节
  • 网络热词都得靠百度搜,哪有脸过儿童节
  • 网络热词都得靠百度搜,哪有脸过儿童节
  • 网络热词都得靠百度搜,哪有脸过儿童节
首个儿童智能手机诞生,三种形态可穿戴可使用,再也不担心玩抖音
  • 首个儿童智能手机诞生,三种形态可穿戴可使用,再也不担心玩抖音
  • 首个儿童智能手机诞生,三种形态可穿戴可使用,再也不担心玩抖音
  • 首个儿童智能手机诞生,三种形态可穿戴可使用,再也不担心玩抖音
  • 首个儿童智能手机诞生,三种形态可穿戴可使用,再也不担心玩抖音

已有1位网友发表了看法:

欢迎 发表评论: