记一次java后台实现数据爬虫爬取数据DEMO

39 篇文章 0 订阅
20 篇文章 2 订阅

1、最近需要用到一个功能,需要功能:前端调用我后台的一个接口,并传一个url参数,我后台需要根据这个url去获取该网页的里面视频以及音频的地址、格式、分辨率等信息,并全部返回。

解决方案:这时候我就需要一个能够访问的前端传来的参数一个网页地址,然后该网页返回一个页面,我再后台用java解析该页面,并切割前端需要的视频,音频信息。

在网页操作过程

1、进入一个能下载视频的网址

2、点击“下载”后会进行一个网页跳转去访问我们输入的url地址,最后返回的页面

有我们需要的视频,以及音频文件,这时候我们就要获取视频,音频的下载地址,以及文件格式等信息。

以上是我们通过网页来请求的,这时候我们需要通过后台代码来实现。具体实现方式如下

1、搭建一个简单的SpringBoot工程

引入相应的jar,该jar是为了解析html页面

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.12.2</version>
		</dependency>

编写http连接工具类

import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;


public class SSLClient extends DefaultHttpClient {

    public SSLClient() throws Exception {
        super();
        //传输协议需要根据自己的判断
        SSLContext ctx = SSLContext.getInstance("TLSv1.2");
        X509TrustManager tm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        ctx.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        ClientConnectionManager ccm = this.getConnectionManager();
        SchemeRegistry sr = ccm.getSchemeRegistry();
        sr.register(new Scheme("https", 443, ssf));
    }
}

通过在控制层编写调用的方法

@Api(description = "获取视频或者音频接口")
@RestController
public class SysLoginController extends AbstractController {

	/**
	 * 网址请求
	 */
	@ApiOperation(value="网址请求")
	@PostMapping("/paqu")
	public Object login(@RequestParam String url)throws IOException {
		Map resultmap = new HashMap();
		List<Map> urlList = new ArrayList<>();
		String charset = "utf-8";
		Map map = new HashMap();
		map.put("URL",url);

		String httpOrgCreateTestRtn = doPost("https://www.需要下载的网页地址/download.php", map, charset);
		//语言转换
		Document doc = Jsoup.parse(httpOrgCreateTestRtn);
		Elements  liElements = doc.getElementsByClass("table").get(0)
				//.getElementsByAttribute("href");
		.getElementsByTag("tr");

		for (int i = 1; i < liElements.size(); i++) {
			//String strurl = liElements.get(i).getElementsByAttribute("href").attr("href");

			String geshi = liElements.get(i).getElementsByTag("td").get(2).text();
			if ("MP4".equals(geshi)){
				String strurl = liElements.get(i).getElementsByTag("td").get(3).getElementsByAttribute("href").attr("href");
				if (strurl.length()>5){
					//文件格式
					String form = liElements.get(i).getElementsByTag("td").get(2).text();
					//文件分辨率
					String resolution = liElements.get(i).getElementsByTag("td").get(1).text();
					Map limap = new HashMap();
					limap.put("url",strurl);
					limap.put("form",form);
					limap.put("resolution",resolution);
					urlList.add(limap);
				}
			}else {
				String strurl = liElements.get(i).getElementsByTag("td").get(2).getElementsByAttribute("href").attr("href");
				if (strurl.length()>5){
					//文件格式
					String form = liElements.get(i).getElementsByTag("td").get(1).text();
					Map limap = new HashMap();
					limap.put("url",strurl);
					limap.put("form",form);
					limap.put("resolution",null);
					urlList.add(limap);
				}
			}



		}
		resultmap.put("list",urlList);
		return resultmap;
	}




	public String doPost(String url, Map<String,String> map, String charset) {
		org.apache.http.client.HttpClient httpClient = null;
		HttpPost httpPost = null;
		String result = null;
		try {
			httpClient = new SSLClient();
			httpPost = new HttpPost(url);
			//设置参数
			List<NameValuePair> list = new ArrayList<NameValuePair>();
			Iterator iterator = map.entrySet().iterator();
			while (iterator.hasNext()) {
				Map.Entry<String, String> elem = (Map.Entry<String, String>) iterator.next();
				list.add(new BasicNameValuePair(elem.getKey(), elem.getValue()));
			}
			if (list.size() > 0) {
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
				entity.setContentType("application/x-www-form-urlencoded");
				httpPost.setHeader("Accept", "*/*");
				httpPost.setHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
				httpPost.setEntity(entity);
			}
			HttpResponse response = httpClient.execute(httpPost);
			if (response != null) {
				HttpEntity resEntity = response.getEntity();
				if (resEntity != null) {
					result = EntityUtils.toString(resEntity, charset);
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return result;
	}

}

解释下代码:

在我分析下载也的请求时候,发现当我点击“下载”的时候,该页面发出的也是一个post请求

那么我就可以,用java代码模拟这个post请求了

String httpOrgCreateTestRtn = doPost("https://www.需要下载的网页地址/download.php", map, charset);
		//语言转换
		Document doc = Jsoup.parse(httpOrgCreateTestRtn);
		Elements  liElements = doc.getElementsByClass("table").get(0)
				//.getElementsByAttribute("href");
		.getElementsByTag("tr");

这段就是用java代码,进行请求,返回的数据,我们用Jsoup转成Document格式,然后采用Elements对返回的html页面进行标签提取数据

最后我们处理好返回的数据,用map接受,存入list再进行返回

最后启动项目在swagger-ui界面,进行测试接口

请求后,

与我们在页面请求的结果相同

 

 

到此记录结束,欢迎评论与交流

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

静风落叶

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值