java抓取网页数据(三四家公司打电话要我去面试,真的不知道什么原因啊)

优采云 发布时间: 2022-03-19 05:20

  java抓取网页数据(三四家公司打电话要我去面试,真的不知道什么原因啊)

  我记得我是这个月9号来深圳的。找了将近20天的工作,只有三四家公司给我打电话面试。我真的不知道为什么。是不是因为我投了简历,投的简历少了?还是这个季节是招聘的冷季?不是很清楚。前天,我去一家创业公司面试。公司感觉还行,我总体上很满意。我有幸接受了采访。谈好的薪水我也可以接受,所以我同意去上班。今天是上班的第一天。当我晚上回到我的住所时,我正在考虑写点什么。这个月即将结束。时间过得真快,还好在找工作的过程中,看了一些书,写了两个小程序。记录了前两天用java爬取网页数据的程序。供以后参考。

  一般使用PHP、Python、Ruby等脚本语言来抓取网页数据。其实Java和C++也是可以的,只是操作的时候可能就没那么方便了。爬取网页的原理是一样的。通过正则表达式从网页中提取出感兴趣的网页数据,然后进行操作(写入文件或数据库等)。java.util.regex 包主要用于在java中操作正则表达式。比如我们要提取某个网页中的XXX中的XXX,这个时候我们应该怎么做呢?

  /**

* 获取网页title

*

* @param pageStr

* @return

*/

public static String getPageTitle(String pageStr) {

String titleRegStr = "(.*)";

Pattern pattern = Pattern

.compile(titleRegStr, Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher(pageStr);

String pageTitle = "";

if (matcher.find(0)) {

pageTitle = matcher.group(1);

}

return pageTitle;

}

  可以通过上面的代码提取出来。请注意,传入参数是要提取的整个网页字符串。返回的是页面标题。

  网页上的图片链接一般是这样写的:

  

  一般网页的链接是这样的="_blank"/>。抓取src之后的值的原理和href之后的值是一样的。

  /**

* 得到网页中图片的地址

*/

public static List getImgStr(String htmlStr, String url) {

StringBuffer imgBuffer = new StringBuffer();

Pattern p_image;

Matcher m_image;

List pics = new ArrayList();

String cache_file_name = url.substring(url.lastIndexOf("/") +1);

File file = new File(CACHE_PATH+"/"+cache_file_name);

if (file.exists()) {

try {

FileInputStream fis = new FileInputStream(file);

int length = 0;

byte[] buffer = new byte[1024*100];

while ((length = fis.read(buffer))!= -1){

imgBuffer.append(new String(buffer, 0, length));

}

fis.close();

Matcher m = Pattern.compile("src=\"?(.*?)(\"|>|\\s+)").matcher(imgBuffer.toString()); // 匹配src

while (m.find()) {

pics.add(m.group(1));

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}else{

String regEx_img = "]*?>"; // 图片链接地址

p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);

m_image = p_image.matcher(htmlStr);

while (m_image.find()) {

imgBuffer.append(",").append(m_image.group());

Matcher m = Pattern.compile("src=\"?(.*?)(\"|>|\\s+)").matcher(imgBuffer.toString()); // 匹配src

while (m.find()) {

pics.add(m.group(1));

}

}

if (pics.size()>0) {

File cacheFile = new File(CACHE_PATH + "/" + cache_file_name);

try {

FileOutputStream fos = new FileOutputStream(cacheFile);

fos.write(imgBuffer.toString().getBytes());

fos.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

return pics;

}

  这里我将单个网页正则匹配后的所有值拼接起来,保存到缓存文件中。当再次爬取相同的网页时,它可以节省进行常规匹配的时间。注意两个地方:一个是图片链接地址,另一个是匹配的src。我们首先找出链接的完整地址,例如

  

  ,然后进行正则匹配以查找 src 的值。最后,返回单个网页的所有图片的链接地址。知道链接地址,然后就可以下载图片了。抓取网页的链接也是如此。至于获取网页代码,只需将网页读入字符串即可:

  /**

* 获取网页源码

*

* @param pageUrl

* @param encoding

* @return

*/

public static String getPageSource(String pageUrl, String encoding) {

StringBuffer sb = new StringBuffer();

try {

URL url = new URL(pageUrl);

BufferedReader in = new BufferedReader(new InputStreamReader(

url.openStream(), encoding));

String line;

while ((line = in.readLine()) != null) {

sb.append(line);

sb.append("\n");

}

in.close();

} catch (Exception e) {

System.err.println(e);

}

return sb.toString();

}

  需要注意的是,这里有一个网页编码参数,根据网页的编码传入相应的参数,否则可能会出现乱码。毕竟,网页抓取是正则表达式的强大体现,我最近也看到了一些。就写到这里,欢迎大家互相交流。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线