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 创建项目。

    输入:

    [python] view plain copy

     

    1. scapy startproject w3school  

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

    [plain] view plain copy

     

    1. scrapy.cfg  
    2. w3school/  
    3.     __init__.py  
    4.     items.py  
    5.     pipelines.py  
    6.     settings.py  
    7.     spiders/  
    8.         __init__.py  

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

    一个一个来。

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

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

    [python] view plain copy

     

    1. #project: w3school  
    2. #file   : items.py  
    3. #author : younghz  
    4. #brief  : define W3schoolItem.  
    5.   
    6. from scrapy.item import Item,Field  
    7.   
    8. class W3schoolItem(Item):  
    9.     title = Field()  
    10. 10.     link = Field()  
    11. 11.     desc = Field()  

     

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

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

     

    3 pipelines.py中编写W3schoolPipeline实现对item的处理。

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

    [python] view plain copy

     

    1. import json  
    2. import codecs  
    3.   
    4.   
    5. class W3SchoolPipeline(object):  
    6.     def __init__(self):  
    7.         self.file = codecs.open('w3school_data_utf8.json', 'wb', encoding='utf-8')  
    8.   
    9.     def process_item(self, item, spider):  
    10. 10.         line = json.dumps(dict(item)) + ' '  
    11. 11.         # print line  
    12. 12.         self.file.write(line.decode("unicode_escape"))  
    13. 13.         return item  

     

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

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

    [python] view plain copy

     

    1. ITEM_PIPELINES = {  
    2.     'w3school.pipelines.W3SchoolPipeline':300  
    3. }  

     

    2.编写爬虫。

    爬虫编写是在spider/文件夹下编写w3cshool_spider.py。

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

    [python] view plain copy

     

    1. #!/usr/bin/python  
    2. # -*- coding:utf-8 -*-  
    3.   
    4. from scrapy.spider import Spider  
    5. from scrapy.selector import Selector  
    6. from scrapy import log  
    7.   
    8. from w3school.items import W3schoolItem  
    9.   
    10. 10.   

    11. class W3schoolSpider(Spider):  

    1. 12.     """爬取w3school标签"""  
    2. 13.     #log.start("log",loglevel='INFO')  
    3. 14.     name = "w3school"  
    4. 15.     allowed_domains = ["w3school.com.cn"]  
    5. 16.     start_urls = [  
    6. 17.         "http://www.w3school.com.cn/xml/xml_syntax.asp"  
    7. 18.     ]  
    8. 19.   
    9. 20.     def parse(self, response):  
    10. 21.   
    11. 22.         sel = Selector(response)  
    12. 23.         sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')  
    13. 24.         items = []  
    14. 25.   
    15. 26.         for site in sites:  
    16. 27.             item = W3schoolItem()  
    17. 28.   
    18. 29.             title = site.xpath('a/text()').extract()  
    19. 30.             link = site.xpath('a/@href').extract()  
    20. 31.             desc = site.xpath('a/@title').extract()  
    21. 32.   
    22. 33.             item['title'] = [t.encode('utf-8') for t in title]  
    23. 34.             item['link'] = [l.encode('utf-8') for l in link]  
    24. 35.             item['desc'] = [d.encode('utf-8') for d in desc]  
    25. 36.             items.append(item)  
    26. 37.   
    27. 38.             #记录  
    28. 39.             log.msg("Appending item...",level='INFO')  
    29. 40.   
    30. 41.   
    31. 42.         log.msg("Append done.",level='INFO')  
    32. 43.         return items  



    1)需要注意的是编写的spider必须继承自scrapySpider类。

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

    2parse方法。

    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网页中下图部分。

     

    即“XML 基础”下所有目录结构的名字、链接和描述。使用Firebug找到次部分对应的代码块后就可以使用XPath执行信息提取。Xpath表达式如上面代码中所示。

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

     

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

     

    3.执行。

    一切就绪。进入到项目目录下,执行: 

    [python] view plain copy

     

    1. 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

     

  • 相关阅读:
    server version for the right syntax to use near 'USING BTREE 数据库文件版本不合导致的错误
    百度网盘,FTP上传异常、上传失败的解决办法
    zencart产品属性dropmenu select只有一个选择项时自动变成radio单选的解决办法
    火车采集小结
    dedecms织梦移站后替换数据库中文件路径命令
    dedecms织梦网站本地迁移到服务器后,后台更新栏目文档提示模板文件不存在,无法解析文档!的解决办法
    Addthis分享插件后url乱码的解决办法
    dedecms织梦做中英文(多语言)网站步骤详解
    递归的参数和返回值
    【图论算法】Dijkstra&BFS
  • 原文地址:https://www.cnblogs.com/lmsj/p/6504704.html
Copyright © 2011-2022 走看看