Scrapy爬虫笔记【7-Scrapy核心知识基础】

本博客地址【http://blog.csdn.net/xiantian7

版权所有,违者必究

用过Scrapy一段时间后,发现还是有一些知识不是特别清晰,所以就把 Scrapy tutorial从前往后的部分不清楚的知识总结了一下。

1、 item类的使用

item类就类似于Python中dictionary类一样的容器,所以item类也有dictionary类似的操作【下面使用交互界面】

Creating items

>>> product = Product(name='Desktop PC', price=1000)
>>> print product
Product(name='Desktop PC', price=1000)

Getting field values

>>> product['name']
Desktop PC
>>> product.get('name')
Desktop PC

>>> product['price']
1000

>>> product['last_updated']
Traceback (most recent call last):
    ...
KeyError: 'last_updated'

>>> product.get('last_updated', 'not set')
not set

>>> product['lala'] # getting unknown field
Traceback (most recent call last):
    ...
KeyError: 'lala'

>>> product.get('lala', 'unknown field')
'unknown field'

>>> 'name' in product  # is name field populated?
True

>>> 'last_updated' in product  # is last_updated populated?
False

>>> 'last_updated' in product.fields  # is last_updated a declared field?
True

>>> 'lala' in product.fields  # is lala a declared field?
False

Setting field values

>>> product['last_updated'] = 'today'
>>> product['last_updated']
today

>>> product['lala'] = 'test' # setting unknown field
Traceback (most recent call last):
    ...
KeyError: 'Product does not support field: lala'

Accessing all populated values

>>> product.keys()
['price', 'name']

>>> product.items()
[('price', 1000), ('name', 'Desktop PC')]

还有一些复制,克隆等操作,就略过了···当然,可以用继承的方法来扩展自己写的item类


2、关于回调函数parse

如第一篇中所说的我们从start_urls来获的最开始需要爬取的url,然后用start_requests生成request,然后parse这个函数就会被默认的调用来处理这些request

如果没有重写上面这些函数,那么就会调用基类中的同名函数。

这里需要注意的是,如果使用CrawlSpider作为蜘蛛的基类,因为这个基类中有一个rule方法来规定一些处理链接的法则,那么在这个法则中我们常常也需要指定一个函数来作为回调函数来进行对应的处理。这个时候,这个回调函数不能指定为parse

因为CrawlSpider已经在内在的逻辑中使用到自己定义的parse,所以重写这个函数会破坏程序原有的逻辑,蜘蛛就不会工作了,我们需要自己重新定义一个回调函数,重要的是函数名字不能为parse。

3、什么是Item Loaders

item类是用来存储爬取数据的容器,Item Loaders就是一种填满这些容器的一种机制

当然,这个Item Loaders一般是用在parse这个函数里面,就想下面这样。

from scrapy.contrib.loader import ItemLoader
from myproject.items import Product

def parse(self, response):
    l = ItemLoader(item=Product(), response=response)
    l.add_xpath('name', '//div[@class="product_name"]')
    l.add_xpath('name', '//div[@class="product_title"]')
    l.add_xpath('price', '//p[@id="price"]')
    l.add_css('stock', 'p#stock]')
    l.add_value('last_updated', 'today') # you can also use literal values
    return l.load_item()

我们先实例化了一个Itemloader的对象,用:

  1. //div[@class="product_name"]

  2. //div[@class="product_title"]

两句话把两个不同地方的数据,加入到了这个name;接下来的两据使用不同的select 的方法来提取数据,另外一种方式就是直接用字面值来填,充,用的方法就是add_value()

经过上面这写过程以后,数据“收集”完毕,接下来就是返回这个已经填充好的item,用的语句就是return ItemLoader.load_item()

4、命令行中怎么保存控制台信息,怎么将爬取item信息存取到JSON文件中

scrapy crawl 爬虫名--logfile=日志名.log

上面这一句就是将控制台中输出的信息存储到日志文件中

scrapy crawl 爬虫名--logfile=日志名.log -o 输出文件名.json -t json

Scrapy会把解析后返回的item序列化为json格式并保存在test.json文件中

5、setting这个文件时怎么起作用的?

刚开始使用Scrapy的时候,发现每个组件貌似都是默认被使用的,只要名字按要求的定义,那么这个组件就会在适当的时候被调用,为什么会这样子呢,其实都是setting这个文件在起作用,setting中利用“宏”来规定每流程中的每一个部分需要使用的组件,当然,我们默认建立的Scrapy工程中的setting文件没有内容,这是因为大多数基本的“宏都有默认值了“,当然我我们想显示的改变这些默认值得时候,就需要在setting文件中写出来。就像下面写的一样

SPIDER_MODULES = ['dirbot.spiders']
NEWSPIDER_MODULE = 'dirbot.spiders'
DEFAULT_ITEM_CLASS = 'dirbot.items.Website'

ITEM_PIPELINES = ['dirbot.pipelines.FilterWordsPipeline']
后面的模块式一个工程中定义的模块名字,每行被赋值的大写就是上面所说的”宏“

每个宏的详细定义可以点击:点我
6、关于安装时候的流程

又另一台电脑上配置了一遍Scrapy,所以记一下配置大致

可以参考下:http://www.cnblogs.com/CLTANG/archive/2011/07/05/2098531.html

1、安装twisted,安装twisted的过程又需要依赖zope.interface,PyopenSSL【前者exe文件,后者setup.py】

遇到easy_install报UnicodeDecodeError: 'ascii' codec can't decode byte

PyopenSSL  貌似能安装上0.12版

2、libxml2 容易安装

3、还需要安装w3lib

4、还需要安装queuelib

5.  还需要安装pywin32

最重要的是·····我发现安装Scrapy的时候,在这个安装过程中,仍然会自动下载一些依赖文件,但是有时候会发现网站链接不上出现time out 等错误,多次几次就好了··

终于····Scrapy安装上了···得意

7、start_url处理得到的response是什么?

response.body是链接对应的页面

response.url就是这个链接

另外添加环境变量的时候 加上的是:C:\Python27\Scripts

8、蜘蛛文件中定义多个蜘蛛的时候

这种情况下,虽然在执行时候,可以只执行一个,但是貌似其他蜘蛛除了不会执行爬取功能,其他部分还是会执行的,比如说

在建立文件的时候,蜘蛛a建立文件1.txt,蜘蛛b读取文件1.txt,这时候先执行a,那么执行后,1.txt文件时有内容的,这个时候再执行蜘蛛b,执行后,1.txt变成了空文件

在官方教程上也没有看到解释,所以只能推测了···


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值