如何爬取某个网站的全部链接


获取首页全部链接

  • 这里我们使用jsoup框架(框架本身比较轻)
public void getPageUrl(String url){
    Document doc = Jsoup.connect(url).get();
    Elements aList = doc.select("a");
    for (Element ele: aList) {
        String href = ele.attr("href");
        System.out.println(href);
    }
}

递归每个页面中的链接

private ArrayList<String> listUrl = new ArrayList<String>();

public void getPageUrl(String url)&#123;
    Document doc = Jsoup.connect(url).get();
    Elements aList = doc.select("a");
    for (Element ele: aList) &#123;
        String href = ele.attr("href");
        String endUrl = url + href;
        if (!listUrl.contains(endUrl))&#123;  //避免重复的地址录入
            listUrl.add(endUrl); //将每次获取的链接存储到数组中
            this.getPageUrl(endUrl);
        &#125;
    &#125;
&#125;

获取页面内容

  • 下面的代码将只是简单伪代码
//获取页面内容,此处去除换行符是为了数据保存到文件中时单条数据只能是单行的
String html = doc.body().text().trim().replaceAll("\n", "");  
refresh(页面地址, 页面标题, 页面内容); //控制数据刷新的数量

使用线程池去控制数据的存储


//此处线程池中线程的数量根据系统当前情况而定
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors());

private String count = 0;
private String str = "";

public void refresh(String endUrl, String title, String html)&#123;
    if (count == 30)&#123;
        //每个线程控制30个网页内容的存储
        fixedThreadPool.execute(new Thread(文件路径, str));
        count = 0;
        str = "";
    &#125;
    str += html + "\r\n";
    count++;
&#125;

需要考虑的情况

  • a标签中的链接是否可以获取到内容
  • 是否考虑reboot.txt
  • 不是同一域的链接是否需要存储
  • 如果遇到反爬虫机制应该如何应对

完整代码

编写:武杰


评论
 上一篇
数据资源 数据资源
格式: [来源-简介](地址) 说明: 此模块是从508资源列表分离而来 如何添加: 移动到该页最下方单击添加按钮.(提交issue即可) AMiner 公司名语料库 kaggle-数据集 AWS-开放的数据 508工作室-数据仓库 搜
2020-01-02
下一篇 
实习工作后学习规划 实习工作后学习规划
前半年实习  把手头工作做好,如果对公司项目有什么不理解的,可继续深挖,如若没有 or 已经掌握的工作之余,推荐以下学习计划清单。 Android 如果你工作是 Android 恰恰感觉自己基础不是很牢固 推荐书籍: A
  目录