scrapy抓取 W3School (二)

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

 

  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

 

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

即“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中导航条部分的提取。

时间: 2024-08-02 04:31:01

scrapy抓取 W3School (二)的相关文章

Python使用scrapy抓取网站sitemap信息的方法_python

本文实例讲述了Python使用scrapy抓取网站sitemap信息的方法.分享给大家供大家参考.具体如下: import re from scrapy.spider import BaseSpider from scrapy import log from scrapy.utils.response import body_or_str from scrapy.http import Request from scrapy.selector import HtmlXPathSelector c

使用Scrapy抓取数据

Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 官方主页: http://www.scrapy.org/ 中文文档:Scrapy 0.22 文档 GitHub项目主页:https://github.com/scrapy/scrapy Scrapy 使用了 Twisted 异步网络库来处理网络通讯.整体架构大致如下(注:图片来自互联网): Scrapy主要包括了以下

Python打印scrapy蜘蛛抓取树结构的方法_python

本文实例讲述了Python打印scrapy蜘蛛抓取树结构的方法.分享给大家供大家参考.具体如下: 通过下面这段代码可以一目了然的知道scrapy的抓取页面结构,调用也非常简单 #!/usr/bin/env python import fileinput, re from collections import defaultdict def print_urls(allurls, referer, indent=0): urls = allurls[referer] for url in urls

使用Scrapy爬取知乎网站

本文主要记录使用使用 Scrapy 登录并爬取知乎网站的思路.Scrapy的相关介绍请参考 使用Scrapy抓取数据. 相关代码,见 https://github.com/javachen/scrapy-zhihu-github ,在阅读这部分代码之前,请先了解 Scrapy 的一些基本用法. 使用cookie模拟登陆 关于 cookie 的介绍和如何使用 python 实现模拟登陆,请参考python爬虫实践之模拟登录. 从这篇文章你可以学习到如何获取一个网站的 cookie 信息.下面所讲述

影响蜘蛛抓取内容的四个因素

  网站收录良好与否跟蜘蛛爬行频繁次数.抓取页面有关是众所周知的,但是对于蜘蛛抓取了哪些页面我们不知道,那么我们只能依靠蜘蛛爬行过的访问日志进行分析了.从日志中我们可以分析出很多的数据,那么今天笔者主要给大家讲解一下影响蜘蛛抓取的因素和爬行时间,不要小看这个日志,它可以帮助你知道网站对于蜘蛛来说,是不是意味着友好的状态,蜘蛛喜不喜欢自己的站,如果爬行量大的话,那么就可以简单的得出网站很合蜘蛛的胃口,如果蜘蛛几天都不来的话,那么就要检查一下,是不是网站没有蜘蛛喜欢的"食物"了,下面就说说

微信公众号文章如何抓取

问题描述 微信公众号文章如何抓取 如题,请问,现在有什么好的方式抓取微信公众号文章的方式吗?我现在用的是搜狗的入口,但是这个入口每几个月就会变换规则,接口整体大改,不稳定,有没有其他什么好的方法? 解决方案 搜狗微信公众号文章抓取 解决方案二: 没有什么好办法,只能通过搜狗,而且如果信息多还无法捉取全部的,好像只能显示前40条.. 解决方案三: 微信文章内容的话可以使用辅助工具, 把微信文章链接输入,然后把整篇内容抓取出来,一般像微小宝之类的工具都有这个功能 解决方案四: 是指这个吗http:/

Python抓取框架:Scrapy的架构

最近在学Python,同时也在学如何使用python抓取数据,于是就被我发现了这个非常受欢迎的Python抓取框架Scrapy,下面一起学习下Scrapy的架构,便于更好的使用这个工具. 一.概述 下图显示了Scrapy的大体架构,其中包含了它的主要组件及系统的数据处理流程(绿色箭头所示).下面就来一个个解释每个组件的作用及数据的处理过程. 二.组件 1.Scrapy Engine(Scrapy引擎) Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发.更多的详细内容可以看下

Python抓取框架 Scrapy的架构_python

最近在学Python,同时也在学如何使用python抓取数据,于是就被我发现了这个非常受欢迎的Python抓取框架Scrapy,下面一起学习下Scrapy的架构,便于更好的使用这个工具. 一.概述 下图显示了Scrapy的大体架构,其中包含了它的主要组件及系统的数据处理流程(绿色箭头所示).下面就来一个个解释每个组件的作用及数据的处理过程. 二.组件 1.Scrapy Engine(Scrapy引擎) Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发.更多的详细内容可以看下

用Python编写网络爬虫(二):利用urllib2通过指定的URL抓取网页内容

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源. 在Python中,我们使用urllib2这个组件来抓取网页. urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件. 它以urlopen函数的形式提供了一个非常简单的接口. 最简单的urllib2的应用代码只需要四行. 我们新建一个文件urllib2_