网络爬虫与正则表达式
爬虫是爬取网络资源的一种重要途径,我们可以通过正则表达式来将所抓取到的数据进行分析,提取处所要得到的结果。
实验目标:抓取某一网站上所有的超链接
创建工具类,通过URL获得输出流
①使用url类来获得输入流,以便从网站下载资源
②使用InputStreamReader将字节流进行转换,便于后续操作
public static String getDataFromURL(String url,String code) {
try {
StringBuilder dataBuilder = new StringBuilder();
URL myUrl = new URL(url);
//将字节流直接转换为字符流,并确定编码,方便操作
BufferedReader bReader = new BufferedReader(
new InputStreamReader(
myUrl.openStream(),code));
//使用StringBuildr来创建可变字符串,防止产生大量String对象
String data = null;
while((data=bReader.readLine())!=null) {
dataBuilder.append(data);
}
bReader.close();
return dataBuilder.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return null;
}
使用正则表达式处理所抓取到的数据
①创建正则表达式对象
②使用pattern对象创建Matcher搜索对象
③使用容器将所抓取到的数据进行存储
ps:在编写正则表达式时可用捕获组()将主要信息进行组合,在提取资源的时候,可用group()方法指定组名进行抓取。
public List getHandlerURL(String mainData,String regExpression) {
//①创建表达式对象
Pattern checkPattern = Pattern.compile(regExpression);
//②创建Match对象
Matcher matcher = checkPattern.matcher(mainData);
while(matcher.find()) {
dataList.add(matcher.group(1));
}
return dataList;
}
建立客户端,进行测试
①网页编码格式一般在开头会指定
如:
②需要编写合适的正则表达式
我编写的较为简陋:href=\"([\w:/.?#&=-]+)\",需要注意的是java中"\”的使用
public static void main(String[] args) {
try {
HandleData myHandle = new HandleData();
String data = SpiderData.getDataFromURL(url, "gbk");
@SuppressWarnings("unchecked")
List<String> urLTable = myHandle.getHandlerURL(data, "正则");
for(String url:urLTable) {
System.out.println(url);
}
} catch (Exception e) {
e.printStackTrace();
}
}
结果:
对于某些网站不可直接爬取,我们模仿浏览者来进行获取
①使用import java.net.HttpURLConnection
②通过url.openConnection()通过强转获取到HTTPURLConnection对象
③通过HTTPURLConnection对象设置访问方式和访问权限
URL newUrl = new URL(url);
HttpURLConnection mConnection = (HttpURLConnection)newUrl.openConnection();
mConnection.setRequestMethod("GET");
mConnection.setRequestProperty(key, value);
StringBuilder dataBuilder = new StringBuilder();
BufferedReader bReader = new BufferedReader(
new InputStreamReader(
mConnection.getInputStream(),code));
String data = null;
while((data=bReader.readLine())!=null) {
dataBuilder.append(data);
}
bReader.close();
return dataBuilder.toString();
mConnection.setRequestMethod(“GET”);//设置访问方式,一般为POST或GET
mConnection.setRequestProperty(key, value);//设置权限,可从浏览器获得
key:User-Agent
value:Mozilla/5.0…
来源:CSDN
作者:沐风清寒
链接:https://blog.csdn.net/qq_41891805/article/details/103986560