学习python之走进Scrapy

来源:互联网 发布:qq三国js带什么元神 编辑:程序博客网 时间:2024/05/08 18:49

         Scrapy是一个为了爬取网站数据,提取结构性数据而使用python编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。注意关键字,第一个是python,最近对python真的是有很大的兴趣,它涉及各个领域,再次证明了python的强大;第二个是应用框架,Scrapy仅仅是一个框架,每个人都可以根据自己的需要对它进行修改。当需要从某个网站中获取信息时,但该网站未提供API或能通过程序获取信息的机制时, Scrapy可以助你一臂之力。

 

1.    安装ScrapyWindows已正确安装Python2.7

a)      安装pywin32

b)      确认pip被正确安装:

                   pip –version

c)      安装Scrapy

                   pip install Scrapy

2.    创建Scrapy项目

先在桌面创建一个Scrapy文件夹,进入cmd运行startproject命令:

                  scrapy startproject tutorial

该命令会创建如下的tutorial目录:

tutorial/

       scrapy.cfg

       tutorial/

            __init__.py

            items.py

            pipelines.py

            settings.py

            spiders/

                __init__.py

这些文件分别是:

scrapy.cfg:整个项目的配置文件

tutorial/:该项目的python模块,在此目录下添加代码

tutorial/items.py:项目中的item文件.

tutorial/pipelines.py:项目中的pipelines文件.

tutorial/settings.py:项目的设置文件.

tutorial/spiders/:放置spider代码的目录.

3.    定义Item

爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy提供 item类来满足这样的需求。Item 是保存爬取到的数据的容器;其使用方法和python字典类似。熟悉 Django的小伙伴们一定会注意到Scrapy Item定义方式与  Django中的模板很类似,不过没有那么多不同的字段类型(Field type),相对来说更简单。我们要做的仅仅是通过创建一个 scrapy.item类,并且定义类型为 scrapy.Field的类属性就可以定义一个Item,打开tutorial 目录中的 items.py 文件,代码如下所示:

       class BaiduItem(scrapy.Item):

             title= scrapy.Field()

             link= scrapy.Field()

             desc= scrapy.Field()

Itempython中的字典特别类似,下面通过一个小例子说明一下:

>>> example = BaiduItem(title = “test”, link = ‘www.baidu.com’,desc = ‘python book’)

>>> print example

BaiduItem(title = “test”, link = ‘www.baidu.com’, desc = ‘python book’)

>>> example(‘title’)

‘test’

>>> example(‘link’)

‘www.baidu.com’

>>> example(‘desc’)

‘python book’

4.    编写爬虫(Spider

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成item的方法。

为了创建一个Spider,您必须继承scrapy.Spider类,且定义以下三个属性:

 name:作为每个Spider的唯一标识符,不同的Spider不可以有相同的名字。

start_urls:Spider在启动时将要爬取的url列表,后续的URL则从这个列表中爬取到的数据中提取。

parse():作为URL请求的回调函数,被调用时,每个start_urls内的URL生成的响应将会作为唯一的参数传递给该函数,它用来解析返回的数据(response data),从HTML源码中提取数据(生成Item)以及生成需要进一步处理的URL

打开tutorial/spiders 目录,创建一个first_spider.py开始我们的第一个爬虫,代码如下:

import scrapy

from tutorial.items import BaiduItem

 

class BaiduSpider(scrapy.Spider):

    name = "baidu"

    allowed_domains = ["baidu.com"]

    start_urls = [

        "http://news.baidu.com/",

        "http://tieba.baidu.com/"

    ]

 

    def parse(self, response):

        for sel in response.xpath('//ul/li'):

            item = BaiduItem ()

            item['title'] = sel.xpath('a/text()').extract()

            item['link'] = sel.xpath('a/@href').extract()

            item['desc'] = sel.xpath('text()').extract()

            yield item

5.    启动爬虫

cmd中回到项目的根目录,即scrapy/tutorial目录下,输入如下指令启动爬虫:

        scrapy crawlbaidu

之后在cmd中你就能看到爬取结果。爬虫运行起来很简单,但你知道从你输入启动爬虫的命令到显示爬取的数据过程中发生了什么吗?这是用来衡量一个人是否真正理解Scrapy框架的标准,类似web开发中MVC模型之间的工作原理。

在描述Scrapy工作原理之前,需要先介绍一下选择器(Selector):

当抓取网页时,你做的最常见的任务是从HTML源码中提取数据。现有的一些库可以达到这个目的,比如BeautifulSouplxml,而Scrapy提取数据有自己的一套机制,它们被称作选择器(seletors),因为他们通过特定的XPath或者CSS表达式来“选择” HTML文件中的某个部分。(BeautifulSoup之前看过一段时间,lxml没接触过,尚还在学习阶段,无法说出各自好坏)我们最常用的就是基于XPath的选择器,可以上网搜XPath相关教程,下面通过一个小例子来感受一下:

                   >>>from scrapy.selectorimport Selector

                   >>> from scrapy.http import HtmlResponse

                   >>>body = '<html><body><span>good</span></body></html>'

                   >>> Selector(text=body).xpath('//span/text()').extract()

                   [u'good']

Selector的作用就是用body这条HTML语句中提取出所有<span>元素中的文本内容。

下面就介绍一下Scrapy工作原理:(我觉得我自己也不一定能呈述得很明白)

a)      首先调用start_request()方法,选择start_urls中的一个URLparse()作为参数,通过该方法来生成请求消息(Request);

b)      Request执行完成并返回时,会生成一个响应消息(Response),Response会作为参数传递给回调函数parse()

c)      如上面Spider的例子中所述,在回调函数parse()内分析返回的网页内容,通过使用选择器(当然也可以是BeautifulSouplxml等其它解析器)来进行分析,并根据分析的数据生成Item,回调函数返回的值可以是Item,可以是另一个Request,也可以是一个包括二者的可迭代容器;

d)      最后,将Spider返回的Item被存放到数据库中或写入到文件中。


至此,可以说对Scrapy已经入门了,感兴趣的童鞋可以继续深入学习Scrapy的各种方法函数。

End...


0 0