java抓取网页数据(三四家公司打电话要我去面试,真的不知道什么原因啊)
优采云 发布时间: 2022-03-19 05:20java抓取网页数据(三四家公司打电话要我去面试,真的不知道什么原因啊)
我记得我是这个月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();
}
需要注意的是,这里有一个网页编码参数,根据网页的编码传入相应的参数,否则可能会出现乱码。毕竟,网页抓取是正则表达式的强大体现,我最近也看到了一些。就写到这里,欢迎大家互相交流。