网络爬虫 订阅
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 展开全文
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
信息
外文名
web crawler
别    称
网络蜘蛛、蠕虫
作    用
抓取网站上的信息
中文名
网络爬虫
目    的
按要求获取万维网信息
算    法
网络拓扑、基于网页内容和基于用户访问行为三种算法
网络爬虫产生背景
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:(1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通过搜索引擎所返回的结果包含大量用户不关心的网页。(2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。(4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。 为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。1 聚焦爬虫工作原理以及关键技术概述网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。 相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:(1) 对抓取目标的描述或定义;(2) 对网页或数据的分析与过滤;(3) 对URL的搜索策略。
收起全文
精华内容
下载资源
问答
  • 网络爬虫

    千次阅读 2018-07-27 11:43:49
    参考:百度百科网络爬虫定义 网络爬虫(又被称为网页蜘蛛,网络机器人,网页追逐者等),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,跟浏览器一样,是一个web客户端程序,如下图: 网络爬虫 二...

    参考我的知乎专栏:网路爬虫

    现在从网络爬虫的五个方面开始讲起,即定义,背景,原理,工具,实战。

    一:网络爬虫定义

    参考:百度百科网络爬虫定义 网络爬虫(又被称为网页蜘蛛,网络机器人,网页追逐者等),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,跟浏览器一样,是一个web客户端程序,如下图:

    网络爬虫

    二:网络爬虫背景

    计算机网络本质上是一种传播工具,方便人们更好的相互交流。计算机网络将原本世界上各个孤立的网络连接起来,由很多子网络进而形成一个非常大的网络,即万维网。在这个大的网络里,网页也将是成千上万,数不甚数(截止到 2007 年底,Internet 上网页数量超出 160 亿个),导致人们很难去找到所需要的信息,如何有效地提取并利用这些信息成为一个巨大的挑战。此时,搜索引擎也就出现了, 比如AltaVista,Yahoo!和Google,搜索引擎原理技术如下:

    搜索引擎技术原理架构

    从上图可以看出,数据的源头是万维网,而采集器是spider,也就是我们今天讲的网络爬虫。

    三:网络爬虫原理

    由于网络爬虫是数据采集存储器,我们先来介绍网站的数据流向,这样让我们知道网络爬虫处于哪一个流程,如下图:

    1.让我们先看数据和信息的定义(引用《白话大数据与机器学习》):

    数据:承载了"信息"的符号(数字,字符,字母,图片,音频,视频等),才能被称为数据。

    信息:是用来消除随机不确定性的证据或者凭证。至于信息的如何度量,可以参看信息论和概率统计相关学科。

    2.完整的数据流图:

    网路爬虫主要包含:媒体网络分析,网络采集,数据存储,其中媒体网络分析主要指人工对web站点或者app的网络协议进行定量分析,人工确定采集策略和步骤,这一步是网络爬虫最重要的,也是最难的;网络采集步骤主要是采集策略和步骤的算法代码实现,然后提取特征字段和一定程度的清洗转换,存入到相关库里(比如mysql,mongdb,redis,elasticsearch等);

    数据建模与分析主要指机器学习算法模型,为了更好的建模,在这里一般会对原始数据根据模型的相关规则进行清洗转换;

    数据可视化和决策,就是数据BI, 根据模型进行预测分析之后,产生相关领域的报表,发现一定的规律,从而接着为客户提供垂直领域的数据服务能力,最后客户觉得该数据服务有很大的指导价值,比如定向精准投放广告,为此客户付出一定量的金钱到达数据变现。 这也是为什么有价值的数据就像石油一样,采集数据和石油开采本质是一样,谁掌握了价值大的数据,谁就是行业老大,否则巧妇难为无米之炊,云计算和AI都就像断了源头的水一样,没有活力!

     

    三: 网路爬虫原理

    网络爬虫的原理就是:

    (1)我们开发的网络爬虫程序跟浏览器,app等一样,本质上都是一个web客户端;

    (2)其中web客户端通过发送request的方式经过web网络中转到达web服务端,web把response通过web网络中转给web客户端,其中request是通过一定的协议格式封装成的数据包,其中常见的应用层协议有:http(s)/ftp等。

    (3)我们开发的网络爬虫,本质就是模拟浏览器或者客户端,让程序的行为在服务器看起来更像人一样操作,就成功了;

    (4)为了获取服务器的数据,我们的程序也要发送请求,这时候需要抓包程序(其实就是一个代理服务器),常见的http/https抓包程序:浏览器开发者工具(这里推荐chrome开发者工具);charles/fiddler/mitmproxy(命令行抓包工具,对接python脚本)等,我们要找到我们需要的网页数据对应哪个具体的请求。【注意】:如果客户端不是通过http(s)协议的话,而是ftp,或者更加底层协议的话,如tcp/udp等,我们就需要其他的抓包工具,比如wireshark其他工具进行抓包分析;

    (5)我们开发的网络爬虫程序,可以从两个部分着手: 一般从图中的【2】着手,通过抓包构造Request的方式,这是最常见的,也是效率最快的一种方式,常常会辅助反编译app的手段; 另一种方式就是模拟,也是第一种方法解决不了的时候,即Request不容易构造,不容易还原,此时从第一步着手:比如,人操作浏览器/app的时候,进行各种点击下拉等操作,我们也可以通过相关库,进行动作流程制定,写出相关脚本,定时驱动浏览器或者app去跑,然后捕获特定请求的请求,通过插入的解析脚本解析得到数据即可,这种方式一般比较慢,采集的数据也会慢很多。

    4.网络爬虫系统一般设计图:

    简易爬虫系统

    单机网络爬虫系统详细设计图

    分布式网路爬虫系统

    scrapy框架组件

    设计核心组件:

    1.调度组件:比如select模块或者Scheduler模块,组要是队列的设置,优先级如何考虑,谁先抓,谁后抓,以及url去重的考虑;

    2.下载组件:比如上面的crawl模块或者downloader模块,此处关键是构造requests,设置请求头部,设置代理ip,设置cookie,构造好参数之间的关系,设置下载频率,控制并发数等;

    3.解析组件:上面的Extract模块或者spider模块,主要首先定义好要提取的字段特征,根据相应结果的字段位置提取,常见方法是css选择器,xpath, jmepath, 正则表达式等;

    4.存储组件:如上面的cache模块,pages模块等,将第3步提取的item或者特征,进行一定的转换存储到相关库中。

    5.engine组件或者distribute组件,主要是协调上面各个组件相互协作,统一安排,分布式的核心是,把带抓取的url库存放到一个统一的库进行维护,或者放到消息队里,这样是为了去重和优先级调度。

     

    四:网络爬虫工具

    这里主要针对python相关开发,其他语言不是太熟悉,所以不作介绍,理论上每种语言都可以用来开发网络爬虫程序,只不过是每种语言的开发效率和性能不一样而已:

    1.抓包工具[大多是一个代理web服务,监听相应端口,截取相关协议请求]: pc端:chrome开发者工具,charles工具,wiresharks,其他浏览器开发者工具等;

    移动端:charles, fiddler, mitmproxy, anyproxy等,后面两个是命令行工具,方便对接程序脚本;

    2.网络请求库:

    同步请求库:requests, urllib等;

    异步请求库:aiohttp, asyncio等;

    3. 自动化测试工具,主要用来模拟,一般需要搭配特定的驱动库:

    pc端:selenium, chromedriver, chrome-headless, phantomjs, casperjs等;

    移动端:appnium等

    4.解析库:

    lxml; Beatifulsoup; pquery; jmepath; Selector等

    5.数据存储库:

    mysql/pymysql; mongodb/pymongo; redis/redis-py; elasticsearch等

    6.爬虫框架库:

    pyspider/scrapy(twisted)/scrapy-splash/scrapy-redis等

    7.javascript代码执行库:

    selenium, splash, js2py, jsbeautifier,nodejs等

    8.爬虫部署库:

    scrapyd/scrapyd-client/scrapyrt/docker/shell等

    9.多进程与线程:

    multiprocessing /threading等

     

    五:网络爬虫实战:

    一般要了解网络爬虫建议从头写起,不要一开始使用框架,这样可以熟悉整个具体流程:从网络请求,网络下载,内容解析,内容清洗和内容存储,网络教程很多,这里就不介绍很多了。

    PS:网络爬虫系统往往最难的几点,在于性能优化和实时抓取以及覆盖率,其次还有调度设计,爬取效率,去重,入库效率,以及代理池和cookie池等的设计,而爬虫系统抓取的数据往往也是互联网数据的一滴水,微弱的忽略不计,本质就是一个采样的思想,也就是互联网数据的一个样本,只有数据量达到一定的时候,才具有一定的可信度,否则得出的结论就是井底之蛙一样以偏概全。最后提醒一点的是,你的爬虫请求会占用网络服务提供方服务器的资源,尽量控制好你的频率和请求并发连接数,尽量根据对方的Robot.txt和sitemap文件,进行文明道德抓取,否则有可能引起对方的诉讼!

    展开全文
  • Python3网络爬虫快速入门实战解析

    万次阅读 多人点赞 2017-09-28 14:48:41
    请在电脑的陪同下,阅读本文。本文以实战为主,阅读过程...本文的实战内容有:网络小说下载(静态网站)、优美壁纸下载(动态网站)、爱奇艺VIP视频下载 PS:本文为Gitchat线上分享文章,该文章发布时间为2017年09月19日。

    转载请注明作者和出处: http://blog.csdn.net/c406495762
    Github代码获取:https://github.com/Jack-Cherish/python-spider
    Python版本: Python3.x
    运行平台: Windows
    IDE: Sublime text3


    更多教程,请查看:https://cuijiahua.com/blog/spider/

    一 前言

    **强烈建议:**请在电脑的陪同下,阅读本文。本文以实战为主,阅读过程如稍有不适,还望多加练习。
    本文的实战内容有:

    • 网络小说下载(静态网站)
    • 优美壁纸下载(动态网站)
    • 视频下载

    2020年,更多精彩内容,尽在微信公众号,欢迎您的关注:

    在这里插入图片描述

    二 网络爬虫简介

    网络爬虫,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网站链接。比如:https://www.baidu.com/,它就是一个URL。

    在讲解爬虫内容之前,我们需要先学习一项写爬虫的必备技能:审查元素(如果已掌握,可跳过此部分内容)。

    1 审查元素

    在浏览器的地址栏输入URL地址,在网页处右键单击,找到检查。(不同浏览器的叫法不同,Chrome浏览器叫做检查,Firefox浏览器叫做查看元素,但是功能都是相同的)

    SouthEast

    我们可以看到,右侧出现了一大推代码,这些代码就叫做HTML。什么是HTML?举个容易理解的例子:我们的基因决定了我们的原始容貌,服务器返回的HTML决定了网站的原始容貌。

    SouthEast

    为啥说是原始容貌呢?因为人可以整容啊!扎心了,有木有?那网站也可以"整容"吗?可以!请看下图:

    SouthEast

    我能有这么多钱吗?显然不可能。我是怎么给网站"整容"的呢?就是通过修改服务器返回的HTML信息。我们每个人都是"整容大师",可以修改页面信息。我们在页面的哪个位置点击审查元素,浏览器就会为我们定位到相应的HTML位置,进而就可以在本地更改HTML信息。

    **再举个小例子:**我们都知道,使用浏览器"记住密码"的功能,密码会变成一堆小黑点,是不可见的。可以让密码显示出来吗?可以,只需给页面"动个小手术"!以淘宝为例,在输入密码框处右键,点击检查。

    SouthEast

    可以看到,浏览器为我们自动定位到了相应的HTML位置。将下图中的password属性值改为text属性值(直接在右侧代码处修改):

    SouthEast

    我们让浏览器记住的密码就这样显现出来了:

    SouthEast

    说这么多,什么意思呢?**浏览器就是作为客户端从服务器端获取信息,然后将信息解析,并展示给我们的。**我们可以在本地修改HTML信息,为网页"整容",但是我们修改的信息不会回传到服务器,服务器存储的HTML信息不会改变。刷新一下界面,页面还会回到原本的样子。这就跟人整容一样,我们能改变一些表面的东西,但是不能改变我们的基因。

    2 简单实例

    网络爬虫的第一步就是根据URL,获取网页的HTML信息。在Python3中,可以使用urllib.requestrequests进行网页爬取。

    • urllib库是python内置的,无需我们额外安装,只要安装了Python就可以使用这个库。
    • requests库是第三方库,需要我们自己安装。

    requests库强大好用,所以本文使用requests库获取网页的HTML信息。requests库的github地址:https://github.com/requests/requests

    (1) requests安装

    在cmd中,使用如下指令安装requests:

    pip install requests
    

    或者:

    easy_install requests
    

    (2) 简单实例

    requests库的基础方法如下:

    SouthEast

    官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

    requests库的开发者为我们提供了详细的中文教程,查询起来很方便。本文不会对其所有内容进行讲解,摘取其部分使用到的内容,进行实战说明。

    首先,让我们看下requests.get()方法,它用于向服务器发起GET请求,不了解GET请求没有关系。我们可以这样理解:get的中文意思是得到、抓住,那这个requests.get()方法就是从服务器得到、抓住数据,也就是获取数据。让我们看一个例子(以 www.gitbook.cn为例)来加深理解:

    # -*- coding:UTF-8 -*-
    import requests
    
    if __name__ == '__main__':
        target = 'http://gitbook.cn/'
        req = requests.get(url=target)
        print(req.text)
    

    requests.get()方法必须设置的一个参数就是url,因为我们得告诉GET请求,我们的目标是谁,我们要获取谁的信息。运行程序看下结果:

    SouthEast

    左侧是我们程序获得的结果,右侧是我们在www.gitbook.cn网站审查元素获得的信息。我们可以看到,我们已经顺利获得了该网页的HTML信息。这就是一个最简单的爬虫实例,可能你会问,我只是爬取了这个网页的HTML信息,有什么用呢?客官稍安勿躁,接下来进入我们的实战正文。


    三 爬虫实战

    1 小说下载

    (1) 实战背景

    小说网站-笔趣看:URL:http://www.biqukan.com/

    本次实战就是从该网站爬取并保存一本名为《一念永恒》的小说。

    (2) 小试牛刀

    我们先看下《一念永恒》小说的第一章内容,URL:http://www.biqukan.com/1_1094/5403177.html

    SouthEast

    我们先用已经学到的知识获取HTML信息试一试,编写代码如下:

    # -*- coding:UTF-8 -*-
    import requests
    
    if __name__ == '__main__':
        target = 'http://www.biqukan.com/1_1094/5403177.html'
        req = requests.get(url=target)
        print(req.text)
    

    运行代码,可以看到如下结果:

    SouthEast

    可以看到,我们很轻松地获取了HTML信息。但是,很显然,很多信息是我们不想看到的,我们只想获得如右侧所示的正文内容,我们不关心div、br这些html标签。如何把正文内容从这些众多的html标签中提取出来呢?这就是本次实战的主要内容。

    ###(3)Beautiful Soup

    **爬虫的第一步,获取整个网页的HTML信息,我们已经完成。接下来就是爬虫的第二步,解析HTML信息,提取我们感兴趣的内容。**对于本小节的实战,我们感兴趣的内容就是文章的正文。提取的方法有很多,例如使用正则表达式、Xpath、Beautiful Soup等。对于初学者而言,最容易理解,并且使用简单的方法就是使用Beautiful Soup提取感兴趣内容。

    Beautiful Soup的安装方法和requests一样,使用如下指令安装(也是二选一):

    • pip install beautifulsoup4
    • easy_install beautifulsoup4

    一个强大的第三方库,都会有一个详细的官方文档。我们很幸运,Beautiful Soup也是有中文的官方文档。

    URL:http://beautifulsoup.readthedocs.io/zh_CN/latest/

    同理,我会根据实战需求,讲解Beautiful Soup库的部分使用方法,更详细的内容,请查看官方文档。

    现在,我们使用已经掌握的审查元素方法,查看一下我们的目标页面,你会看到如下内容:

    SouthEast

    不难发现,文章的所有内容都放在了一个名为div的“东西下面”,这个"东西"就是html标签。HTML标签是HTML语言中最基本的单位,HTML标签是HTML最重要的组成部分。不理解,没关系,我们再举个简单的例子:

    一个女人的包包里,会有很多东西,她们会根据自己的习惯将自己的东西进行分类放好。镜子和口红这些会经常用到的东西,会归放到容易拿到的外侧口袋里。那些不经常用到,需要注意安全存放的证件会放到不容易拿到的里侧口袋里。

    html标签就像一个个“口袋”,每个“口袋”都有自己的特定功能,负责存放不同的内容。显然,上述例子中的div标签下存放了我们关心的正文内容。这个div标签是这样的:

    <div id="content", class="showtxt">
    

    细心的朋友可能已经发现,除了div字样外,还有id和class。id和class就是div标签的属性,content和showtxt是属性值,一个属性对应一个属性值。这东西有什么用?它是用来区分不同的div标签的,因为div标签可以有很多,我们怎么加以区分不同的div标签呢?就是通过不同的属性值。

    仔细观察目标网站一番,我们会发现这样一个事实:class属性为showtxt的div标签,独一份!这个标签里面存放的内容,是我们关心的正文部分。

    知道这个信息,我们就可以使用Beautiful Soup提取我们想要的内容了,编写代码如下:

    # -*- coding:UTF-8 -*-
    from bs4 import BeautifulSoup
    import requests
    if __name__ == "__main__":
         target = 'http://www.biqukan.com/1_1094/5403177.html'
         req = requests.get(url = target)
         html = req.text
         bf = BeautifulSoup(html)
         texts = bf.find_all('div', class_ = 'showtxt') print(texts)
    

    在解析html之前,我们需要创建一个Beautiful Soup对象。BeautifulSoup函数里的参数就是我们已经获得的html信息。然后我们使用find_all方法,获得html信息中所有class属性为showtxt的div标签。find_all方法的第一个参数是获取的标签名,第二个参数class_是标签的属性,为什么不是class,而带了一个下划线呢?因为python中class是关键字,为了防止冲突,这里使用class_表示标签的class属性,class_后面跟着的showtxt就是属性值了。看下我们要匹配的标签格式:

    <div id="content", class="showtxt">
    

    这样对应的看一下,是不是就懂了?可能有人会问了,为什么不是find_all(‘div’, id = ‘content’, class_ = ‘showtxt’)?这样其实也是可以的,属性是作为查询时候的约束条件,添加一个class_='showtxt’条件,我们就已经能够准确匹配到我们想要的标签了,所以我们就不必再添加id这个属性了。运行代码查看我们匹配的结果:

    SouthEast

    我们可以看到,我们已经顺利匹配到我们关心的正文内容,但是还有一些我们不想要的东西。比如div标签名,br标签,以及各种空格。怎么去除这些东西呢?我们继续编写代码:

    # -*- coding:UTF-8 -*-
    from bs4 import BeautifulSoup
    import requests
    if __name__ == "__main__":
         target = 'http://www.biqukan.com/1_1094/5403177.html'
         req = requests.get(url = target) html = req.text
         bf = BeautifulSoup(html)
         texts = bf.find_all('div', class_ = 'showtxt')
         print(texts[0].text.replace('\xa0'*8,'\n\n'))
    

    find_all匹配的返回的结果是一个列表。提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除空格,替换为回车进行分段。 在html中是用来表示空格的。replace(’\xa0’*8,’\n\n’)就是去掉下图的八个空格符号,并用回车代替:

    SouthEast

    程序运行结果如下:

    SouthEast

    可以看到,我们很自然的匹配到了所有正文内容,并进行了分段。我们已经顺利获得了一个章节的内容,要想下载正本小说,我们就要获取每个章节的链接。我们先分析下小说目录:

    URL:http://www.biqukan.com/1_1094/

    SouthEast

    通过审查元素,我们发现可以发现,这些章节都存放在了class属性为listmain的div标签下,选取部分html代码如下:

    <div class="listmain">
    <dl>
    <dt>《一念永恒》最新章节列表</dt>
    <dd><a href="/1_1094/15932394.html">第1027章 第十道门</a></dd>
    <dd><a href="/1_1094/15923072.html">第1026章 绝伦道法!</a></dd>
    <dd><a href="/1_1094/15921862.html">第1025章 长生灯!</a></dd>
    <dd><a href="/1_1094/15918591.html">第1024章 一目晶渊</a></dd>
    <dd><a href="/1_1094/15906236.html">第1023章 通天道门</a></dd>
    <dd><a href="/1_1094/15903775.html">第1022章 四大凶兽!</a></dd>
    <dd><a href="/1_1094/15890427.html">第1021章 鳄首!</a></dd>
    <dd><a href="/1_1094/15886627.html">第1020章 一触即发!</a></dd>
    <dd><a href="/1_1094/15875306.html">第1019章 魁祖的气息!</a></dd>
    <dd><a href="/1_1094/15871572.html">第1018章 绝望的魁皇城</a></dd>
    <dd><a href="/1_1094/15859514.html">第1017章 我还是恨你!</a></dd>
    <dd><a href="/1_1094/15856137.html">第1016章 从来没有世界之门!</a></dd>
    <dt>《一念永恒》正文卷</dt> <dd><a href="/1_1094/5386269.html">外传1 柯父。</a></dd>
    <dd><a href="/1_1094/5386270.html">外传2 楚玉嫣。</a></dd> <dd><a href="/1_1094/5386271.html">外传3 鹦鹉与皮冻。</a></dd>
    <dd><a href="/1_1094/5403177.html">第一章 他叫白小纯</a></dd> <dd><a href="/1_1094/5428081.html">第二章 火灶房</a></dd>
    <dd><a href="/1_1094/5433843.html">第三章 六句真言</a></dd> <dd><a href="/1_1094/5447905.html">第四章 炼灵</a></dd>
    </dl>
    </div>
    

    在分析之前,让我们先介绍一个概念:父节点、子节点、孙节点。<div></div>限定了<div>标签的开始和结束的位置,他们是成对出现的,有开始位置,就有结束位置。我们可以看到,在<div>标签包含<dl>标签,那这个<dl>标签就是<div>标签的子节点,<dl>标签又包含<dt>标签和<dd>标签,那么<dt>标签和<dd>标签就是<div>标签的孙节点。有点绕?那你记住这句话:谁包含谁,谁就是谁儿子!

    **他们之间的关系都是相对的。**比如对于<dd>标签,它的子节点是<a>标签,它的父节点是<dl>标签。这跟我们人是一样的,上有老下有小。

    看到这里可能有人会问,这有好多<dd>标签和<a>标签啊!不同的<dd>标签,它们是什么关系啊?显然,兄弟姐妹喽!我们称它们为兄弟结点。
    好了,概念明确清楚,接下来,让我们分析一下问题。我们看到每个章节的名字存放在了<a>标签里面。<a>标签还有一个href属性。这里就不得不提一下<a>标签的定义了,<a>标签定义了一个超链接,用于从一张页面链接到另一张页面。<a> 标签最重要的属性是 href 属性,它指示链接的目标。

    我们将之前获得的第一章节的URL和<a> 标签对比看一下:

    http://www.biqukan.com/1_1094/5403177.html
    <a href="/1_1094/5403177.html">第一章 他叫白小纯</a>
    

    不难发现,<a> 标签中href属性存放的属性值/1_1094/5403177.html是章节URLhttp://www.biqukan.com/1_1094/5403177.html的后半部分。其他章节也是如此!那这样,我们就可以根据<a>标签的href属性值获得每个章节的链接和名称了。

    总结一下:小说每章的链接放在了class属性为listmain的<div>标签下的<a>标签中。链接具体位置放在html->body->div->dl->dd->a的href属性中。先匹配class属性为listmain的<div>标签,再匹配<a>标签。编写代码如下:

    # -*- coding:UTF-8 -*-
    from bs4 import BeautifulSoup
    import requests
    if __name__ == "__main__":
         target = 'http://www.biqukan.com/1_1094/'
         req = requests.get(url = target)
         html = req.text
         div_bf = BeautifulSoup(html)
         div = div_bf.find_all('div', class_ = 'listmain')
         print(div[0])
    

    还是使用find_all方法,运行结果如下:

    SouthEast

    很顺利,接下来再匹配每一个<a>标签,并提取章节名和章节文章。如果我们使用Beautiful Soup匹配到了下面这个<a>标签,如何提取它的href属性和<a>标签里存放的章节名呢?

    <a href="/1_1094/5403177.html">第一章 他叫白小纯</a>
    

    方法很简单,对Beautiful Soup返回的匹配结果a,使用a.get(‘href’)方法就能获取href的属性值,使用a.string就能获取章节名,编写代码如下:

    # -*- coding:UTF-8 -*-
    from bs4 import BeautifulSoup
    import requests
    if __name__ == "__main__":
         server = 'http://www.biqukan.com/'
         target = 'http://www.biqukan.com/1_1094/'
         req = requests.get(url = target) html = req.text
         div_bf = BeautifulSoup(html)
         div = div_bf.find_all('div', class_ = 'listmain')
         a_bf = BeautifulSoup(str(div[0]))
         a = a_bf.find_all('a')
         for each in a:
              print(each.string, server + each.get('href'))
    

    因为find_all返回的是一个列表,里边存放了很多的<a>标签,所以使用for循环遍历每个<a>标签并打印出来,运行结果如下。

    SouthEast

    最上面匹配的一千多章的内容是最新更新的12章节的链接。这12章内容会和下面的重复,所以我们要滤除,除此之外,还有那3个外传,我们也不想要。这些都简单地剔除就好。

    ###(3)整合代码

    每个章节的链接、章节名、章节内容都有了。接下来就是整合代码,将获得内容写入文本文件存储就好了。编写代码如下:

    # -*- coding:UTF-8 -*-
    from bs4 import BeautifulSoup
    import requests, sys
    
    """
    类说明:下载《笔趣看》网小说《一念永恒》
    Parameters:
        无
    Returns:
        无
    Modify:
        2017-09-13
    """
    class downloader(object):
    
        def __init__(self):
            self.server = 'http://www.biqukan.com/'
            self.target = 'http://www.biqukan.com/1_1094/'
            self.names = []            #存放章节名
            self.urls = []            #存放章节链接
            self.nums = 0            #章节数
    
        """
        函数说明:获取下载链接
        Parameters:
            无
        Returns:
            无
        Modify:
            2017-09-13
        """
        def get_download_url(self):
            req = requests.get(url = self.target)
            html = req.text
            div_bf = BeautifulSoup(html)
            div = div_bf.find_all('div', class_ = 'listmain')
            a_bf = BeautifulSoup(str(div[0]))
            a = a_bf.find_all('a')
            self.nums = len(a[15:])                                #剔除不必要的章节,并统计章节数
            for each in a[15:]:
                self.names.append(each.string)
                self.urls.append(self.server + each.get('href'))
    
        """
        函数说明:获取章节内容
        Parameters:
            target - 下载连接(string)
        Returns:
            texts - 章节内容(string)
        Modify:
            2017-09-13
        """
        def get_contents(self, target):
            req = requests.get(url = target)
            html = req.text
            bf = BeautifulSoup(html)
            texts = bf.find_all('div', class_ = 'showtxt')
            texts = texts[0].text.replace('\xa0'*8,'\n\n')
            return texts
    
        """
        函数说明:将爬取的文章内容写入文件
        Parameters:
            name - 章节名称(string)
            path - 当前路径下,小说保存名称(string)
            text - 章节内容(string)
        Returns:
            无
        Modify:
            2017-09-13
        """
        def writer(self, name, path, text):
            write_flag = True
            with open(path, 'a', encoding='utf-8') as f:
                f.write(name + '\n')
                f.writelines(text)
                f.write('\n\n')
    
    if __name__ == "__main__":
        dl = downloader()
        dl.get_download_url()
        print('《一年永恒》开始下载:')
        for i in range(dl.nums):
            dl.writer(dl.names[i], '一念永恒.txt', dl.get_contents(dl.urls[i]))
            sys.stdout.write("  已下载:%.3f%%" %  float(i/dl.nums) + '\r')
            sys.stdout.flush()
        print('《一年永恒》下载完成')
    

    很简单的程序,单进程跑,没有开进程池。下载速度略慢,喝杯茶休息休息吧。代码运行效果如下图所示:

    SouthEast

    2 优美壁纸下载

    ###(1)实战背景

    已经会爬取文字了,是不是感觉爬虫还是蛮好玩的呢?接下来,让我们进行一个进阶实战,了解一下反爬虫。

    URL:https://unsplash.com/

    SouthEast

    看一看这些优美的壁纸,这个网站的名字叫做Unsplash,免费高清壁纸分享网是一个坚持每天分享高清的摄影图片的站点,每天更新一张高质量的图片素材,全是生活中的景象作品,清新的生活气息图片可以作为桌面壁纸也可以应用于各种需要的环境。

    看到这么优美的图片,我的第一反应就是想收藏一些,作为知乎文章的题图再好不过了。每张图片我都很喜欢,批量下载吧,不多爬,就下载50张好了。

    ###(2)实战进阶

    我们已经知道了每个html标签都有各自的功能。<a>标签存放一下超链接,图片存放在哪个标签里呢?html规定,图片统统给我放到<img>标签中!既然这样,我们截取就Unsplash网站中的一个<img>标签,分析一下:

    <img alt="Snow-capped mountain slopes under blue sky" src="https://images.unsplash.com/photo-1428509774491-cfac96e12253?dpr=1&amp;auto=compress,format&amp;fit=crop&amp;w=360&amp;h=240&amp;q=80&amp;cs=tinysrgb&amp;crop=" class="cV68d" style="width: 220px; height: 147px;">
    

    可以看到,<img>标签有很多属性,有alt、src、class、style属性,其中src属性存放的就是我们需要的图片保存地址,我们根据这个地址就可以进行图片的下载。

    那么,让我们先捋一捋这个过程:

    • 使用requeusts获取整个网页的HTML信息;
    • 使用Beautiful Soup解析HTML信息,找到所有<img>标签,提取src属性,获取图片存放地址;
    • 根据图片存放地址,下载图片。

    我们信心满满地按照这个思路爬取Unsplash试一试,编写代码如下:

    # -*- coding:UTF-8 -*-
    import requests
    if __name__ == '__main__':
         target = 'https://unsplash.com/'
         req = requests.get(url=target)
         print(req.text)
    

    按照我们的设想,我们应该能找到很多<img>标签。但是我们发现,除了一些<script>标签和一些看不懂的代码之外,我们一无所获,一个<img>标签都没有!跟我们在网站审查元素的结果完全不一样,这是为什么?

    SouthEast

    **答案就是,这个网站的所有图片都是动态加载的!**网站有静态网站和动态网站之分,上一个实战爬取的网站是静态网站,而这个网站是动态网站,动态加载有一部分的目的就是为了反爬虫。

    对于什么是动态加载,你可以这样理解:我们知道化妆术学的好,贼厉害,可以改变一个人的容貌。相应的,动态加载用的好,也贼厉害,可以改变一个网站的容貌。

    动态网站使用动态加载常用的手段就是通过调用JavaScript来实现的。怎么实现JavaScript动态加载,我们不必深究,我们只要知道,动态加载的JavaScript脚本,就像化妆术需要用的化妆品,五花八门。有粉底、口红、睫毛膏等等,它们都有各自的用途。动态加载的JavaScript脚本也一样,一个动态加载的网站可能使用很多JavaScript脚本,我们只要找到负责动态加载图片的JavaScript脚本,不就找到我们需要的链接了吗?

    对于初学者,我们不必看懂JavaScript执行的内容是什么,做了哪些事情,因为我们有强大的抓包工具,它自然会帮我们分析。这个强大的抓包工具就是Fiddler:

    URL:http://www.telerik.com/fiddler

    PS:也可以使用浏览器自带的Networks,但是我更推荐这个软件,因为它操作起来更高效。

    安装方法很简单,傻瓜式安装,一直下一步即可,对于经常使用电脑的人来说,应该没有任何难度。

    这个软件的使用方法也很简单,打开软件,然后用浏览器打开我们的目标网站,以Unsplash为例,抓包结果如下:

    SouthEast

    我们可以看到,上图左侧红框处是我们的GET请求的地址,就是网站的URL,右下角是服务器返回的信息,我们可以看到,这些信息也是我们上一个程序获得的信息。这个不是我们需要的链接,我们继续往下看。

    SouthEast

    我们发现上图所示的就是一个JavaScript请求,看右下侧服务器返回的信息是一个json格式的数据。这里面,就有我们需要的内容。我们局部放大看一下:

    SouthEast

    这是Fiddler右侧的信息,上面是请求的Headers信息,包括这个Javascript的请求地 址:http://unsplash.com/napi/feeds/home,其他信息我们先不管,我们看看下面的内容。里面有很多图片的信息,包括图片的id,图片的大小,图片的链接,还有下一页的地址。这个脚本以json格式存储传输的数据,json格式是一种轻量级的数据交换格式,起到封装数据的作用,易于人阅读和编写,同时也易于机器解析和生成。这么多链接,可以看到图片的链接有很多,根据哪个链接下载图片呢?先别急,让我们继续分析:

    SouthEast

    在这个网站,我们可以按这个按钮进行图片下载。我们抓包分下下这个动作,看看发送了哪些请求。

    https://unsplash.com/photos/1PrQ2mHW-Fo/download?force=true
    https://unsplash.com/photos/JX7nDtafBcU/download?force=true
    https://unsplash.com/photos/HCVbP3zqX4k/download?force=true
    

    通过Fiddler抓包,我们发现,点击不同图片的下载按钮,GET请求的地址都是不同的。但是它们很有规律,就是中间有一段代码是不一样的,其他地方都一样。中间那段代码是不是很熟悉?没错,它就是我们之前抓包分析得到json数据中的照片的id。我们只要解析出每个照片的id,就可以获得图片下载的请求地址,然后根据这个请求地址,我们就可以下载图片了。那么,现在的首要任务就是解析json数据了。

    json格式的数据也是分层的。可以看到next_page里存放的是下一页的请求地址,很显然Unsplash下一页的内容,也是动态加载的。在photos下面的id里,存放着图片的id,这个就是我们需要获得的图片id号。

    怎么编程提取这些json数据呢?我们也是分步完成:

    • 获取整个json数据
    • 解析json数据

    编写代码,尝试获取json数据:

    # -*- coding:UTF-8 -*-
    import requests
    if __name__ == '__main__':
         target = 'http://unsplash.com/napi/feeds/home'
         req = requests.get(url=target) print(req.text)
    

    很遗憾,程序报错了,问题出在哪里?通过错误信息,我们可以看到SSL认证错误,SSL认证是指客户端到服务器端的认证。一个非常简单的解决这个认证错误的方法就是设置requests.get()方法的verify参数。这个参数默认设置为True,也就是执行认证。我们将其设置为False,绕过认证不就可以了?

    SouthEast

    有想法就要尝试,编写代码如下:

    # -*- coding:UTF-8 -*-
    import requests
    if __name__ == '__main__':
         target = 'http://unsplash.com/napi/feeds/home'
         req = requests.get(url=target, verify=False)
         print(req.text)
    

    认证问题解决了,又有新问题了:

    SouthEast

    可以看到,我们GET请求又失败了,这是为什么?这个网站反爬虫的手段除了动态加载,还有一个反爬虫手段,那就是验证Request Headers。接下来,让我们分析下这个Requests Headers:

    SouthEast

    我截取了Fiddler的抓包信息,可以看到Requests Headers里又很多参数,有Accept、Accept-Encoding、Accept-Language、DPR、User-Agent、Viewport-Width、accept-version、Referer、x-unsplash-client、authorization、Connection、Host。它们都是什么意思呢?

    专业的解释能说的太多,我挑重点:

    • User-Agent:这里面存放浏览器的信息。可以看到上图的参数值,它表示我是通过Windows的Chrome浏览器,访问的这个服务器。如果我们不设置这个参数,用Python程序直接发送GET请求,服务器接受到的User-Agent信息就会是一个包含python字样的User-Agent。如果后台设计者验证这个User-Agent参数是否合法,不让带Python字样的User-Agent访问,这样就起到了反爬虫的作用。这是一个最简单的,最常用的反爬虫手段。

    • Referer:这个参数也可以用于反爬虫,它表示这个请求是从哪发出的。可以看到我们通过浏览器访问网站,这个请求是从https://unsplash.com/,这个地址发出的。如果后台设计者,验证这个参数,对于不是从这个地址跳转过来的请求一律禁止访问,这样就也起到了反爬虫的作用。

    • authorization:这个参数是基于AAA模型中的身份验证信息允许访问一种资源的行为。在我们用浏览器访问的时候,服务器会为访问者分配这个用户ID。如果后台设计者,验证这个参数,对于没有用户ID的请求一律禁止访问,这样就又起到了反爬虫的作用。

    Unsplash是根据哪个参数反爬虫的呢?根据我的测试,是authorization。我们只要通过程序手动添加这个参数,然后再发送GET请求,就可以顺利访问了。怎么什么设置呢?还是requests.get()方法,我们只需要添加headers参数即可。编写代码如下:

    # -*- coding:UTF-8 -*-
    import requests
    if __name__ == '__main__':
         target = 'http://unsplash.com/napi/feeds/home'
         headers = {'authorization':'your Client-ID'}
         req = requests.get(url=target, headers=headers, verify=False)
         print(req.text)
    

    headers参数值是通过字典传入的。记得将上述代码中your Client-ID换成诸位自己抓包获得的信息。代码运行结果如下:

    SouthEast

    皇天不负有心人,可以看到我们已经顺利获得json数据了,里面有next_page和照片的id。接下来就是解析json数据。根据我们之前分析可知,next_page放在了json数据的最外侧,照片的id放在了photos->id里。我们使用json.load()方法解析数据,编写代码如下:

    # -*- coding:UTF-8 -*-
    import requests, json
    if __name__ == '__main__':
         target = 'http://unsplash.com/napi/feeds/home'
         headers = {'authorization':'your Client-ID'}
         req = requests.get(url=target, headers=headers, verify=False)
         html = json.loads(req.text)
         next_page = html['next_page']
         print('下一页地址:',next_page)
         for each in html['photos']:
              print('图片ID:',each['id'])
    

    解析json数据很简单,跟字典操作一样,就是字典套字典。json.load()里面的参数是原始的json格式的数据。程序运行结果如下:

    SouthEast

    图片的ID已经获得了,再通过字符串处理一下,就生成了我们需要的图片下载请求地址。根据这个地址,我们就可以下载图片了。下载方式,使用直接写入文件的方法。

    ###(3)整合代码

    每次获取链接加一个1s延时,因为人在浏览页面的时候,翻页的动作不可能太快。我们要让我们的爬虫尽量友好一些。

    # -*- coding:UTF-8 -*-
    import requests, json, time, sys
    from contextlib import closing
    
    class get_photos(object):
    
        def __init__(self):
            self.photos_id = []
            self.download_server = 'https://unsplash.com/photos/xxx/download?force=trues'
            self.target = 'http://unsplash.com/napi/feeds/home'
            self.headers = {'authorization':'Client-ID c94869b36aa272dd62dfaeefed769d4115fb3189a9d1ec88ed457207747be626'}
    
        """
        函数说明:获取图片ID
        Parameters:
            无
        Returns:
            无
        Modify:
            2017-09-13
        """   
        def get_ids(self):
            req = requests.get(url=self.target, headers=self.headers, verify=False)
            html = json.loads(req.text)
            next_page = html['next_page']
            for each in html['photos']:
                self.photos_id.append(each['id'])
            time.sleep(1)
            for i in range(5):
                req = requests.get(url=next_page, headers=self.headers, verify=False)
                html = json.loads(req.text)
                next_page = html['next_page']
                for each in html['photos']:
                    self.photos_id.append(each['id'])
                time.sleep(1)
    
    
        """
        函数说明:图片下载
        Parameters:
            无
        Returns:
            无
        Modify:
            2017-09-13
        """   
        def download(self, photo_id, filename):
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
            target = self.download_server.replace('xxx', photo_id)
            with closing(requests.get(url=target, stream=True, verify = False, headers = self.headers)) as r:
                with open('%d.jpg' % filename, 'ab+') as f:
                    for chunk in r.iter_content(chunk_size = 1024):
                        if chunk:
                            f.write(chunk)
                            f.flush()
    
    if __name__ == '__main__':
        gp = get_photos()
        print('获取图片连接中:')
        gp.get_ids()
        print('图片下载中:')
        for i in range(len(gp.photos_id)):
            print('  正在下载第%d张图片' % (i+1))
            gp.download(gp.photos_id[i], (i+1))
    

    下载速度还行,有的图片下载慢是因为图片太大。可以看到右侧也打印了一些警报信息,这是因为我们没有进行SSL验证。

    SouthEast

    学会了爬取图片,简单的动态加载的网站也难不倒你了。赶快试试国内的一些图片网站吧!

    3 视频下载

    视频下载教程,请到这里查看:

    https://cuijiahua.com/blog/2017/10/spider_tutorial_1.html

    四 总结

    • 本次Chat讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途!
    • 爬虫时效性低,同样的思路过了一个月,甚至一周可能无法使用,但是爬取思路都是如此,完全可以自行分析。
    • 本次实战代码,均已上传我的Github,欢迎Follow、Star:https://github.com/Jack-Cherish/python-spider
    • 如有问题,请留言。如有错误,还望指正,谢谢!
    展开全文
  • 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的 通用网络爬虫 通用网络爬虫又称...

    爬虫分类

    网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的



    通用网络爬虫

    通用网络爬虫又称全网爬虫(Scalable Web Crawler)爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。

    这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。

    简单的说就是互联网上抓取所有数据。


    ​​​​​​​聚焦网络爬虫

    聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。

    和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求 。

    简单的说就是互联网上只抓取某一种数据。


    ​​​​​​​增量式网络爬虫

    增量式网络爬虫(Incremental Web Crawler)是 指 对 已 下 载 网 页 采 取 增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。

    和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面 ,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。

    简单的说就是互联网上只抓取刚刚更新的数据。


    ​​​​​​​Deep Web 爬虫

    Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。

    表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。

    Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。

     

    展开全文
  • 150讲轻松搞定Python网络爬虫

    万人学习 2019-05-16 15:30:54
    网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 ...
  • Java 网络爬虫基础入门

    万次阅读 多人点赞 2018-07-13 04:54:00
    课程介绍 大数据环境下,数据分析已由业务驱动转变为数据驱动,网络数据...作为网络爬虫的入门教程,本达人课采用 Java 开发语言,内容涵盖了网络爬虫的原理以及开发逻辑,Java 网络爬虫基础知识,网络抓包介绍,...

    课程介绍

    大数据环境下,数据分析已由业务驱动转变为数据驱动,网络数据资源呈指数级增长,且散落在不同的数据源之中。对大多数企业和研究者而言,用“数据说话”仿佛成了大数据时代的重要武器。网络爬虫作为网络数据获取的重要技术,受到了越来越多数据需求者的青睐和追捧。

    作为网络爬虫的入门教程,本达人课采用 Java 开发语言,内容涵盖了网络爬虫的原理以及开发逻辑,Java 网络爬虫基础知识,网络抓包介绍,jsoup 的介绍与使用,HttpClient 的介绍与使用等内容。本课程在介绍网络爬虫基本原理的同时,注重具体的代码实现,加深读者对爬虫的理解,加强读者的实战能力。

    本达人课共计14课,主要包含五大部分。

    第一部分(第01-03课),主要介绍网络爬虫的原理、开发逻辑以及 Java 网络爬虫基础知识,网络抓包等内容。

    第二部分(第04-06课),主要介绍现有的一些页面内容获取及页面解析工具。包括 jsoup、HttpClient、URLConnection。

    第三部分(第07-08课),针对已获得的页面内容,带大家选择合适的解析工具进行页面解析,包括 HTML、XML、JSON 主流数据格式的解析。

    第四部分(第09-11课),针对已解析的内容,介绍如何封装数据并存储数据。包括通过 MySQL 数据库存储数据,以及文本文件存储和 Excel 格式存储。

    第五部分(第12-14课),以典型网站为案例,开启实战演练。

    作者介绍

    钱洋,机器学习方向博士生,CSDN 博客专家,主要从事文本挖掘方面的研究。目前,正参与几个大数据相关项目的研究工作。乐于分享自己的经验,擅长撰写技术类博客。

    课程内容

    第01课:网络爬虫原理

    引言

    随着互联网的迅速发展,网络资源越来越丰富,信息需求者如何从网络中抽取信息变得至关重要。目前,有效的获取网络数据资源的重要方式,便是网络爬虫技术。简单的理解,比如您对百度贴吧的一个帖子内容特别感兴趣,而帖子的回复却有1000多页,这时采用逐条复制的方法便不可行。而采用网络爬虫便可以很轻松地采集到该帖子下的所有内容。

    网络爬虫技术最广泛的应用是在搜索引擎中,如百度、Google、Bing 等,它完成了搜索过程中的最关键的步骤,即网页内容的抓取。下图为简单搜索引擎原理图。

    这里写图片描述

    网络爬虫的作用,我总结为以下几点:

    • 舆情分析:企业或政府利用爬取的数据,采用数据挖掘的相关方法,发掘用户讨论的内容、实行事件监测、舆情引导等。
    • 企业的用户分析:企业利用网络爬虫,采集用户对其企业或商品的看法、观点以及态度,进而分析用户的需求、自身产品的优劣势、顾客抱怨等。
    • 科研工作者的必备技术:现有很多研究都以网络大数据为基础,而采集网络大数据的必备技术便是网络爬虫。利用网络爬虫技术采集的数据可用于研究产品个性化推荐、文本挖掘、用户行为模式挖掘等。

    网络爬虫涉及的领域包括:

    这里写图片描述

    网络爬虫的基本概念

    网络爬虫(Web Crawler),又称为网络蜘蛛(Web Spider)或 Web 信息采集器,是一种按照一定规则,自动抓取或下载网络信息的计算机程序或自动化脚本,是目前搜索引擎的重要组成部分。

    • 狭义上理解:利用标准的 HTTP 协议,根据网络超链接(如https://www.baidu.com/)和 Web 文档检索的方法(如深度优先)遍历万维网信息空间的软件程序。

    • 功能上理解:确定待爬的 URL 队列,获取每个 URL 对应的网页内容(如 HTML/JSON),解析网页内容,并存储对应的数据。

    网络爬虫的分类

    网络爬虫按照系统架构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

    • 通用网络爬虫:爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据

      通用网络爬虫的爬取范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求较低,通常采用并行工作方式,有较强的应用价值。

    • 聚焦网络爬虫,又称为主题网络爬虫:是指选择性地爬行那些与预先定义好的主题相关的页面。

      和通用爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,可以很好地满足一些特定人群对特定领域信息的需求。

      通常在设计聚焦网络爬虫时,需要加入链接和内容筛选模块。一个常见的案例是基于关键字获取符合用户需求的数据,如下图所示:

      这里写图片描述

    • 增量网络爬虫:对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面,历史已经采集过的页面不重复采集。

      增量网络爬虫避免了重复采集数据,可以减小时间和空间上的耗费。通常在设计网络爬虫时,需要在数据库中,加入时间戳,基于时间戳上的先后,判断程序是否继续执行。

      常见的案例有:论坛帖子评论数据的采集(如下图所示论坛的帖子,它包含400多页,每次启动爬虫时,只需爬取最近几天用户所发的帖子);天气数据的采集;新闻数据的采集;股票数据的采集等。

      这里写图片描述

    • Deep Web 爬虫:指大部分内容不能通过静态链接获取,只有用户提交一些表单信息才能获取的 Web 页面。例如,需要模拟登陆的网络爬虫便属于这类网络爬虫。另外,还有一些需要用户提交关键词才能获取的内容,如京东淘宝提交关键字、价格区间获取产品的相关信息。

      这里写图片描述

    网络爬虫的流程

    网络爬虫基本流程可用下图描述:

    这里写图片描述

    具体流程为:

    1. 需求者选取一部分种子 URL(或初始 URL),将其放入待爬取的队列中。如在 Java 网络爬虫中,可以放入 LinkedList 或 List 中。
    2. 判断 URL 队列是否为空,如果为空则结束程序的执行,否则执行第三步骤。
    3. 从待爬取的 URL 队列中取出待爬的一个 URL,获取 URL 对应的网页内容。在此步骤需要使用响应的状态码(如200,403等)判断是否获取数据,如响应成功则执行解析操作;如响应不成功,则将其重新放入待爬取队列(注意这里需要移除无效 URL)。
    4. 针对已经响应成功后获取到的数据,执行页面解析操作。此步骤根据用户需求获取网页内容里的部分数据,如汽车论坛帖子的标题、发表的时间等。
    5. 针对3步骤已解析的数据,将其进行存储。

    网络爬虫的爬行策略

    一般的网络爬虫的爬行策略分为两种:深度优先搜索(Depth-First Search)策略、广度优先搜索(Breadth-First Search)策略

    • 深度优先搜索策略:从根节点的 URL 开始,根据优先级向下遍历该根节点对应的子节点。当访问到某一子节点 URL 时,以该子节点为入口,继续向下层遍历,直到没有新的子节点可以继续访问为止。接着使用回溯的方法,找到没有被访问到的节点,以类似的方式进行搜索。下图给出了理解深度优先搜索的一个简单案例:

      这里写图片描述

    • 广度优先搜索策略:也称为宽度优先,是另外一种非常有效的搜索技术,这种方法按照层进行遍历页面。下图可帮助理解广度优先搜索的遍历方式:

      这里写图片描述

    基于广度优先的爬虫是最简单的爬取网站页面的方法,也是目前使用较为广泛的方法。在本达人课中,所讲的案例皆为宽度优先式的爬虫。

    学习建议

    网络爬虫是入门某一门编程语言的实战技术:很多学习编程语言(如 Java、Python 或 C++ 等)的同学,采用的方式只看书或在网络上看一些视频,而这将导致的后果就是面对一个具体项目时,不知道如何上手,尤其对新手而言。或者,一段时间后,就将之前的书本内容或视频内容遗忘了。

    为此,我建议这些学习者可采用网络爬虫技术入门某一门编程语言(如 Java、Python)。因为爬虫技术是个综合性很强的技术,涉及到编程语言的很多方面。本达人课特别选用了 Java 作为开发语言,将带大家深入了解 Java 网络爬虫背后的核心技术。学完该课程,相信您也已很好地入门 Java 编程语言。

    对于零基础入门 Java 网络爬虫的同学,在学习过程中请注意以下几点:

    • 理解爬虫的基本原理。
    • 学习 Java 网络爬虫涉及的基础知识:基础不牢,地动山摇,学习和掌握网络爬虫的基础知识很重要。
    • 吃透基本的爬虫代码,并在此基础上进行改写。
    • 不断实战,发现爬虫中涉及的新问题,并解决问题。

    最后,提供一些书籍和资料,给入门以及想深入学习 Java 网络爬虫的读者:

    1. 《Java面向对象程序设计》(耿祥义、张跃平编著),由清华大学出版社出版,这是大学的教材,可作为基础学习。
    2. 《Java核心技术》全2册。
    3. 《Effective Java (3rd Edition)》:目前英文版已是第三版,中文版还在第二版,该书是 Java 进阶必备之书,英文比较好的同学可直接看英文版。
    4. 《自己动手写网络爬虫》(罗刚编著),国内第一本专门讲解 Java 网络爬虫的书籍。

    参考文献

    1. 周立柱,林玲.聚焦爬虫技术研究综述[J].计算机应用,2005(09):1965-1969.
    2. 段平.面向web文本挖掘的主题搜索技术研究[D].西安电子科技大学,2008.
    3. 孙立伟, 何国辉, 吴礼发. 网络爬虫技术的研究[J]. 电脑知识与技术, 2010 (15): 4112-4115.
    第02课:Java 网络爬虫基础知识

    引言

    Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 Apache Hadoop 数据结构为依托,提供了良好的批处理支持。

    Java 网络爬虫涉及到 Java 的很多知识。本篇中将会介绍网络爬虫中需要了解的 Java 知识以及这些知识主要用于网络爬虫的哪一部分,具体包括以下内容:

    • Maven 的使用;
    • log4j 的使用;
    • 对象的创建;
    • 集合的使用;
    • 正则表达式的使用;
    • HTTP 状态码;
    • 其他。

    Maven 的使用

    Maven 是什么

    Maven 是由 Apache 软件基金会所提供一款工具,用于项目管理及自动构建。我们知道在构建一个 Java 工程时,需要使用到很多 Jar 包,例如操作数据库需要使用到 mysql-connector-java 以及其相关依赖的 Jar 包。而 Maven 工具便可以很方便的对我们在项目中使用到的开源 Jar 包,进行很好的管理,比如下载某 Java 工程需要的 Jar 包及相关依赖 Java 包。

    Maven 如何使用

    Maven 使用项目对象模型(Project Object Model,POM)来配置,项目对象模型存储在名为 pom.xml 的文件中。以 Java 为例,我们可以在 Eclipse 中创建一个 Maven 工程。其中,Maven Dependencies 便存放着由 Maven 管理的 Jar 包。

    这里写图片描述

    正如前面所说,构建一个 Java 工程需要使用很多 Jar 包,比如,在 Java 网络爬虫中,我们需要用到数据库连接、请求网页内容、解析网页内容的相关 Jar 包时,我们可以在上图所示的 pom 文件中添加如下语句:

    <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.35</version></dependency><dependency>    <groupId>org.jsoup</groupId>    <artifactId>jsoup</artifactId>    <version>  1.8.2</version></dependency><dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpclient </artifactId>    <version>  4.2.3</version></dependency>

    之后,我们会惊讶地发现,工程的 Maven Dependencies 中自动下载了相关 Jar 包以及其依赖的 Jar 包。

    这里写图片描述

    读者可以在 Maven Repository 网站中检索自己想要的 Jar 包,以及 Maven 操作语句。

    这里写图片描述

    log4j 的使用

    log4j 是什么

    log4j 是一个基于 Java 的日志记录工具,曾是 Apache 软件基金会的一个项目。目前,日志是应用软件中不可或缺的部分。

    log4j 怎么使用

    1. 使用 Maven 下载 log4j 的 Jar 包,代码如下:

    <dependency>    <groupId>log4j</groupId>    <artifactId>log4j</artifactId>    <version>1.2.17</version></dependency>

    2. 在 src 目录下创建 log4j.properties 文本文件,并做相关配置(关于每个配置的具体含义,读者可参考博文 《详细的 Log4j 使用教程》):

     ### 设置###log4j.rootLogger = debug,stdout,D,E### 输出信息到控制抬 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志到=error.log ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = E://logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 输出ERROR 级别以上的日志到=error.log ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =E://logs/error.log log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    3. 实例程序,如下所示:

    package log4j;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class Test {    static final Log logger = LogFactory.getLog(Test.class);    public static void main(String[] args) {        System.out.println("hello");        logger.info("hello world");        logger.debug("This is debug message.");         logger.warn("This is warn message.");        logger.error("This is error message.");      }}

    基于此程序,我们就可以看到在我们工程的根目录下会产生一个日志文件 error.log 和 log.log。

    这里写图片描述

    在网络爬虫中,我们可以使用日志记录程序可能出错的地方,监控程序的运行状态。

    对象的创建

    在 Java 中,经常使用 new 关键字来创建一个对象。例如,在爬取京东商品的id、product_name(商品名称)、price(价格)时,我们需要将每个商品的信息封装到对象里。

    JdInfoModel jingdongproduct = new JdInfoModel();

    在爬虫中,我们要操作 JdInfoModel 类中的变量(即id、product_name、price),可以使用 private 变量定义的方式。并且,使用 set() 与 get() 方法对数据进行设置(爬取数据的封装)和获取使用(爬取数据的存储)。下面的代码为 JdInfoModel 类:

    package model;public class JdInfoModel {    private int id;    private String product_name;    private double price;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getProduct_name() {        return product_name;    }    public void setProduct_name(String product_name) {        this.product_name = product_name;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    } }

    集合的使用

    网络爬虫离不开对集合的操作,这里涉及到 List、Set、Queue、Map 等集合的操作。

    List 和 Set 集合的使用

    List 的特征是其元素以线性方式存储,集合中可以存放重复对象。对比而言,Set 集合中的对象不按特定的方式排序,并且没有重复对象。在网络爬虫中,可以使用 List<String> 存储待爬的 URL 列表。例如:

    //List集合的创建List<String> urllist = new ArrayList<String>();urllist.add("https://movie.douban.com/subject/27608425");urllist.add("https://movie.douban.com/subject/26968024");//第一种遍历方式for( String url : urllist ){    System.out.println(url);}//第二种遍历方式for( int i=0; i<urllist.size(); i++ ){    System.out.println(i+":"+urllist.get(i));}//第三种遍历方式Iterator<String> it = urllist.iterator();while ( it.hasNext() ){    System.out.println(it.next());}

    同时我们也可以使用上面 List<JdInfoModel> 来封装具体的实例,即爬虫所采集到的数据。Set 集合的使用与 List 集合类似,这里就不过多讲解了。

    Map 的使用

    Map 是一种把键对象和值对象进行映射的集合,它的每一个元素都包含一对键对象和值对象,其中键对象不可以重复。Map 不仅在网络爬虫中常用,也常在文本挖掘算法的编写中使用。在网络爬虫中,可以使用 Map 过滤一些重复数据,但并建议使用 Map 对大规模数据去重过滤,原因是 Map 有空间大小的限制。比如,使用网络爬虫爬取帖子时,可能遇到置顶帖,而置顶帖可能会与下面的帖子重复出现。以下程序为 Map 的使用案例:

     //Map的创建Map<String,Integer> map = new HashMap<String,Integer>();//值的添加,这里假设是爬虫中的产品id以及每个产品id对应的销售量map.put("jd1515", 100);map.put("jd1516", 300);map.put("jd1515", 100);map.put("jd1517", 200);map.put("jd1518", 100);//第一种方法遍历for (String key : map.keySet()) {      Integer value = map.get(key);      System.out.println("Key = " + key + ", Value = " + value);  }  //第二种方法遍历Iterator<Entry<String, Integer>> entries = map.entrySet().iterator();  while (entries.hasNext()) {      Entry<String, Integer> entry = entries.next();      System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());  }  //第三种方法遍历for (Entry<String, Integer> entry : map.entrySet()) {      System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());  }  

    Queue 的使用

    队列(Queue)使用链表结构存储数据,是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList 类实现了 Queue 接口,因此我们可以把 LinkedList 当成 Queue 来用。Queue 常用来存待爬 URL 队列。

    Queue<String> queue = new LinkedList<String>();//添加元素queue.offer("https://www.douban.com/people/46077896/likes/topic/");queue.offer("https://www.douban.com/people/1475408/likes/topic");queue.offer("https://www.douban.com/people/3853295/likes/topic/");boolean t = true;while (t) {    //如果Url队列为空,停止执行程序,否则请求Url    if( queue.isEmpty() ){        t = false;    }else {        //请求的url        String url = queue.poll();        System.out.println(url);        //这里要写请求数据,获取相应状态码,如果状态码为200,则解析数据;如果为404,url移除队列;否则该url重新如列    }

    正则表达式的使用

    正则表达式,是在解析数据(HTML 或 JSON 等)时,常用的方法。举个列子,我想从下面的语句中提取用户的 id(75975500):

    <a href="//i.autohome.com.cn/75975500" target="_blank" class="linkblack">尊少来自沈阳</a>

    后面,我会介绍解析工具 jsoup,其可以解析获得“//i.autohome.com.cn/75975500”。接着,便可以使用正则表达式提取 75975500。

    String url = "//i.autohome.com.cn/75975500";String user_id = url.replaceAll("\\D", "");  //取代所有的非数字字符System.out.println(user_id);  //输出的结果即为75975500

    如下表所示,是 Java 中一些常用的基本正则表达式。

    正则表达式写法含义
    \d代表0-9的任意数字
    \D代表任何非数字字符
    \s代表空格类字符
    \S代表非空格类字符
    \p{Lower}代表小写字母[a-z]
    \p{Upper}代表大写字母[A-Z]
    \p{Alpha}代表字母
    \p{Blank}代表空格或制表符

    HTTP 状态码

    当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(Server Header)用以响应浏览器的请求。在网络爬虫向后台请求一个 URL 地址时,便会返回状态码,该状态码中包含丰富的信息。例如,200表示请求成功,成功获取到了后台传的数据(HTML 或 JSON 等);301资源(网页等)被永久转移到其它 URL;404请求的资源(网页等)不存在等。以下是 HTTP 状态码的分类。

    分类描述
    1**信息,服务器收到请求,需要请求者继续执行操作。
    2**成功,操作被成功接收并处理。
    3**重定向,需要进一步的操作以完成请求。
    4**客户端错误,请求包含语法错误或无法完成请求。
    5**服务器错误,服务器在处理请求的过程中发生了错误。

    详细的 HTTP 状态码列表,读者可以参考这个地址

    其他

    另外,网络爬虫还涉及到其他方面的 Java 知识,比如说Java 输入输出流、Java 操作数据库、Java 多线程操作、Java 对日期的处理、Java 中的接口与继承。所以,以网络爬虫,入门 Java 编程是非常好的方式。在后面的课程中,我会介绍网络爬虫如何使用这些技术。

    参考内容

    1. 最详细的 Log4j 使用教程
    2. HTTP 状态码
    第03课:数据是如何请求的(网络抓包)
    第04课:网页内容获取工具 jsoup
    第05课:网页内容获取工具 HttpClient
    第06课:网页内容获取工具 URLConnection
    第07课:HTML 和 XML 数据的分析与解析
    第08课:JSON 数据的分析与解析
    第09课:数据存储方式之 MySQL
    第10课:数据存储方式之 TXT 文本
    第11课:数据存储方式之 Excel
    第12课:网络爬虫实战项目(一)
    第13课:网络爬虫实战项目(二)
    第14课:网络爬虫实战项目(三)

    阅读全文: http://gitbook.cn/gitchat/column/5b39d79c38f746186a4ecb91

    展开全文
  • 网络爬虫初识:网络爬虫概述

    千次阅读 2017-07-24 12:41:54
    网络爬虫初识:网络爬虫概述一、网络爬虫是什么简单来说,网络爬虫就是自动从互联网中定向或不定向地采集信息的一种程序。网络爬虫有许多类型,常见的有:通用网络爬虫、聚焦网络爬虫等。二、网络爬虫能干什么网络...
  • Python 网络爬虫入门详解

    万次阅读 多人点赞 2018-01-28 21:01:42
    什么是网络爬虫    网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序。众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容。 优先申明:...
  • 网络爬虫本质 其中,数据的抽取、转换、存储,即Data ETL(Extract,Transformation,Loading) 网络爬虫架构
  • 所以,在真正开始了解网络爬虫之前,我们也需要先了解一下网络爬虫的特性、带来的问题以及开发和使用网络爬虫的过程中需要遵循的规范。 网络爬虫的尺寸分类 尺寸 特性 目的 实现方式 小规模 数据量较小,...
  • Python网络爬虫基础篇

    万人学习 2018-06-28 18:18:12
    本课程主要给大家分享基于Python语言的网络爬虫基础篇体验,其中讲解爬虫原理介绍,urllib和requests爬虫库的使用,以及网络爬虫中的数据分析与信息提取。通过模拟Web的GET和POST请求来爬取数据,介绍如何应对各种...
  • 网络爬虫原理

    万次阅读 多人点赞 2016-08-13 19:20:18
    目录1网络爬虫原理 2写网络爬虫的原因 3网络爬虫的流程 4网络抓包 5HTTP状态码说明 6Java网络爬虫需要的基础知识 1、网络爬虫原理网络爬虫指按照一定的规则(模拟人工登录网页的方式),自动抓取网络上...
  • 精通Scrapy网络爬虫

    2018-01-16 18:06:22
    本套视频课程的讲师刘硕是清华大学出版社出版的《精通Scrapy网络爬虫》的作者,该视频课程为此书的配套课程, 在书中内容的基础上增加、修改了部分实战案例。《精通Scrapy网络爬虫》以应用为出发点,详细深入地介绍...
  • 什么是网络爬虫网络爬虫(又称为网页蜘蛛、网络机器人,在FOAF社区中间,更经常被称为网页追逐者),是一种按照一定规则,自动的抓取万维网信息的程序或者脚本,已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取...
  • 浅谈网络爬虫

    千次阅读 多人点赞 2019-06-11 21:58:11
    浅谈网络爬虫 什么是网络爬虫? 爬虫能干什么 搜索引擎 抢票、刷票等自动化软件 部分破解软件 金融等行业数据挖掘、分析数据来源 其他 爬虫很简单 语言的选择 两种语言的小demo 爬虫也不简单 ip、浏览器头(User-...
  • Java 网络爬虫,就是这么的简单

    万次阅读 多人点赞 2019-10-08 08:52:43
    这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识。第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑列表新闻的新闻标题和...
  • 150讲轻松搞定Python网络爬虫
  • 介绍网络爬虫的课时安排,以及简单介绍当前课程在大数据课程中的重要性。 1.1.2视频详情 1.1.3总结与补充 无 1.1.4课堂提问与练习 无 1.1.5习题答案 无 1.1网络爬虫是什么1.2.1知识概述 以上数据...
  • 网络爬虫通过统一资源定位符URL 来查找目标网页,将用户所关注的数据内容直接返回给用户,并不需要用户以浏览网页的形式去获取信息,为用户节省了时间和精力,并提高了数据采集的准确度,使用户在海量数据中游刃有余...
  • 理解网络爬虫

    2019-10-21 10:36:43
    文章目录爬虫的定义爬虫的类型爬虫的原理通用网络爬虫的实现原理聚焦网络爬虫的实现原理爬虫的搜索策略深度优先搜索宽度优先搜索最佳优先搜索反爬虫技术及解决方案 爬虫的定义 网络爬虫时一种按照一定的规则自动地...
  • 一、网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字。 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。 网络蜘蛛是通过网页的链接地址来寻找网页的。 从网站某一个页面(通常是首页)...
  • 第四章 网络爬虫之Scrapy框架 ● Scrapy爬虫框架 Scrapy爬虫框架介绍 Scrapy爬虫框架解析 requests库和Scrapy爬虫比较 Scrapy爬虫常用命令 ● Scrapy爬虫基本使用 ● Scrapy爬虫实例 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,042
精华内容 16,416
关键字:

网络爬虫

爬虫 订阅