GVKun编程网logo

网络爬虫(Spider)(网络爬虫spider)

25

本文将分享网络爬虫的详细内容,并且还将对Spider进行详尽解释,此外,我们还将为大家带来关于java实现网络爬虫(网络搜索引擎的使用)、Python爬虫(七):pyspider使用、python网络

本文将分享网络爬虫的详细内容,并且还将对Spider进行详尽解释,此外,我们还将为大家带来关于java实现网络爬虫(网络搜索引擎的使用)、Python 爬虫(七):pyspider 使用、python 网络爬虫(14)使用 Scrapy 搭建爬虫框架、Python 网络爬虫(3):开源爬虫框架对比的相关知识,希望对你有所帮助。

本文目录一览:

网络爬虫(Spider)(网络爬虫spider)

网络爬虫(Spider)(网络爬虫spider)

网络爬虫(又被称为网页蜘蛛,网络机器人,查找引擎蜘蛛,在FOAF社区中心,更常常的称为网页追逐者),是一种依照必定的规矩,主动的抓取万维网信息的程序或许脚本,别的一些不常运用的姓名还有蚂蚁,主动索引,模拟程序或许蠕虫

java实现网络爬虫(网络搜索引擎的使用)

java实现网络爬虫(网络搜索引擎的使用)

利于搜索引擎抓取的网站框架有哪些

很多网站在上线初期,就会对网站整体框架以及后期如何对网站进行维护优化做好了规划,网站的后期维护是一件长远的工作,但是网站整体框架结构是需要尽早完成的,网站上必须要拥有哪些框架才符合搜索引擎的抓取呢?

1.网站导航栏

导航栏,可以清楚的让用户选择想要进入的栏目,浏览的内容。从另一方面来讲,网站导航栏可以很好的将网站首页与栏目相互连接起来,增加网站页面之间的相关性,增加链接入口。

2.轮播图

轮播图的作用非常强大,主要有两个作用,一个是促进转化率,另一个是促进页面收录,只需要简单的对轮播图进行alt设置,与网站核心关键词相匹配,便可以很好的产生价值,也可以为营销活动、专题页面、新产品及新服务等提供入口。

3.文章动态更新版块

网站首页有新闻动态更新板块,并经常持续的更新,才会让搜索引擎认为这个是一个活着的网站,有新鲜的内容,以供搜索引擎抓取,供用户观看。

4.友情链接板块

友情链接的作用一个是可以作为一个很好的外链,为自己来带其它网站过来的蜘蛛进行抓取,另一方面可以添加一些高权重的友情链接,带动自己网站关键词的整体排名。

java实现网络爬虫(网络搜索引擎的使用)

推荐一款基于 Java 的开源网络爬虫框架

真正的大师,永远都怀着一颗学徒的心!

喜欢爬虫二开的同学们看过来,这里介绍了一款适合二次开发的java开源爬虫框架。几行代码,你就可以做出来一个强大的爬虫。

本项目支持分布式爬取,入门也比较简单。文档很齐全,无需担心任何风险。

文档可以教你爬取CSDN博客,爬取搜索引擎,爬取新浪微博,爬取微信公众号,图片爬取,获取当前抓取深度,爬取Javascript加载的数据。

我们学习爬虫是为了应用而生的,为了生活而去爬的,切记不要触及法律边缘。学会,但是不要学废了。

上图

java实现网络爬虫(网络搜索引擎的使用)

框架

java实现网络爬虫(网络搜索引擎的使用)

教程

java实现网络爬虫(网络搜索引擎的使用)

版本特性

java实现网络爬虫(网络搜索引擎的使用)

Python 爬虫(七):pyspider 使用

Python 爬虫(七):pyspider 使用

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

1 简介

pyspider 是一个支持任务监控、项目管理、多种数据库,具有 WebUI 的爬虫框架,它采用 Python 语言编写,分布式架构。详细特性如下:

  • 拥有 Web 脚本编辑界面,任务监控器,项目管理器和结构查看器;

  • 数据库支持 MysqL、MongoDB、Redis、sqlite、Elasticsearch、Postgresql、sqlAlchemy;

  • 队列服务支持 RabbitMQ、Beanstalk、Redis、Kombu;

  • 支持抓取 JavaScript 的页面;

  • 组件可替换,支持单机、分布式部署,支持 Docker 部署;

  • 强大的调度控制,支持超时重爬及优先级设置;

  • 支持 Python2&3。

pyspider 主要分为 Scheduler(调度器)、 Fetcher(抓取器)、 Processer(处理器)三个部分,整个爬取过程受到 Monitor(监控器)的监控,抓取的结果被 Result Worker(结果处理器)处理。基本流程为:Scheduler 发起任务调度,Fetcher 抓取网页内容,Processer 解析网页内容,再将新生成的 Request 发给 Scheduler 进行调度,将生成的提取结果输出保存。

2 pyspider vs scrapy

  • pyspider 拥有 WebUI,爬虫的编写、调试可在 WebUI 中进行;Scrapy 采用采用代码、命令行操作,实现可视化需对接 Portia。

  • pyspider 支持使用 PhantomJS 对 JavaScript 渲染页面的采集 ;Scrapy 需对接 Scrapy-Splash 组件。

  • pyspider 内置了 PyQuery(Python 爬虫(五):PyQuery 框架) 作为选择器;Scrapy 对接了 XPath、CSS 选择器、正则匹配。

  • pyspider 扩展性弱;Scrapy 模块之间耦合度低,扩展性强,如:对接 Middleware、 Pipeline 等组件实现更强功能。

总的来说,pyspider 更加便捷,Scrapy 扩展性更强,如果要快速实现爬取优选 pyspider,如果爬取规模较大、反爬机制较强,优选 scrapy。

3 安装

方式一

pip install pyspider

这种方式比较简单,不过在 Windows 系统上可能会出现错误:Command "python setup.py egg_info" Failed with error ...,我在自己的 Windows 系统上安装时就遇到了该问题,因此,选择了下面第二种方式进行了安装。

方式二

使用 wheel 方式安装。步骤如下:

  • pip install wheel 安装 wheel;
  • 打开网址 https://www.lfd.uci.edu/~gohlke/pythonlibs/,使用 Ctrl + F 搜索 pycurl,根据自己安装的 Python 版本,选择合适的版本下载,比如:我用的 python3.6,就选择带有 cp36 标识的版本。如下图红框所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  • 使用 pip 安装下载文件,如:pip install E:\pycurl-7.43.0.3-cp36-cp36m-win_amd64.whl;
  • 最后还是使用 pip install pyspider 安装。

执行以上安装步骤后,我们在控制台输入 pyspider,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=出现上述结果说明启动成功,如果启动时一直卡在 result_worker starting...,我们可以再打开一个控制台窗口,同样输入 pyspider 进行启动,启动成功后关掉之前的窗口即可。

启动成功后,我们再验证一下,打开浏览器,输入 http://localhost:5000 访问,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=我们发现确实启动成功了。

4 快速上手

4.1 创建项目

首先,我们点击图形界面中的 Create 按钮开始创建项目,如图中红框所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=然后会跳出信息填写窗口,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  • Project Name:项目名

  • Start URL(s):爬取链接地址

我们需要填写 Project Name 和 Start URL(s),这里以链家网二手房信息为例:https://hz.lianjia.com/ershoufang,填写完成后点击 Create 按钮。结果如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

4.2 爬虫实现

pyspider 访问 https 协议的网站时会提示证书问题(通常为 HTTP 599),因此我们需要在 crawl 方法中添加参数 validate_cert=False 来屏蔽证书验证。如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

我们计划获取房子的单价(unit_price)、描述标题(title)、卖点信息(sell_point),编写具体实现如下所示:

  •  
from pyspider.libs.base_handler import *

class Handler(BaseHandler): crawl_config = { }
@every(minutes=24 * 60) def on_start(self): self.crawl('https://hz.lianjia.com/ershoufang/', callback=self.index_page,validate_cert=False)
@config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('.title').items(): self.crawl(each.attr.href, callback=self.detail_page,validate_cert=False) @config(priority=2) def detail_page(self, response): yield { 'unit_price':response.doc('.unitPrice').text(), 'title': response.doc('.main').text(), 'sell_point': response.doc('.baseattribute > .content').text() }
  • @every(minutes=24 * 60):通知 Scheduler 每天运行一次。

  • @config(age=10 * 24 * 60 * 60):设置任务的有效期限。

  • @config(priority=2):设定任务优先级

  • on_start(self):程序的入口。

  • self.crawl(url, callback):主方法,用于创建一个爬取任务。

  • index_page(self, response):用来抓取返回的 html 文档中对应标签的数据。

  • detail_page(self, response):返回一个 dict 对象作为结果。

我们点击运行按钮,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

点击之后,我们发现 follows 按钮处出现了提示信息,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

点击 follows 按钮,结果如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

点击上图中红框圈起来的三角号按钮,结果如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

我们随意选一条 detail_page,点击其右侧三角号按钮,结果如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

从结果来看,已经可以爬取到我们需要的信息了。

4.3 数据存储

获取到信息之后,需要将信息存储起来,我们计划将数据存储到 MysqL 数据库。

首先,安装 pyMysqL,命令如下:

pip install pyMysqL

接着添加保存代码,完整代码如下:

  •  
from pyspider.libs.base_handler import *import pyMysqL
class Handler(BaseHandler): crawl_config = { }
def __init__(self): # 下面参数修改成自己对应的 MysqL 信息 self.db = MysqLdb.connect(ip, username, password, db, charset='utf8') def add_MysqL(self, title, unit_price, sell_point): try: cursor = self.db.cursor() sql = 'insert into house(title, unit_price, sell_point) values ("%s","%s","%s")' % (title[0],unit_price[0],sell_point); print(sql) cursor.execute(sql) self.db.commit() except Exception as e: print(e) self.db.rollback() @every(minutes=24 * 60) def on_start(self): self.crawl('https://hz.lianjia.com/ershoufang/', callback=self.index_page,validate_cert=False)
@config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('.title').items(): self.crawl(each.attr.href, callback=self.detail_page,validate_cert=False)
@config(priority=2) def detail_page(self, response): title = response.doc('.main').text(), unit_price = response.doc('.unitPrice').text(), sell_point = response.doc('.baseattribute > .content').text() self.add_MysqL(title, unit_price, sell_point) yield { 'title': response.doc('.main').text(), 'unit_price':response.doc('.unitPrice').text(), 'sell_point': response.doc('.baseattribute > .content').text() }

先测试一下是否能将数据保存到 MysqL 中,还是选一条 detail_page,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

点击其右侧三角号按钮,结果如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

从输出结果来看是执行了保存操作,我们再到 MysqL 中看一下,如图所示:

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

数据已经存到了 MysqL 中了。

上面我们是手动操作保存的数据,接下来看一下如何通过设置任务保存。

点击当前页左上角的 pyspider 按钮,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

返回 dashboard 界面,如图所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

我们点击 status 下方红框圈住的位置,将状态修改为 RUNNING 或 DEBUG,然后点击 actions 下方的 run 按钮即可。

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

python 网络爬虫(14)使用 Scrapy 搭建爬虫框架

python 网络爬虫(14)使用 Scrapy 搭建爬虫框架

目的意义

爬虫框架也许能简化工作量,提高效率等。scrapy 是一款方便好用,拓展方便的框架。

本文将使用 scrapy 框架,示例爬取自己博客中的文章内容。

说明

学习和模仿来源:https://book.douban.com/subject/27061630/。

创建 scrapy 工程

首先当然要确定好,有没有完成安装 scrapy。在 windows 下,使用 pip install scrapy,慢慢等所有依赖和 scrapy 安装完毕即可。然后输入 scrapy 到 cmd 中测试。

建立工程使用 scrapy startproject myTestProject,会在工程下生成文件。

一些介绍说明

在生成的文件中,

创建爬虫模块 - 下载

在路径./myTestProject/spiders 下,放置用户自定义爬虫模块,并定义好 name,start_urls,parse ()。

如在 spiders 目录下建立文件 CnblogSpider.py, 并填入以下:

import scrapy
class CnblogsSpider(scrapy.Spider):
    name="cnblogs"
    start_urls=["https://www.cnblogs.com/bai2018/default.html?page=1"]
    def parse(self,response):
        pass

 在 cmd 中,切换到./myTestProject/myTestProject 下,再执行 scrapy crawl cnblogs(name)测试,观察是否报错,响应代码是否为 200。其中的 parse 中参数 response 用于解析数据,读取数据等。

强化爬虫模块 - 解析

在 CnblogsSpider 类中的 parse 方法下,添加解析功能。通过 xpath、css、extract、re 等方法,完成解析。

调取元素审查分析以后添加,成为以下代码:

import scrapy
class CnblogsSpider(scrapy.Spider):
    name="cnblogs"
    start_urls=["https://www.cnblogs.com/bai2018/"]
    def parse(self,response):
        papers=response.xpath(".//*[@day'']")
        for paper in papers:
            url=paper.xpath(".//*[@postTitle'']/a/@href").extract()
            title=paper.xpath(".//*[@postTitle'']/a/text()").extract()
            time=paper.xpath(".//*[@dayTitle'']/a/text()").extract()
            content=paper.xpath(".//*[@postCon'']/div/text()").extract()
            print(url,title,time,content)
        pass

 找到页面中,class 为 day 的部分,然后再找到其中各个部分,提取出来,最后通过 print 方案输出用于测试。

在正确的目录下,使用 cmd 运行 scrapy crawl cnblogs,完成测试,并观察显示信息中的 print 内容是否符合要求。

强化爬虫模块 - 包装数据

包装数据的目的是存储数据。scrapy 使用 Item 类来满足这样的需求。

框架中的 items.py 用于定义存储数据的 Item 类。

在 items.py 中修改 MytestprojectItem 类,成为以下代码:

import scrapy
class MytestprojectItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url=scrapy.Field()
    time=scrapy.Field()
    title=scrapy.Field()
    content=scrapy.Field()
    pass

 然后修改 CnblogsSpider.py,成为以下内容:

import scrapy
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):
    name="cnblogs"
    start_urls=["https://www.cnblogs.com/bai2018/"]
    def parse(self,response):
        papers=response.xpath(".//*[@day'']")
        for paper in papers:
            url=paper.xpath(".//*[@postTitle'']/a/@href").extract()
            title=paper.xpath(".//*[@postTitle'']/a/text()").extract()
            time=paper.xpath(".//*[@dayTitle'']/a/text()").extract()
            content=paper.xpath(".//*[@postCon'']/div/text()").extract()
            
            item=MytestprojectItem(url=url,title=title,time=time,content=content)
            yield item
        pass

 将提取出的内容封装成 Item 对象,使用关键字 yield 提交。

强化爬虫模块 - 翻页

有时候就是需要翻页,以获取更多数据,然后解析。

修改 CnblogsSpider.py,成为以下内容:

import scrapy
from scrapy import Selector
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):
    name="cnblogs"
    allowd_domains=["cnblogs.com"]
    start_urls=["https://www.cnblogs.com/bai2018/"]
    def parse(self,response):
        papers=response.xpath(".//*[@day'']")
        for paper in papers:
            url=paper.xpath(".//*[@postTitle'']/a/@href").extract()
            title=paper.xpath(".//*[@postTitle'']/a/text()").extract()
            time=paper.xpath(".//*[@dayTitle'']/a/text()").extract()
            content=paper.xpath(".//*[@postCon'']/div/text()").extract()
            
            item=MytestprojectItem(url=url,title=title,time=time,content=content)
            yield item
        next_page=Selector(response).re(u''<a href="(\S*)">下一页</a>'')
        if next_page:
            yield scrapy.Request(url=next_page[0],callback=self.parse)
        pass

在 scrapy 的选择器方面,使用 xpath 和 css,可以直接将 CnblogsSpider 下的 parse 方法中的 response 参数使用,如 response.xpath 或 response.css。

而更通用的方式是:使用 Selector (response).xxx。针对 re 则为 Selector (response).re。

关于 yield 的说明:https://blog.csdn.net/mieleizhi0522/article/details/82142856

强化爬虫模块 - 存储

当 Item 在 Spider 中被收集时候,会传递到 Item Pipeline。

修改 pipelines.py 成为以下内容:

import json
from scrapy.exceptions import DropItem
class MytestprojectPipeline(object):
    def __init__(self):
        self.file=open(''papers.json'',''wb'')
    def process_item(self, item, spider):
        if item[''title'']:
            line=json.dumps(dict(item))+"\n"
            self.file.write(line.encode())
            return item
        else:
            raise DropItem("Missing title in %s"%item)

 重新实现 process_item 方法,收集 item 和该 item 对应的 spider。然后创建 papers.json,转化 item 为字典,存储到 json 表中。

另外,根据提示打开 pipelines.py 的开关。在 settings.py 中,使能 ITEM_PIPELINES 的开关如下:

然后在 cmd 中执行 scrapy crawl cnblogs 即可

 另外,还可以使用 scrapy crawl cnblogs -o papers.csv 进行存储为 csv 文件。

需要更改编码,将 csv 文件以记事本方式重新打开,更正编码后重新保存,查看即可。

强化爬虫模块 - 图像下载保存

设定 setting.py

ITEM_PIPELINES = {
    ''myTestProject.pipelines.MytestprojectPipeline'':300,
    ''scrapy.pipelines.images.ImagesPipeline'':1
}
IAMGES_STORE=''.//cnblogs''
IMAGES_URLS_FIELD = ''cimage_urls''
IMAGES_RESULT_FIELD = ''cimages''
IMAGES_EXPIRES = 30
IMAGES_THUMBS = {
    ''small'': (50, 50),
    ''big'': (270, 270)
}

 修改 items.py 为:

import scrapy
class MytestprojectItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url=scrapy.Field()
    time=scrapy.Field()
    title=scrapy.Field()
    content=scrapy.Field()

    cimage_urls=scrapy.Field()
    cimages=scrapy.Field()
    pass

 修改 CnblogsSpider.py 为:

import scrapy
from scrapy import Selector
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):
    name="cnblogs"
    allowd_domains=["cnblogs.com"]
    start_urls=["https://www.cnblogs.com/bai2018/"]
    def parse(self,response):
        papers=response.xpath(".//*[@day'']")
        for paper in papers:
            url=paper.xpath(".//*[@postTitle'']/a/@href").extract()[0]
            title=paper.xpath(".//*[@postTitle'']/a/text()").extract()
            time=paper.xpath(".//*[@dayTitle'']/a/text()").extract()
            content=paper.xpath(".//*[@postCon'']/div/text()").extract()
            
            item=MytestprojectItem(url=url,title=title,time=time,content=content)
            request=scrapy.Request(url=url, callback=self.parse_body)
            request.meta[''item'']=item

            yield request
        next_page=Selector(response).re(u''<a href="(\S*)">下一页</a>'')
        if next_page:
            yield scrapy.Request(url=next_page[0],callback=self.parse)
        pass
    
    def parse_body(self, response):
        item = response.meta[''item'']
        body = response.xpath(".//*[@postBody'']")
        item[''cimage_urls''] = body.xpath(''.//img//@src'').extract()
        yield item

总之,修改以上三个位置。在有时候配置正确的时候却出现图像等下载失败,则可能是由于 setting.py 的原因,需要重新修改。

启动爬虫

建立 main 函数,传递初始化信息,导入指定类。如:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

from myTestProject.spiders.CnblogSpider import CnblogsSpider

if __name__==''__main__'':
    process = CrawlerProcess(get_project_settings())
    process.crawl(''cnblogs'')
    process.start()

修正

import scrapy
from scrapy import Selector
from cnblogSpider.items import CnblogspiderItem
class CnblogsSpider(scrapy.Spider):
    name="cnblogs"
    allowd_domains=["cnblogs.com"]
    start_urls=["https://www.cnblogs.com/bai2018/"]
    def parse(self,response):
        papers=response.xpath(".//*[@day'']")
        for paper in papers:
            urls=paper.xpath(".//*[@postTitle'']/a/@href").extract()
            titles=paper.xpath(".//*[@postTitle'']/a/text()").extract()
            times=paper.xpath(".//*[@dayTitle'']/a/text()").extract()
            contents=paper.xpath(".//*[@postCon'']/div/text()").extract()
            for i in range(len(urls)):
                url=urls[i]
                title=titles[i]
                time=times[0]
                content=contents[i]
                item=CnblogspiderItem(url=url,title=title,time=time,content=content)
                request = scrapy.Request(url=url, callback=self.parse_body)
                request.meta[''item''] = item
                yield request
        next_page=Selector(response).re(u''<a href="(\S*)">下一页</a>'')
        if next_page:
            yield scrapy.Request(url=next_page[0],callback=self.parse)
        pass

    def parse_body(self, response):
        item = response.meta[''item'']
        body = response.xpath(".//*[@postBody'']")
        item[''cimage_urls''] = body.xpath(''.//img//@src'').extract()
        yield item

我的博客即将同步至腾讯云 + 社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=813cva9t28s6

原文出处:https://www.cnblogs.com/bai2018/p/11255185.html

Python 网络爬虫(3):开源爬虫框架对比

Python 网络爬虫(3):开源爬虫框架对比

摘要:从零开始写爬虫,初学者的速成指南!

 

封面:

 
image

介绍

大家好!我们从今天开始学习开源爬虫框架 Scrapy,如果你看过《Python 网络爬虫》系列的前两篇,那么今天的内容就非常容易理解了。细心的读者也许会有疑问,为什么不学出身名门的 Apache 顶级项目 Nutch,或者人气飙升的国内大神开发的 Pyspider 等框架呢?原因很简单,我们来看一下主流爬虫框架在 GitHub 上的活跃度:

 
活跃度

看到了吗?星星数排名第一的 Scrapy 比其他所有的加起来都要多,我仿佛听到他这样说:

 
黎明

好了,以上纯属玩笑,切莫认真,不然要引发口水战了!这些框架都很优秀,都有很多用户,活跃度相对低的并不说明技术低,活跃度相对高的也许只是多满足了一些用户需求。接下来我们还是要理性的对主流爬虫框架做一个对比分析。

开源框架大 PK

各路英雄已经到齐了, PK 现在开始!

 
复仇者联盟

Nutch

介绍:

Nutch 是一个开源的 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具,包括全文搜索和网络爬虫。

尽管搜索是上网的基本要求,但是现有的搜索引擎的数目却在下降。并且这很有可能进一步演变成为一个公司垄断了几乎所有的网页搜索为其谋取商业利益。这显然不利于广大 Internet 用户。

Nutch 为我们提供了这样一个不同的选择。相对于那些商用的搜索引擎,Nutch 作为开放源代码的搜索引擎将会更加透明,从而更值得大家信赖。现在所有主要的搜索引擎都采用私有的排序算法,而不会解释为什么一个网页会排在一个特定的位置。除此之外,有的搜索引擎依照网站所付的费用,而不是根据它们本身的价值进行排序。与它们不同,Nutch 没有什么需要隐瞒,也没有动机去扭曲搜索的结果。Nutch 将尽自己最大的努力为用户提供最好的搜索结果。

 
Nutch

优点:

Nutch 支持分布式抓取,并有 Hadoop 支持,可以进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩展。正是由于有此框架,使得 Nutch 的插件开发非常容易,第三方的插件也层出不穷,极大的增强了 Nutch 的功能和声誉。

缺点:

对于大多数用户来说,一般是想做一个精确数据爬取的爬虫,就像第一篇里爬歌单那个 “主题爬虫”。而第二篇介绍的 “通用爬虫” 适合做搜索引擎,这种需求就比较少。如果以此为标准,那么为搜索引擎而生的 Nutch 就有着天生缺点。Nutch 的架构里大部分为搜索引擎而设计的,对精确爬取没有特别的考虑。也就是说,用 Nutch 做主题爬虫,会浪费很多的时间在不必要的计算上。而且如果你试图通过对 Nutch 进行二次开发来扩展其定制能力,基本上就要破坏 Nutch 的框架,反而不如自己写了。

Pyspider

介绍:

Pyspider 是一个国人编写的强大的网络爬虫系统并带有强大的 WebUI。采用 Python 语言编写,分布式架构,支持多种数据库后端,强大的 WebUI 支持脚本编辑器,任务监视器,项目管理器以及结果查看器。

 
Pyspider

Pyspider 的主要功能包括,抓取、更新调度多站点的特定的页面;需要对页面进行结构化信息提取;灵活可扩展,稳定可监控。满足了绝大多数 Python 爬虫的需求 —— 定向抓取,结构化化解析。但是面对结构迥异的各种网站,单一的抓取模式并不一定能满足,灵活的抓取控制是必须的。为了达到这个目的,单纯的配置文件往往不够灵活,于是,通过脚本去控制抓取成为了最后的选择。而去重调度,队列,抓取,异常处理,监控等功能作为框架,提供给抓取脚本,并保证灵活性。最后加上 web 的编辑调试环境,以及 web 任务监控,即成为了最终的框架。

优点:

  1. 支持分布式部署。
  2. 完全可视化,对用户非常友好:WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出。
  3. 简单,五分钟就能上手。脚本规则简单,开发效率高。
  4. 支持抓取 JavaScript 的页面。

总之,Pyspider 非常强大,强大到更像一个产品而不是一个框架。

缺点:

  1. URL 去重使用数据库而不是布隆过滤器,亿级存储的 db io 将导致效率急剧降低。
  2. 使用上的人性化牺牲了灵活度,定制化能力降低。

Scrapy

介绍:

Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。Scrapy 使用 Twisted 这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。Scratch,是抓取的意思,这个 Python 的爬虫框架叫 Scrapy,大概也是这个意思吧。

 
Scrapy

优点:

  1. 极其灵活的定制化爬取。
  2. 社区人数多、文档完善。
  3. URL 去重采用布隆过滤器方案。
  4. 可以处理不完整的 HTML,Scrapy 已经提供了 selectors(一个在 lxml 的基础上提供了更高级的接口),可以高效地处理不完整的 HTML 代码。

缺点:

  1. 不支持分布式部署。
  2. 原生不支持抓取 JavaScript 的页面。
  3. 全命令行操作,对用户不友好,需要一定学习周期。

结论

篇幅有限,就先选择这三个最有代表性的框架进行 PK。他们都有远超别人的优点,比如:Nutch 天生的搜索引擎解决方案、Pyspider 产品级的 WebUI、Scrapy 最灵活的定制化爬取。也都各自致命的缺点,比如 Scrapy 不支持分布式部署,Pyspider 不够灵活,Nutch 和搜索绑定。究竟该怎么选择呢?

我们的目标是做纯粹的爬虫,不是搜索引擎,所以先把 Nutch 排除掉,剩下人性化的 Pyspider 和高可定制的 Scrapy。Scrapy 的灵活性几乎能够让我们完成任何苛刻的抓取需求,它的 “难用” 也让我们不知不觉的研究爬虫技术。现在还不是享受 Pyspider 的时候,目前的当务之急是打好基础,应该学习最接近爬虫本质的框架,了解它的原理,所以把 Pyspider 也排除掉。

最终,理性的从个人的需求角度对比,还是 Scrapy 胜出!其实 Scrapy 还有更多优点:

  1. HTML, XML 源数据选择及提取的原生支持。
  2. 提供了一系列在 spider 之间共享的可复用的过滤器 (即 Item Loaders),对智能处理爬取数据提供了内置支持。
  3. 通过 feed 导出 提供了多格式 (JSON、CSV、XML),多存储后端 (FTP、S3、本地文件系统) 的内置支持。
  4. 提供了 media pipeline,可以 自动下载 爬取到的数据中的图片 (或者其他资源)。
  5. 高扩展性。您可以通过使用 signals ,设计好的 API (中间件,extensions, pipelines) 来定制实现您的功能。
  6. 内置的中间件及扩展为下列功能提供了支持:
    1. cookies and session 处理
    2. HTTP 压缩
    3. HTTP 认证
    4. HTTP 缓存
    5. user-agent 模拟
    6. robots.txt
    7. 爬取深度限制
  7. 针对非英语语系中不标准或者错误的编码声明,提供了自动检测以及健壮的编码支持。
  8. 支持根据模板生成爬虫。在加速爬虫创建的同时,保持在大型项目中的代码更为一致。
  9. 针对多爬虫下性能评估、失败检测,提供了可扩展的 状态收集工具 。
  10. 提供 交互式 shell 终端,为您测试 XPath 表达式,编写和调试爬虫提供了极大的方便。
  11. 提供 System service, 简化在生产环境的部署及运行。
  12. 内置 Telnet 终端 ,通过在 Scrapy 进程中钩入 Python 终端,使您可以查看并且调试爬虫。
  13. Logging 为您在爬取过程中捕捉错误提供了方便。
  14. 支持 Sitemaps 爬取。
  15. 具有缓存的 DNS 解析器。

下一步

吹了半天的 Scrapy,时间也到了,如果大家能够喜欢上它,学习的效率一定会成倍提升!下次我会为大家带来满满的干货,并完成更具挑战性的爬虫任务,我们下期再见!

需要项目案例系列讲解资料,点击喜欢然后进作者创建群:814468827 找群文件:Python 资料 2

我们今天的关于网络爬虫Spider的分享就到这里,谢谢您的阅读,如果想了解更多关于java实现网络爬虫(网络搜索引擎的使用)、Python 爬虫(七):pyspider 使用、python 网络爬虫(14)使用 Scrapy 搭建爬虫框架、Python 网络爬虫(3):开源爬虫框架对比的相关信息,可以在本站进行搜索。

本文标签: