网络爬虫中URLConnection的使用[以科学网为例]
目录
- 爬取内容分析
- URLConnection的使用
- 运行结果展示
本文为原创博客,仅供技术学习使用。未经允许,禁止将其复制下来上传到百度文库等平台。如有转载请注明本文博客的地址(链接)
本人师兄所做的机器学习网站欢迎大家访问:http://www.datalearner.com/blog
爬取内容分析
本文以科学网为例讲解URLConnection的使用。如下图所示,为我们要爬取的第一个页面。即第一层。
下图为我们要爬取的第二个页面,也是我们真正想要爬取的页面。即用户id及用户名。即第二层。
在爬取第二层的入口地址时,我们发现第一层获取的url中含有中文字符,所以要对其进行转码,获取可供请求的url。
下面提供本人自己写了一个,针对此网站的url转码方法,这个方法不对其他页面适用,如有其他页面也存在该问题,可在此基础上进行修改。
package collectip;import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com*博客地址:http://blog.csdn.net/qy20115549/
*/
public class UrlUtil {private final static String ENCODE = "GBK"; public static String getURLEncoderString(String str) {String result = "";if (null == str) {return "";}try {result = java.net.URLEncoder.encode(str, ENCODE);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}public static void main(String[] args) throws UnsupportedEncodingException {String str = "blog.php?mod=member&type=管理科学和管理思想史&realmmedium=管理科学与工程&realm=管理综合&catid=565";UrlTrans(str);}public static String UrlTrans(String str) {//中文正则匹配,将中文进行转码,其他字符不变Pattern p = Pattern.compile("([\u4e00-\u9fa5]+)"); Matcher m = p.matcher( str ); String mv = null; List<String> list=new ArrayList<String>();while (m.find()) { mv = m.group(0); list.add(getURLEncoderString(mv)); } //找出id,即565String regEx="[^0-9]"; Pattern p1 = Pattern.compile(regEx); Matcher m1 = p1.matcher(str); String url=" http://blog.sciencenet.cn/blog.php?mod=member&type="+list.get(0)+"&realmmedium="+list.get(1)+"&realm="+list.get(2)+"&catid="+m1.replaceAll("").trim();System.out.println(url);return url;}
}
URLConnection的使用
URLConnection是java自带的请求url的工具。下面将以爬取科学网的用户为例,讲解其使用。下面程序可复制下来,直接运行,并求注释已经很清晰明了。
package navi.main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import collectip.UrlUtil;
/** author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com*博客地址:http://blog.csdn.net/qy20115549/
*/
public class JsonTest {public static void main(String[] args) throws Exception {//使用URLConnection请求url,并返回html字符,这里使请求第一层数据,获取第二层请求的urlString html = getRawHtml("http://blog.sciencenet.cn/blog.php?mod=member&type=%B9%DC%C0%ED%D7%DB%BA%CF");//使用Jsoup方式进行解析htmlDocument document=Jsoup.parse(html);Elements elements=document.select("div[class=box_line]").get(0).select("li").select("a");for (Element ele: elements) {//第二层请求,为了爬取用户信息String html1 = getRawHtml(UrlUtil.UrlTrans(ele.attr("href")));//使用Jsoup方式进行解析html1Document document1=Jsoup.parse(html1);Elements elements2=document1.select("div[id=con_box]").select("p[class=potfont]").select("a");for (Element ele1: elements2) {//匹配字符串中的数字,获取idString idtest=ele1.attr("href");String regEx="[^0-9]"; Pattern p1 = Pattern.compile(regEx); Matcher m1 = p1.matcher(idtest); String id=m1.replaceAll("").trim();//获取用户名String name=ele1.text();System.out.println(id+"=="+name);}}}//URLConnection方法public static String getRawHtml(String personalUrl) throws InterruptedException,IOException {//使用URLConnection请求数据URL url = new URL(personalUrl);URLConnection conn = url.openConnection();InputStream in=null;try {conn.setConnectTimeout(3000);in = conn.getInputStream();} catch (Exception e) {}//将获取的数据转化为StringString html = convertStreamToString(in);return html;}//这个方法是将InputStream转化为Stringpublic static String convertStreamToString(InputStream is) throws IOException {if (is == null)return "";BufferedReader reader = new BufferedReader(new InputStreamReader(is,"gbk"));StringBuilder sb = new StringBuilder();String line = null;try {while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {e.printStackTrace();} finally {try {is.close();} catch (IOException e) {e.printStackTrace();}}reader.close();return sb.toString();}
}
运行结果展示
网络爬虫中URLConnection的使用[以科学网为例]相关推荐
- 浅谈网络爬虫中广度优先算法和代码实现
前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...
- 盘点一个网络爬虫中常见的一个错误
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 圣朝无阙事,自觉谏书稀. 大家好, ...
- 浅谈网络爬虫中广度优先算法和深度优先算法
前言 做爬虫的,最怕业务简单粗暴的来一句"爬一下XXXX网".比如,"爬一下央广网"(示例链接:http://www.cnr.cn),看着密密麻麻的各种子分类, ...
- 网络爬虫之scrapy爬取某招聘网手机APP发布信息
1 引言 过段时间要开始找新工作了,爬取一些岗位信息来分析一下吧.目前主流的招聘网站包括前程无忧.智联.BOSS直聘.拉勾等等.有段时间时间没爬取手机APP了,这次写一个爬虫爬取前程无忧手机APP岗位 ...
- 网络爬虫中进行数据抓取
以下内容是<用python写网络爬虫>的读书笔记 一.安装firebug lite firebug lite是一个用于在网站中查看调试html,css和javascript的有效工具.它现 ...
- 网络爬虫中Fiddler抓取PC端网页数据包与手机端APP数据包
1 引言 在编写网络爬虫时,第一步(也是极为关键一步)就是对网络的请求(request)和回复(response)进行分析,寻找其中的规律,然后才能通过网络爬虫进行模拟.浏览器大多也自带有调试工具可以 ...
- 网络爬虫中的验证码识别
网络爬虫遇到的验证码 在写网络,爬虫时,遇到很多网站存在验证码的情形,有其是比较烦的是,爬取数据的每一页都有验证码,如果只有登陆时,存在验证码,这个很好解决,只需将验证码获取后手动输入就行. 但对于每 ...
- 数据分析-网络爬虫:中美在这一领域展开无声较量,事关国家安全
数据分析和网络爬虫会上升到国家安全层面 http://new.qq.com/omn/20180205/20180205A03MEP.html?pgv_ref=aio2015&ptlang=20 ...
- CSV文件在网络爬虫中的应用
在上一个文章中详细的介绍了CSV文件内容的读取和写入,那么在本次文章中结合网络爬虫的技术,把数据获取到写入到CSV的文件中,其实利用爬虫的技术可以获取到很多的数据,某些时候仅仅是好玩,真正进行数据分析 ...
最新文章
- PyTorch学习笔记——pytorch图像处理(transforms)
- JS—图片压缩上传(单张)
- Linux防火墙详解(二)
- Prima Cartoonizer中文版
- TKStudio-LPC1220_GPIO_LED工程后记
- fastjson异常问题
- Unity性能优化-遮挡剔除
- python安装tensorflow报错_Anaconda安装tensorflow报错问题解决方法
- 中国结肠镜设备行业市场供需与战略研究报告
- linux的RPM支持图片格式,Linux下rpm、yum和源码三种安装方式详细介绍
- 计算机显卡怎样安装方法,台式机显卡怎么安装?教您安装方法
- dw相对路径怎么改_Dreamweaver绝对路径和相对路径
- Opencv imread读取图片结果一直为空
- c++快捷店会员管理系统
- FVCOM 环境基础配置(1) intel编译器 下载与安装
- Excel 合并单元格 ,换行,过滤空单元格
- CocosCreater 教程(中)
- C++中引用,指针,指针的引用,指针的指针
- PostgreSQL得出两个timestamp的秒数差值
- 表单打印html代码,Html表格代码实现打印
热门文章
- 为什么国内流行hbase,国外反而多用cassandra?
- 科普文:服务器上如何 Node 多版本共存 #31
- CentOS系统Tomcat 8.5/9部署SSL证书
- C语言最重要的知识点(电子文档)
- 地表最强mysql命令行连接工具mycli
- 测试框架之testng使用
- 如何在Swift中使用CoreData设置有用的自动完成UITextField
- 一键搭建php本地测试环境_如何在PHP中设置本地调试环境
- 像程序员一样思考:如何仅使用JavaScript,HTML和CSS来构建Snake
- 2020计算机科学第五轮评估,2019-2020全国计算机专业大学排名