java爬虫框架 Python里赫赫有名的Scrapy框(lun)架(zi)

发布时间:2021-08-10 18:01 点击:

说起爬虫,大家都会想到 Python 中大名鼎鼎的 Scrapy 框架。在本文中,我们参考了这个设计思想,使用Java语言实现了我们自己的爬虫框架(lun)框架(zi)。我们从起点一步一步分析爬虫框架的诞生过程。

我把这个爬虫框架的源码放在github上,有几个例子可以运行。

关于网络爬虫的一切关于爬虫

现在我们来介绍一下什么是爬虫?以及爬虫框架的设计和遇到的问题。

什么是爬虫?

“爬虫”不是生活在土壤中的小虫子。网络爬虫,也称为蜘蛛,是一种自动浏览互联网内容的机器人。爬虫访问网站会消耗目标系统资源,很多网站是不允许​​爬虫爬取的(这是你遇到的robots.txt文件。这个文件可以要求robot只索引网站的一部分或根本不处理它)。因此,在访问大量页面时,爬虫需要考虑规划、加载和“礼貌”(大哥,慢点)。

互联网上的页面太多了,即使是最大的爬虫系统也无法做出完整的索引。因此,在2000年之前万维网出现的初期,搜索引擎往往找不到很多相关结果。目前的搜索引擎在这方面已经有了很大的改进,可以立即提供高质量的结果。

网络爬虫遇到的问题

既然有人想爬,就有人想防守。网络爬虫在运行的过程中会遇到一些障碍,业内称之为反爬虫策略。让我们列出一些常见的。

这些是传统的反爬行动物方法。当然,他们将来会更先进。技术创新将始终带动多个产业的发展。毕竟人工智能时代已经到来,爬虫与反爬虫的斗争还在继续。

爬虫框架需要考虑什么

设计我们的框架

我们将根据Scrapy的设计思路设计一个爬虫框架。我们先来看看在没有爬虫框架的情况下我们是如何抓取页面信息的。一个常见的例子就是使用HttpClient包或者Jsoup进行处理,对于一个简单的小爬虫来说已经足够了。

我们来演示一段没有爬虫框架时抓取页面的代码。这是我在网上搜索的。

public class Reptile {
   public static void main(String[] args) {
    //传入你所要爬取的页面地址
    String url1 = "";
    //创建输入流用于读取流
    InputStream is = null;
    //包装流,加快读取速度
    BufferedReader br = null;
    //用来保存读取页面的数据.
    StringBuffer html = new StringBuffer();
    //创建临时字符串用于保存每一次读的一行数据,然后html调用append方法写入temp;
    String temp = "";
    try {
        //获取URL;
        URL url2 = new URL(url1);
        //打开流,准备开始读取数据;
        is = url2.openStream();
        //将流包装成字符流,调用br.readLine()可以提高读取效率,每次读取一行;
        br= new BufferedReader(new InputStreamReader(is));
        //读取数据,调用br.readLine()方法每次读取一行数据,并赋值给temp,如果没数据则值==null,跳出循环;
        while ((temp = br.readLine()) != null) {
            //将temp的值追加给html,这里注意的时String跟StringBuffere的区别前者不是可变的后者是可变的;
            html.append(temp);
        }
        //接下来是关闭流,防止资源的浪费;
        if(is != null) {
            is.close();
            is = null;
        }
        //通过Jsoup解析页面,生成一个document对象;
        Document doc = Jsoup.parse(html.toString());
        //通过class的名字得到(即XX),一个数组对象Elements里面有我们想要的数据,至于这个div的值呢你打开浏览器按下F12就知道了;
        Elements elements = doc.getElementsByClass("XX");
        for (Element element : elements) {
        //打印出每一个节点的信息;你可以选择性的保留你想要的数据,一般都是获取个固定的索引;
            System.out.println(element.text());
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关于我们

pix

水族爬虫植物百科网是包含了水族鱼类爬虫养殖植物种植的专业性宠物百科.在更多

联系我们

联系我们