JAVA正则表达式分析爬虫数据

*爱你&永不变心* 提交于 2020-01-23 19:29:02

网络爬虫与正则表达式

爬虫是爬取网络资源的一种重要途径,我们可以通过正则表达式来将所抓取到的数据进行分析,提取处所要得到的结果。

实验目标:抓取某一网站上所有的超链接

创建工具类,通过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…

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!