【Scrapy】学习记录2_爬虫Spider

原创 2016年11月08日 15:59:07

items.py:用来定义需要保存的变量,其中的变量用Field来定义,有点像python的字典
pipelines.py:用来将提取出来的Item进行处理,处理过程按自己需要进行定义

spiders:定义自己的爬虫

===========================================
1.测试示例爬虫
直接执行quotesbot示例工程spiders中爬虫toscrape-css

# -*- coding: utf-8 -*-
import scrapy


class ToScrapeCSSSpider(scrapy.Spider):
    name = "toscrape-css"
    start_urls = [
        'http://quotes.toscrape.com/',
    ]

    def parse(self, response):
        for quote in response.css("div.quote"):
            """css选择器表示选择元素"""
            yield {
                'text': quote.css("span.text::text").extract_first(),   #选择class="text"的span标签
                'author': quote.css("small.author::text").extract_first(),
                'tags': quote.css("div.tags > a.tag::text").extract()   #选择class="tags"的<div>标签中,class="tags"的<a>子标签
            }

        next_page_url = response.css("li.next > a::attr(href)").extract_first()
        if next_page_url is not None:
            yield scrapy.Request(response.urljoin(next_page_url))

cd进入spiders目录后,敲入command:

scrapy runspider toscrape-css.py

执行toscrape-css爬虫

[执行结果]

... ...
2016-11-08 15:30:50 [scrapy] DEBUG: Scraped from <200 http://quotes.toscrape.com
/page/10/>
{'text': u'\u201c... a mind needs books as a sword needs a whetstone, if it is t
o keep its edge.\u201d', 'tags': [u'books', u'mind'], 'author': u'George R.R. Ma
rtin'}
2016-11-08 15:30:50 [scrapy] INFO: Closing spider (finished)
2016-11-08 15:30:50 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/exception_count': 1,
 'downloader/exception_type_count/twisted.internet.error.DNSLookupError': 1,
 'downloader/request_bytes': 3086,
 'downloader/request_count': 12,
 'downloader/request_method_count/GET': 12,
 'downloader/response_bytes': 24812,
 'downloader/response_count': 11,
 'downloader/response_status_count/200': 10,
 'downloader/response_status_count/404': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2016, 11, 8, 7, 30, 50, 864000),
 'item_scraped_count': 100,
 'log_count/DEBUG': 113,
 'log_count/INFO': 9,
 'request_depth_max': 9,
 'response_received_count': 11,
 'scheduler/dequeued': 10,
 'scheduler/dequeued/memory': 10,
 'scheduler/enqueued': 10,
 'scheduler/enqueued/memory': 10,
 'start_time': datetime.datetime(2016, 11, 8, 7, 28, 42, 44000)}
2016-11-08 15:30:50 [scrapy] INFO: Spider closed (finished)

E:\PythonTest\quotesbot-scrapy\quotesbot\spiders>



2.爬虫Spider分析
class scrapy.spider.Spider

Spider是最简单的spider。每个其他的spider必须继承自该类(包括Scrapy自带的其他spider以及自己编写的spider)。

Spider并没有提供什么特殊的功能。

其仅仅请求给定的 start_urls/start_requests ,
并根据返回的结果(resulting responses)
调用spider的 parse 方法。

name
定义spider名字的字符串(string)。
spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的。 不过可以生成多个相同的spider实例(instance),这没有任何限制。

name是spider最重要的属性,而且是必须的。

allowed_domains
可选。包含了spider允许爬取的域名(domain)列表(list)。
当 OffsiteMiddleware 启用时, 域名不在列表中的URL不会被跟进。

start_urls
URL列表。
当没有制定特定的URL时,spider将从该列表中开始进行爬取。
因此,第一个被获取到的页面的URL将是该列表之一。 后续的URL将会从获取到的数据中提取。

start_requests()
该方法必须返回一个可迭代对象(iterable)。
该对象包含了spider用于爬取的第一个Request

当spider启动爬取并且未制定URL时,该方法被调用。
当指定了URL时,make_requests_from_url() 将被调用来创建Request对象。
该方法仅仅会被Scrapy调用一次,可以将其实现为生成器

该方法的默认实现是使用 start_urls 的url生成Request。

如果想要修改最初爬取某个网站的Request对象,可以重写(override)该方法。
例如,如果需要在启动时以POST登录某个网站:

def start_requests(self):
    return [scrapy.FormRequest("http://www.example.com/login",
                               formdata={'user': 'john', 'pass': 'secret'},
                               callback=self.logged_in)]

def logged_in(self, response):
    # here you would extract links to follow and return Requests for
    # each of them, with another callback
    pass

make_requests_from_url(url)
该方法接受一个URL并返回用于爬取的 Request 对象。
该方法在初始化request时被 start_requests() 调用,也被用于转化url为request。

默认未被复写(overridden)的情况下,该方法返回的Request对象中, parse() 作为回调函数,dont_filter参数也被设置为开启。

parse(response)
当response没有指定回调函数时,该方法是Scrapy处理下载的response的默认方法。
parse 负责处理response并返回处理的数据以及(/或)跟进的URL。

Spider 对其他的Request的回调函数也有相同的要求。

该方法及其他的Request回调函数必须返回一个包含 Request 及(或) Item 的可迭代的对象。

参数: response (Response) – 用于分析的response

log(message[, level, component])
使用 scrapy.log.msg() 方法记录(log)message。 log中自动带上该spider的 name 属性。
更多数据请参见 Logging

closed(reason)
当spider关闭时,该函数被调用。
该方法提供了一个替代调用signals.connect()来监听 spider_closed 信号的快捷方式。

版权声明:ShirleyPaul原创,未经博主允许不得转载

相关文章推荐

scrapy避免直接输出unicode

我们使用scrapy crawl xxx -o xxx.json时,scrapy时直接输出unicode格式 解决方案 1.pipeline中对items进一步处理 class ...

ubuntu14.04在Vim上配置Python开发环境

A 安装Vimsudo apt-get install vimB 在用户主目录创建bundle文件夹mkdir -p ~/.vim/bundleC 安装Vundlegit clone https://...

设置 Vim c语言的语法高亮

设置 Vim c语言的语法高亮 vim简介 Vim(Vi Improved) 是一个类似于vi 的文本编辑器,在Vi的基础上增加了很多新的特性和功能。Vim以其强大的功能和可定制能力,...
  • gaojava
  • gaojava
  • 2013年01月10日 11:11
  • 10208

scrapy 入门教程 爬虫 Spider

原文转自http://www.cnblogs.com/txw1958/archive/2012/07/16/scrapy-tutorial.html,感谢作者。 在这篇入门教程中,我们假定你...
  • mfcing
  • mfcing
  • 2015年02月08日 09:36
  • 1708

Scrapy源码分析-所有爬虫的基类-Spider(二)

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(...

Scrapy系列教程(3)------Spider(爬虫核心,定义链接关系和网页信息抽取)

Spiders Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取...
  • iloveyin
  • iloveyin
  • 2014年11月20日 11:03
  • 32982

Scrapy爬虫入门教程四 Spider(爬虫)

Scrapy爬虫入门教程 Spider(爬虫)
  • Inke88
  • Inke88
  • 2017年03月06日 11:42
  • 1342

网络爬虫(Spider)python研究(2)-网页编码解析

网页编码格式比较多,比如utf8,gb2313等等,我们需要转化成统一格式,便于解析文本。headers = { 'x-requestted-with': 'XMLHttpRequest', ...

学习脚步---- 网络爬虫(Spider)Java实现原理(转载)

学习脚步---- 网络爬虫(Spider)Java实现原理(转载) Java网络协议SwingHTML.net                                      ...

爬虫框架Scrapy学习记录I--ing

Scrapy主要组件: 引擎(Scrapy)—-类似于中央cpu,发动机,安排各个部门的任务 调度器(Scheduler)—-队列,决定下一个抓取的URL 下载器(Downloader)—下载网页的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Scrapy】学习记录2_爬虫Spider
举报原因:
原因补充:

(最多只允许输入30个字)