package org.example;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Get{
//创建一个客户端
public static CloseableHttpClient client = HttpClients.createDefault();
public static String path="D:/temp/";
public static String prefix="https://m.qishuta.org";
/**
* 该方法为获取单个页面里的context
*/
public static String gettxt(String urlroot) {
//创建一个get请求
HttpGet request = new HttpGet(urlroot);
//发起请求
try {
HttpResponse response = Get.client.execute(request);
//把响应转化为字符串 指定编码格式,否则会出现乱码
String html = EntityUtils.toString(response.getEntity(),"utf-8");
//把字符串转化为文档
Document document = Jsoup.parse(html);
//获取文档里id为novelcontent的元素
Element novelcontent = document.getElementById("novelcontent");
//获取文本
String txt=novelcontent.ownText();
//删掉多余内容
txt=txt.substring(txt.indexOf(") ")+2);
txt=txt.replaceAll("(本章未完,请点击下一页继续阅读)","");
//将空格变为换行
txt=txt.replaceAll(" ","\n");
//删除空白行
txt=txt.replaceAll("(?m)^[ \t]\r?\n","");
return txt;
} catch (Exception e) {
System.out.println("运行出错 gettxt(String url) url:" + urlroot);
}
return null;
}
/**
* 获取下一页的地址
*/
public static String getNextUrl(String urlroot){
HttpGet request = new HttpGet(urlroot);
//发起请求
try {
HttpResponse response = Get.client.execute(request);
//把响应转化为字符串 指定编码格式,否则会出现乱码
String html = EntityUtils.toString(response.getEntity(),"utf-8");
//把字符串转化为文档
Document document = Jsoup.parse(html);
//获取文档里id为novelcontent的元素
Element next = document.getElementsByClass("p1 p3").first();
Element a=next.getElementsByTag("a").first();
//获取元素内无标签文字
String txt = a.ownText();
//<a href="url"> href不以http开头,会默认增加当前目录路径为前缀
if(txt.equals("下一页")){
return prefix+a.attr("href");
}
} catch (Exception e) {
System.out.println("运行出错 getNextUrl(String url) url:" + urlroot);
}
return null;
}
/**
* 获取单章context
* @param urlroot
* @return
*/
public static String getone(String urlroot){
StringBuilder txt=new StringBuilder();
txt.append(gettxt(urlroot));
String next=urlroot;
while((next=getNextUrl(next))!=null){
txt.append(gettxt(next));
}
return new String(txt);
}
/**
* 得到当前页面的所有章节指向与章节名字
* */
public static HashMap<Integer, Zhang> getCatalog(String urlroot,int begin){
int copy=begin;
HttpGet request=new HttpGet(urlroot);
String[] paths=new String[20];
HashMap<Integer,Zhang> map=new HashMap<>();
try {
CloseableHttpResponse response = client.execute(request);
String html=EntityUtils.toString(response.getEntity(),"utf-8");
Document document=Jsoup.parse(html);
Element listXm=document.getElementsByClass("list_xm").last();
Element ul=listXm.getElementsByTag("ul").first();
Elements lis=ul.getElementsByTag("li");
for(Element e:lis){
Element a=e.getElementsByTag("a").first();
String name=a.ownText();
String url=prefix+a.attr("href");
Zhang zhang=new Zhang();
zhang.name=name;
zhang.url=url;
map.put(copy++,zhang);
}
return map;
}catch (Exception e){
System.out.println("getCatalog出错url:"+urlroot);
}
return null;
}
/**
* 储存单章
*/
public static void save(String name,String txt){
try{
FileWriter writer=new FileWriter(path+name+".txt");
writer.write(txt);
writer.flush();
writer.close();
}catch (Exception e){
System.out.println("save出错 name:"+name+" rooturl:"+txt);
}
}
public static void saves(HashMap<String,String> map){
Iterator<Map.Entry<String,String>> iterator=map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> entry=iterator.next();
save(entry.getKey(),entry.getValue());
}
}
/**
* 获取所有目录地址
*/
public static HashMap<Integer,String> getAll(String url){
HashMap<Integer,String> map=new HashMap<>();
int begin=0;
HttpGet request=new HttpGet(url);
try{
CloseableHttpResponse response=client.execute(request);
String html=EntityUtils.toString(response.getEntity(),"utf-8");
Document document=Jsoup.parse(html);
Element element=document.getElementsByAttributeValue("name","pageselect").first();
Elements options=element.getElementsByTag("option");
for(Element e:options){
String t=e.attr("value");
map.put(begin++,prefix+t);
}
}catch (Exception e){
System.out.println("getAll出错:"+e.getMessage());
}
return map;
}
public static void getAllTxt(String url,String name){
HashMap<Integer,String> map=Get.getAll(url);
Iterator<Map.Entry<Integer,String>> iterator=map.entrySet().iterator();
ThreadPoolExecutor poolExecutor=new MyPool(6,
6,10,TimeUnit.MINUTES,new LinkedBlockingDeque<Runnable>(),name);
while(iterator.hasNext()){
Map.Entry<Integer,String> e=iterator.next();
Map<Integer,Zhang> pmap= Get.getCatalog(e.getValue(),e.getKey()*20+1);
//进行内容爬取
MyThread myThread=new MyThread(pmap);
poolExecutor.execute(myThread);
}
//执行完毕进行合并
poolExecutor.shutdown();
}
}
class MyPool extends ThreadPoolExecutor {
String name;
public MyPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,String name) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
this.name=name;
}
@Override
protected void terminated() {
System.out.println("开始合并");
hebing(name);
}
public static void hebing(String name){
try{
String path="D:/temp/";
File folder = new File(path);
File[] files = folder.listFiles();
int n=files.length;
FileWriter writer=new FileWriter(path+name+".txt");
for(int i=1;i<=n;i++){
File file=new File(path+i+".txt");
InputStreamReader i
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
资源推荐
资源详情
资源评论
收起资源包目录
一个爬虫尝试.zip (6个子文件)
SJT-code
pom.xml 1KB
src
main
java
org
example
Get.java 9KB
Main.java 556B
target
classes
org
example
MyPool.class 3KB
MyThread.class 2KB
Zhang.class 924B
共 6 条
- 1
资源评论
JJJ69
- 粉丝: 6131
- 资源: 5674
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功