scrapy研究探索1

以下转载自:http://blog.csdn.net/u012150179/article/details/32911511


写在前面:
1、修改了原链接在 拼写上的一些错误(包括大小写),
2、个人实践时注意缩进,不要 tab 和 空格并用,会引发错误。

(1) 创建项目。

输入:

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. scapy startproject w3school  

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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.     link = Field()  
  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 在CODE上查看代码片 派生到我的代码片
  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.         line = json.dumps(dict(item)) + '\n'  
  11.         # print line  
  12.         self.file.write(line.decode("unicode_escape"))  
  13.         return item  


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

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

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ITEM_PIPELINES = {  
  2.     'w3school.pipelines.W3schoolPipeline':300  
  3. }  


2.编写爬虫。

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

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

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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.   
  11. class W3schoolSpider(Spider):  
  12.     """爬取w3school标签"""  
  13.     #log.start("log",loglevel='INFO')  
  14.     name = "w3school"  
  15.     allowed_domains = ["w3school.com.cn"]  
  16.     start_urls = [  
  17.         "http://www.w3school.com.cn/xml/xml_syntax.asp"  
  18.     ]  
  19.   
  20.     def parse(self, response):  
  21.   
  22.         sel = Selector(response)  
  23.         sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')  
  24.         items = []  
  25.   
  26.         for site in sites:  
  27.             item = W3schoolItem()  
  28.   
  29.             title = site.xpath('a/text()').extract()  
  30.             link = site.xpath('a/@href').extract()  
  31.             desc = site.xpath('a/@title').extract()  
  32.   
  33.             item['title'] = [t.encode('utf-8'for t in title]  
  34.             item['link'] = [l.encode('utf-8'for l in link]  
  35.             item['desc'] = [d.encode('utf-8'for d in desc]  
  36.             items.append(item)  
  37.   
  38.             #记录  
  39.             log.msg("Appending item...",level='INFO')  
  40.   
  41.   
  42.         log.msg("Append done.",level='INFO')  
  43.         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.执行。

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

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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

关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++&OPENCV 的全景图像拼接 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值