网页爬虫--scrapy入门

本篇从实际出发,展示如何用网页爬虫。并介绍一个流行的爬虫框架~


1. 网页爬虫的过程

所谓网页爬虫,就是模拟浏览器的行为访问网站,从而获得网页信息的程序。正因为是程序,所以获得网页的速度可以轻易超过单身多年的手速:)。通常适用于需要大量网页信息的场合。

爬取网页的流程为:访问初始url -> 获得返回的网页,从这个网页中得到新的url并放入待爬队列 -> 访问新的url-> ...依次循环。整体上来看就是一个广度优先的过程,当然,新的url也不一定非要从返回的网页中获得。

一个简单的网页爬虫应该包括以下部分:

  1. 一个url队列。我们的爬虫从这个队列中读取url,并将新的url放入这个队列。这里最重要的是判重。简单的哈希就能达到判重的目的,但是为了节约空间(url的数量往往很多),一般使用bloomfilter的思想。bloomfilter与普通的哈希算法最大的不同就是bloomfilter只需要一个bit来表示某个元素是否存在,所以能节约空间。bloomfilter有一个小缺点,即准确率并不是百分百:判断一个元素是不是已经存在时,已有的有很小的可能会判断为不存在,但是没有的元素一定会判断为不存在。
  2. 网页爬取模块。需要能模拟浏览器发送请求。
  3. 网页分析模块。爬下来的是网页源码,可以用正则或者其他方法提取我们需要的信息。
  4. 新的url生成模块。生成新的url,放入队列。

那么,最简单的爬虫就可以这么写:

import Queue

start_url = "http://www.cnblogs.com/rubinorth"
url_queue = Queue.Queue()  # url队列
url_queue.put(start_url) 

bloomfilter.put(start_url)
#### 一直循环到队列为空 ####
while(True):
    if url_queue.size() > 0:
        current_url = url_queue.get()  # 队首的url
        page = crawl(current_url)  # crawl为网页爬取模块,page是爬到的网页源代码
        next_urls = deal_page(page)  # deal_page为网页分析模块,next_urls是新的一些url

        for next_url in next_urls:
            if not bloomfilter.has(next_url):  # 判重
                bloomfilter.put(next_url)
                url_queue.put(next_url)
    else:
        break

2. 为什么选用scrapy

scrapy是目前一个比较流行的爬虫框架,其基本原理与上面的爬虫是一样的,但是它提供了很多便利的功能。

首先,先简要介绍一下scrapy各个模块之间的关系和整个框架运行的流程。是时候祭出那张scrapy的经典图了:

从这张图上看,scrapy包含了以下模块:

  1. scrapy engine,主引擎。在处理数据流时负责管理整个系统,同时各种事件的触发也由其负责。
  2. spider,即我们的爬虫。主要的爬虫代码都在这部分中,包括发起请求,处理返回的网页等等。
  3. spider middleware,spider中间件。中间件的一种,主要工作对spider发送的request做一些处理。
  4. scheduler,调度器。上面说到的url队列就是调度器在管理,一方面接收spider发送的request请求,放入队列中;另一方面会从队首取出request交由downloader去下载网页。
  5. downloader,下载器。将网页的html源码下载下来供之后的网页分析和信息提取。
  6. downloader middleware,下载器中间件。中间件的一种,在下在网页之前和之后都会运行,可以用来设置发送请求的header,cookies,代理ip以及处理一些错误返回的情况。
  7. item pipeline, 管道。一个网页被爬取下来并解析之后,其后续的信息存储之类的工作在pipeline中进行。当然也可以直接在spider中完成这些工作,但在pipeline中完成则显得整个项目结构清晰。

上面列出的里面spider,pipeline需要自己写,两种middleware需要的话可以自己添加自己写的。

光介绍给人感觉比较空洞,那下面就让我们来使用scrapy实现一个简单的爬虫吧。


3. scrapy实现爬虫

scrapy createproject cnblog_project

使用上面的命令创建一个scrapy工程之后,首先我们要写的是spider。

class CnblogSpider(Spider):
    name = ‘cnblog_spider‘  # 爬虫名字
    allowed_domain = [‘cnblogs.com‘]  # 允许的domain

    def __init__(self):
        self.start_urls = [‘http://www.cnblogs.com/rubinorth‘]

    def start_requests(self):
        return [Request(url, callback=self.parse_page) for url in self.start_urls]

    # 分析爬取的页面并构造下一个页面的请求
    def parse_page(self, response):
        logging.info("parse : " + response.url)

        sel = Selector(response)
        item = CnblogItem()

        # 提取页面内容
        item[‘name‘] = sel.xpath("//a[@id=‘Header1_HeaderTitle‘]/text()").extract()[0]
        yield item
        # 下一个页面的请求
        new_url = get_new_url(response.body)  # 根据源码分析出新的链接,需自己实现
        yield Request(new_url, callback=self.parse_page)

上面是一个简单的爬虫,start_urls是初始的url集合(上面只有一个),start_requests则根据start_urls构造Request,并交给调度器。parse_page中,response是返回的页面的源码;CnblogItem是scrapy提供的item组件,方便结构化地提取源码中的数据,而yield item则会将这个item交给管道;yield Request(new_url, callback=self.parse_page)则会发送一个新的Request,发起下一轮的爬取。
items.py中只要这么写:

class CnblogItem(scrapy.Item):
    name = scrapy.Field()

接着,我们需要写pipelines.py

class CnblogPipeline(object):
    def process_item(self, item, spider):
        print item[‘name‘]
        return item

每个pipeline都必须有process_item这个方法。上面我们只是简单地打印出了name。return item是考虑到可能有多个pipeline(return了之后可以让其他pipeline处理)。
最后,只需要修改settings.py即可:

...
ITEM_PIPELINES = {
   ‘yelp_project.pipelines.CnblogPipeline‘: 304,
}
...

需要在setting中打开自己的pipeline。
好了,一个简单的爬虫就这么写完了。注意我们并没有用到中间件,也不需要写自己的中间件。
最后, 命令行运行:

scrapy crawl cnblog_spider

参考资料

如何入门python爬虫

转载请注明出处:http://www.cnblogs.com/rubinorth/

时间: 2024-10-12 21:07:51

网页爬虫--scrapy入门的相关文章

python之路 -- 爬虫 -- Scrapy入门

Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 下面是Scrapy的架构,包括组件以及在系统中发生的数据流的概览(绿色箭头所示).  数据流 Scra

爬虫——scrapy入门

scrapy 安装scrapy pip install scrapy windows可能安装失败,需要先安装c++库或twisted,pip install twisted 创建项目 scrapy startproject tutorial 该命令将会创建包含下列内容的 tutorial 目录: tutorial/ scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py ...

Scrapy 爬虫框架入门案例详解

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对Scrapy对基本用法和原理有大体的了解,作为入门. 在本篇开始之前,假设已经安装成功了Scrapy,如果尚未安装,请参照上一节安装课程. 本节要完成的任务有: 创建一个Scrapy项目 创建一个Spider来抓取站点和处理数据 通过命令行将抓取的内容导出 创建项目 在抓取之前,你必须要先创建一个S

小白学 Python 爬虫(37):爬虫框架 Scrapy 入门基础(五) Spider Middleware

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基

小白学 Python 爬虫(40):爬虫框架 Scrapy 入门基础(七)对接 Selenium 实战

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基

Python scrapy 实现网页爬虫

Python scrapy 安装和网页爬虫功能实现 现在组内有个工作就是维护恶意URL库,然后这个维护工作,主要是通过从几个会发布恶意URL地址的网站获取恶意网址,每次都得花费半天,很乏味的事情.所以就想到能否用个爬虫搞定. 这两天研究了下python scrapy,发现利用scrapy的确很容易实现网址爬取功能. 一.scrapy安装 简单的说明一下scrapy的安装过程 window安装 先安装python,要提醒一下是环境变量的配置,只有环境变量配置对了,才能在命令行执行窗口找到pytho

网络爬虫技术入门_Python基础与爬虫技术

Python基础与爬虫技术  课程学习地址:http://www.xuetuwuyou.com/course/195 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你可以使用少量编程技能就可以爬取复杂的网站. <Python 基础与爬虫技术>讲解了从静态页面爬取数据的方法以及使用缓存来管理服务器负载的方法.此外,本课程还介绍了如何使用AJA

【scrapy】学习Scrapy入门

Scrapy介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据.抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样. Scr

python爬虫Scrapy(一)-我爬了boss数据

一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴.    这次我选择爬取的是boss直聘来数据,毕竟这个网站的数据还是很有参考价值的,下面我们讲述怎么爬取boss直聘的招聘信息并存盘,下一篇文章我们在对爬取到的数据进行分析. 二.Scrapy框架使用步骤 下面我们做一个简单示例,创建一个名字为BOSS的爬虫工程,然后创建一个名字为zhipin的爬虫