爬虫
百度百科释义
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫
Jsoup
百度百科释义
jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
做过前端开发的朋友应该知道JQuery,这里的Jsoup其实就是Java版的JQuery;其实作者也不喜欢这些花里胡哨的概念性的东西!但考虑到不同受众和未接触过编程的朋友们还是要简单引导一下
(PS:有很多朋友会问为啥不用Python因为py几行代码就搞定了,更有甚者以为Python就是爬虫!其实这个观点是不正确的,任何技术存在即合理,但要结合具体业务,好钢要用到刀刃上不是?!Python以后有机会再出吧哈哈~~)
说人话:爬网页就是所见即所得
依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
<dependency>
<groupId>***.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
代码
public static void main(String[] args) throws Exception {
Map headers = new HashMap();
headers.put("Proxy-Host", "www.duoip.***"); // 设置代理主机
headers.put("Proxy-Port", "8000"); // 设置代理端口
headers.put("Referer", "https://www.bqgka.***/s?q=%E5%85%A8%E8%81%8C%E5%A4%A9%E4%B8%8B"); // 伪装防盗链
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); // 伪装浏览器
//
int bookNO = 502;
Document doc = Jsoup.connect("https://www.bqgka.***/book/" + bookNO).headers(headers).ignoreContentType(true).get();
// System.out.println(Jsoup.parseBodyFragment(doc.html()).body());
String bookName = doc.getElementsByTag("h1").text();
//分页遍历
for (int p = 1; p <= 99999; p++) {
try {
doc = Jsoup.connect("https://www.bqgka.***/book/" + bookNO + "/" + p + ".html").headers(headers).ignoreContentType(true).get();
Elements els = doc.getElementsByClass("Readarea ReadAjax_content");
String content = doc.getElementsByTag("h1").text() + "\n";
if (els.size() == 0) {
log.info(bookName + "爬取完成");
break;
}
for (int i = 0; i < els.size(); i++) {
List<TextNode> textNodes = els.get(i).textNodes();
for (int j = 0; j < textNodes.size(); j++) {
content += textNodes.get(j).text() + "\n";
}
}
FileUtil.appendUtf8String(content, "D:\\spiders\\mybook\\《" + bookName + "》.txt");
//线程休眠-防止网站检测到请求过于频繁
Thread.sleep(500);
} catch (IOException exception) {
log.error(exception.getMessage());
Thread.sleep(1000);
continue;
}
log.info("{},爬取成功", doc.getElementsByTag("h1").text());
}
}
效果
一些思考
反爬策略:很多网站现在都有反爬策略,基于用户请求的headers反爬是最常见的反爬机制。
通过分析目标网站请求头可以得知主要是通过设置Referer(防盗链)和User-Agent(请求终端)
见招拆招,你有反爬策略我们当然也有反反爬策略,正所谓你有张良计,我有过墙梯。三十年河东,三十年河西,莫欺少年穷!(有点中二了,哈哈~~~)
反反爬策略:
伪装浏览器:即在爬虫中添加headers,并在headers中添加浏览器
伪装防盗链:在headers中添加防盗链,通过抓包查看具体值
想简单了解反爬和反反爬的朋友可以康康这个
写在最后:上面的案例是最简单的爬虫,也还有很多优化的地方(比如多线程,IP代理池等),爬虫技术是为了帮助我们更好的利用互联网进行数据分析、信息整合等业务,自己娱乐一下就好,互联网不是法外之地,切勿做违法犯罪之事,否则将喜提银手镯。。。。。。