zoukankan      html  css  js  c++  java
  • [01] 网络爬虫的基本原理


    1、什么是网络爬虫

    爬虫是“模拟用户在浏览器或某个应用上的操作,把操作的过程实现自动化程序”,那什么是网络爬虫呢?即模拟浏览器行为,通过指定url,直接返回给用户所需要的数据,而不需要人为操纵浏览器获取

    我们使用浏览器访问网页大概发生了什么?
    • 查找域名对应的IP地址
    • 向IP对应的服务器发送请求
    • 服务器响应请求,发回网页内容
    • 浏览器解析网页内容
     
    网络爬虫,就是要模拟上述行为。

    2、最简单的爬虫:你好百度

    既然知道了原理,那么我们试着来把百度的网页内容抓取下来,无非就是:
    • 模拟url连接
    • 获取响应的输入流
    • 把输入流的内容输出到本地

    public class Test {  
        public static void main(String[] args) {
            try {
                URL url = new URL("http://www.baidu.com");
                URLConnection connection = url.openConnection();
                //建立连接
                connection.connect();
                //获取输入流
                InputStream in = connection.getInputStream();
                //输出内容
                OutputStream out = new FileOutputStream(new File("C:/Users/Dulk/Desktop/baidu.txt"));
                byte[] temp = new byte[1024];
                int size = -1;
                while ((size = in.read(temp)) != -1) {
                    out.write(temp, 0, size);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    瞧瞧本地多了什么?一个baidu.txt文件,打开看看:
     
    再把后缀txt改为html试试:
     

    3、再听我叨叨

    上面的例子写了一个最简单不过的爬虫,爬取了百度首页的网页内容。爬虫有什么作用?举个简单的例子,你看到某个帖子里有好多好多美女图片,但是帖子有上百页,手动保存图片估计得累得半死,有爬虫就so easy。再者,你想租个房子,要离地铁近,要套一,价格要便宜,网上一家一家找?有爬虫,去几大网站上把租房信息爬下来,再写个算法进行筛选,找到心仪的租房so easy。当然,爬虫生态较好的还是python了,爬下来的内容也是做大数据分析不可或缺的。

    3.1 爬虫的基本流程

    在复杂的需求下,就不会像上例那么简单的爬虫了,它的工作流程有了一些变化,主要是因为URL需要变化
    • 首先选取一部分精心挑选的种子URL
    • 将种子URL加入任务队列
    • 从队列取出URL,解析DNS得到IP,并将对应的网页下载下来,并将这些URL放进已抓取URL队列
    • 分析已抓取URL队列中的URL,分析其中的其他URL,并放入待抓取队列,从而循环
    • 解析下载下来的网页,将需要的数据解析出来
    • 数据持久化,保存至数据库中


    3.2 爬虫的抓取策略


    这里只列举两种常见的抓取策略:

    深度优先策略
    • 指爬虫从某个URL开始,一个链接接着一个链接爬取下去,直到处理完某个链接所在的所有线路,才切换到其他线路
    • 抓取顺序(如上图例):A -> B -> C -> D -> E -> F -> G -> H -> I -> J

    广度优先策略
    • 指将新下载网页中发现的链接,直接插入到待抓取队列的末尾
    • 即先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取该网页链接中所有网页
    • 抓取顺序(如上图例):A -> B -> E -> G -> H -> I -> C -> F -> J -> D

    3.3 其他还没有提到问题

    还有其他很多要点这里没有详细进行阐述,比如:
    • 如果网页需要登陆,设置Cookie的问题
    • 如何通过抓包分析请求
    • 拥有反爬虫机制的网站如何进行伪装
    • AJAX技术的网页如何处理
    • 高频请求后是否触发网站的验证码验证
    • ... 

    真是学无止境啊!

    4、参考链接



  • 相关阅读:
    Java总结篇系列:Java泛型
    视图、索引、存储过程优缺点
    SQL之case when then用法
    oracle数据库表的导入导出cmd命令大全
    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法
    如何查看一个数据文件是否是自动扩展
    ora-01652无法通过128(在表空间temp中)扩展temp段
    解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
    Java中的JDBC基础
    Java中的Property类
  • 原文地址:https://www.cnblogs.com/deng-cc/p/8257204.html
Copyright © 2011-2022 走看看