zoukankan      html  css  js  c++  java
  • scrapy研究探索(二)——爬w3school.com.cn

    下午被一个问题困扰了好一阵。终于使用还有一种方式解决。

    開始教程二。关于Scrapy安装、介绍等请移步至教程(一)(http://blog.csdn.net/u012150179/article/details/32343635)。

    在開始之前如果你已经安装成功一切所需,整怀着一腔热血想要抓取某站点。

    一起来have a try。


    1. 前期基础准备。

    Oh,不能在准备了,直接来。

    (1) 创建项目。

    输入:

    scapy startproject w3school

    以上创建项目w3school。这时会产生w3school目录,目录下文件例如以下: 

    scrapy.cfg
    w3school/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py

    当中scrapy.cfg目的配置文件。主要改写的是w3school中的三个文件以及当中spiders中须要编写的爬虫。

    一个一个来。

    (2) 在items.py中定义Item容器。也就是编写items.py内容。

    所谓Item容器就是将在网页中获取的数据结构化保存的数据结构,类似于python中字典。以下为items.py中代码。

    #project: w3school
    #file   : items.py
    #author : younghz
    #brief  : define W3schoolItem.
    
    from scrapy.item import Item,Field
    
    class W3schoolItem(Item):
        title = Field()
        link = Field()
        desc = Field()


    上面定义了自己的W3schoolItem类,它继承自scrapy的Item(这里没有显示定义W3schoolItem的__init__()方法。也正由于如此,python也会为你自己主动调用基类的__init__(),否则必须显式在子类的__init__()中调用基类__init__())。

    之后声明W3schoolItem中元素并使用Field定义。到此items.py就OK了。


    (3) 在pipelines.py中编写W3schoolPipeline实现对item的处理

    在当中主要完毕数据的查重、丢弃,验证item中数据。将得到的item数据保存等工作。代码例如以下:

    import json
    import codecs
    
    
    class W3SchoolPipeline(object):
        def __init__(self):
            self.file = codecs.open('w3school_data_utf8.json', 'wb', encoding='utf-8')
    
        def process_item(self, item, spider):
            line = json.dumps(dict(item)) + '
    '
            # print line
            self.file.write(line.decode("unicode_escape"))
            return item
    


    当中的process_item方法是必须调用的用来处理item,而且返回值必须为Item类的对象。或者是抛出DropItem异常。而且上述方法将得到的item实现解码,以便正常显示中文。终于保存到json文件里。

    注意:在编写完pipeline后。为了可以启动它,必须将其增加到ITEM_PIPLINES配置中,即在settings.py中增加以下一句:

    ITEM_PIPELINES = {
        'w3school.pipelines.W3SchoolPipeline':300
    }


    2.编写爬虫。

    爬虫编写是在spider/目录下编写w3cshool_spider.py。

    先上整个程序在慢慢解释:

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    from scrapy.spider import Spider
    from scrapy.selector import Selector
    from scrapy import log
    
    from w3school.items import W3schoolItem
    
    
    class W3schoolSpider(Spider):
        """爬取w3school标签"""
        #log.start("log",loglevel='INFO')
        name = "w3school"
        allowed_domains = ["w3school.com.cn"]
        start_urls = [
            "http://www.w3school.com.cn/xml/xml_syntax.asp"
        ]
    
        def parse(self, response):
    
            sel = Selector(response)
            sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')
            items = []
    
            for site in sites:
                item = W3schoolItem()
    
                title = site.xpath('a/text()').extract()
                link = site.xpath('a/@href').extract()
                desc = site.xpath('a/@title').extract()
    
                item['title'] = [t.encode('utf-8') for t in title]
                item['link'] = [l.encode('utf-8') for l in link]
                item['desc'] = [d.encode('utf-8') for d in desc]
                items.append(item)
    
                #记录
                log.msg("Appending item...",level='INFO')
    
    
            log.msg("Append done.",level='INFO')
            return items
    

    (1)须要注意的是编写的spider必须继承自scrapy的Spider类。

    属性name即spider唯一名字,start_url能够理解为爬取入口。

    (2)parse方法。

    parse()是对scrapy.Spider类的override。

    (3)网页中的数据提取机制。

    scrapy使用选择器Selector并通过XPath实现数据的提取。关于XPath 推荐w3school的教程。


    小工具:

    关于网页代码中意向信息的查找能够借助几个工具:

    第一个——Firefox插件Firebug。

    第二个——Firefox插件XPath。能够高速的在网页中对xpath表达式的正确性进行验证。

    第三个——scrapy shell.关于其使用能够查看教程。


    分析:

    在这里我提取的是http://www.w3school.com.cn/xml/xml_syntax.asp网页中下图部分。

    clip_image002

    即“XML 基础”下全部文件夹结构的名字、链接和描写叙述。

    使用Firebug找到次部分相应的代码块后就能够使用XPath运行信息提取。Xpath表达式如上面代码中所看到的。

    上面还涉及到了对item中信息的编码,是为了中文信息在json文件里的正确显示。


    (4)在parse方法中还使用到了log功能实现信息记录。使用log.mes()函数就可以


    3.运行。

    一切就绪。

    进入到项目文件夹下,运行: 

    scrapy crawl w3school --set LOG_FILE=log

    在文件夹下生成log和w3school_data_utf8.json文件。

    查看生成的json文件:



    OK。这就实现了针对 http://www.w3school.com.cn/xml/xml_syntax.asp中导航条部分的提取。

    原创,转载注明:http://blog.csdn.net/u012150179/article/details/32911511

    关于scrapy的其他文章:

    http://blog.csdn.net/u012150179/article/details/34913315

    http://blog.csdn.net/u012150179/article/details/34486677

    http://blog.csdn.net/u012150179/article/details/34441655

    http://blog.csdn.net/u012150179/article/details/32911511

    http://blog.csdn.net/u012150179/article/details/35774323


  • 相关阅读:
    work 2
    chapter02
    7.23作业
    第五章
    三层交换机
    基于nginx结合openssl实现https
    chapter10--进程和计划任务管理
    Linux系统管理08--服务器RAID及配置实战
    chapter07-- LVM逻辑卷
    Linux系统管理07--文件系统与LVM
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8451414.html
Copyright © 2011-2022 走看看