话不多说直接干货
目录
爬取方法
main方法
爬取的网站源码
筛选方法
实际数据筛选
源码以及所用的包
结束
我用到的jar包为jsoup-1.11.3.rar(这个包我会再最后留下分享链接)
只要是静态网站我用的都是这个包进行爬取.
//爬取方法,传入网站网网址,返回爬取的所有源码以String类型
public Document doc = null;
public String Sdoc = null;
public String Crawlers(String url) {
try {
doc = Jsoup.connect(url)
.header("user-agent","Mozilla/5.0 (Windows NT 10.0; WOW64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) "+
"Chrome/47.0.2526.106 BIDUBrowser/8.7 Safari/537.36")
.ignoreContentType(true).get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将Document 转为 String类型方法 Document.html();
Sdoc = doc.html();
return Sdoc;
}
这里面.header()里的参数为模拟浏览器类型(Chrome:谷歌浏览器,Mozilla:火狐等)
不用过多讲解.
我就以我之前的博客为目标进行爬取
https://blog.csdn.net/qq_41873771/article/details/84142691
//main方法运行
public class Totality {
public static void main(String[] args) {
Totality Totality = new Totality();
String url = "https://blog.csdn.net/qq_41873771/article/details/84142691";
String text = Totality.Crawlers(url);
System.out.println(text);
}
}
结果就是返回网站的源码,我们要爬取的信息就在这些源码中
使用ctrl+F进行全局搜索:
article-title-box
hide-article-box
搜索完你会发现,文章的主要内容就在这些关键词的中间,所以我们要通过筛选的方法一点一点筛选出来.
其实筛选就好似剥洋葱,一层一层.
我这里主要用一下几个方法
.indexOf();
.lastIndexOf();
.substring();
.replace();
接下来我一个一个讲解这些方法怎么用,如果只是想看结果的可以跳过这里.
.indexOf();
String text = "abcdefghidjk";
//我这里写了两个b
int i = text.indexOf("d");
System.out.println(i);
//最后打印出字符串f的下标为3(下标都是从0开始数的)
返回指定的字符串在因一个字符串中首次出现的位置,从前往后找
与.lastIndexOf();有些不同
String text = "abcdefghidjk";
//我这里写了两个b
int i = text.lastIndexOf("d");
System.out.println(i);
//最后打印出字符串f的下标为9(下标都是从0开始数的)
返回指定的字符串值最后出现的位置,从后往前找
这两个方法用于定位想要获取的值的位置
就像上面的两个关键词一样,用来定位文章内容的位置,因为网站源码东西太多,所以需要将有用的单独拿出来.
所有就用到了.substring();方法
String text = "abcdefghidjk";
int j = text.indexOf("d");
int i = text.lastIndexOf("d");
String zhi = text.substring(j,i);
System.out.println(zhi);
//打印defghi
方法用于提取字符串中介于两个指定下标之间的字符。
这里就用到了之前获取的两个下标.
但有一点注意indexOf()方法获取的下标是包含自己的
比如上面我获取的是第一个b的下标,我截取是就会将b也截取在内.
所以我的习惯是在substring();中,将前面的下标减去自己的长度
String text = "abcdefghidjk";
int j = text.indexOf("d");
int i = text.lastIndexOf("d");
String zhi = text.substring(j-1,i);
System.out.println(zhi);
//打印efghi
我就会获取中间的内容.
.replace();方法
方法用于在字符串中用一些字符替换另一些字符
就是将内容替换成字符串空或其他字符,这里主要用于替换为字符串空,也就是删除.
String text = "abcdefghidjk";
text = text.replace("a", "");
text = text.replace("d", "");
text = text.replace("g", "");
System.out.println(text);
//打印bcefhijk
replace()方法将a.d.g字符替换为字符串空,就是删除.
用到的方法讲完.
public void Filter_no1(String text) {
// 获取所需要的主要部分
beginIndex = text.indexOf("");
endIndex = text.indexOf("");
text = text.substring(beginIndex, endIndex);
// 对主要部分进行筛选
// 获取文章类型
beginIndex = text.lastIndexOf("left\">");
endIndex = text.indexOf("");
String article_type = text.substring(beginIndex + 6, endIndex);
// 获取标题
beginIndex = text.indexOf("title-article");
endIndex = text.indexOf("");
String title_article = text.substring(beginIndex + 15, endIndex);
// 获取时间
endIndex = text.indexOf("time");
String time = text.substring(endIndex + 6);// sub方法一个值时从这个下标开始到String结尾
endIndex = time.indexOf("");
time = time.substring(0, endIndex);// 下标从0开始
// 阅读数
endIndex = text.indexOf("read-count");
String read_count = text.substring(endIndex + 12);// sub方法一个值时从这个下标开始到String结尾
endIndex = read_count.indexOf("");
read_count = read_count.substring(0, endIndex);// 下标从0开始
// 用户名
endIndex = text.indexOf("follow-nickName");
String Name = text.substring(endIndex);// sub方法一个值时从这个下标开始到String结尾
beginIndex = Name.indexOf(">");
endIndex = Name.indexOf("");
Name = Name.substring(beginIndex + 1, endIndex);// 下标从0开始
// 个人分类
String label = "";
endIndex = text.indexOf("tag-link");
if (endIndex > 0) {
label = text.substring(endIndex);// sub方法一个值时从这个下标开始到String结尾
beginIndex = label.indexOf(">");
endIndex = label.indexOf("");
label = label.substring(beginIndex + 1, endIndex);// 下标从0开始
} else {
label = "无";
}
// 文章内容
endIndex = text.indexOf("content_views");
String context = text.substring(endIndex + 15);
beginIndex = context.indexOf("");
String repetition_no1 = context.substring(beginIndex, endIndex + 1);
context = context.replace(repetition_no1, "");
}
// 除去零散的无用字符串
context = context.replace("
", "");
context = context.replace("
", "");
context = context.replace("
", "");
context = context.replace("", "");
context = context.replace("", "");
context = context.replace("", "");
context = context.replace(" ", "");
System.out.println("文章类型:" + article_type);
System.out.println("标题:" + title_article);
System.out.println("发布时间:" + time);
System.out.println("发布者名:" + Name);
System.out.println("个人分类:" + label);
System.out.println("文章内容:" + context);
}
最后打印出筛选后的内容.
文章类型:原
标题:[java爬虫] 一.从哪里开始到哪里开始要哪里开始
发布时间:2018年11月20日 08:57:26
发布者名:张德仁
个人分类:java爬虫
文章内容:
我不想一边又一遍的讲爬虫是什么,我写这个系列的目的:
1.首先,打破大家学习新事物的误区;我认为能看到我博客的人大部分都是成年人,成年人的时间是不多的,宝贵的,所以不能再像以往上学时从基础开始.
2.其次我要写博客就要写干货;直接从数据上下手,将内容都以"模块化"书写并使用.
3.将我的所学(自学)的内容分享出来;可能真正的高手与大佬会认为我写的会比较简单基础繁琐,也欢迎各位指出我的错误,在这里先感谢各位.
我现在正在整理我所有爬虫项目,准备通过一条线将他们关联起来,目前整理的为:
1.爬虫方法与基础网页爬取,数据筛选.
2.爬虫筛选数据都有什么方法,IO流方法,MySQL数据库使用.
3.编写爬虫测试工具(以后会不断完善工具).
4.综合爬取CSDN首页数据.
5.小总结,并放出我常用的编码格式转换等方法.
6.爬取36氪的24小时新闻(涉及寻找网页接口),常用网页接口查找方法.
7.爬取网站图片,图片爬取方法(IO流的使用).
8.使用爬虫进行网站登录,爬出登录后内容.
9.爬取国内外ip地址,制作ip代理池,更换ip隐藏自己.
10.未完待续.
目前就是这样,之后我还会整理的.
源码以及所用的包
度盘: 源码&包
提取码: 5jdt
结束
第一次写这种教学向的博客,可能有些叙述的不是十分清楚,还请大家多多指点.
也希望喜爱爬虫技术的人能够聚集在一起相互学习相互帮助.
写爬虫是我的一个爱好,我也希望能够通过我的爱好结交更多的人,也能帮助更多的人.
有什么不明白的可以加我的群,如果我不忙的时候会解决大家的问题.
转载请标明出处