小编Sha*_*Lau的帖子

如何在scrapy中实现嵌套项?

我正在使用复杂的分层信息来抓取一些数据,并且需要将结果导出到json.

我将这些项目定义为

class FamilyItem():
    name = Field()
    sons = Field()

class SonsItem():
    name = Field()
    grandsons = Field()

class GrandsonsItem():
    name = Field()
    age = Field()
    weight = Field()
    sex = Field()
Run Code Online (Sandbox Code Playgroud)

当蜘蛛完成时,我会得到一个打印的项目输出

{'name': 'Jenny',
   'sons': [
            {'name': u'S1',
             'grandsons': [
                   {'name': u'GS1',
                    'age': 18,
                    'weight': 50
                   },
                   {
                    'name':u'GS2',
                    'age': 19,
                    'weight':51}]
                   }]
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行时scrapy crawl myscaper -o a.json,它总是说结果"不是JSON可序列化的".然后我将项目输出复制并粘贴到ipython控制台并使用json.dumps(),它工作正常.所以问题出在哪里?这是我的疯狂......

python json scrapy

24
推荐指数
2
解决办法
8911
查看次数

如何处理scrapy项目中的各种异常,在errback和回调中?

我目前正在开发一个刮刀项目,这对于确保每个请求得到妥善处理非常重要,即记录错误或保存成功结果.我已经实现了基本的蜘蛛,我现在可以成功处理99%的请求,但是我可能会遇到像captcha,50x,30x,甚至结果中没有足够字段的错误(然后我会尝试另一个网站到找到缺少的字段).

起初,我认为在解析回调中引发异常并在errback中处理所有异常更"合乎逻辑",这可以使代码更具可读性.但我试图发现errback只能捕获下载器模块中的错误,例如非200响应状态.如果我在回调中引发一个自我实现的ParseError,那么蜘蛛只会提升它并停止.

即使我必须直接在回调中处理解析请求,我也不知道如何在回调中立即以干净的方式重试请求.你知道,我可能必须包含一个不同的代理来发送另一个请求,或修改一些请求标头.

我承认我对scrapy相对较新,但我已经来回试了好几天但仍然无法让它工作......我已经检查过每一个问题而没有人匹配,提前感谢你的帮助.

更新:我意识到这可能是一个非常复杂的问题所以我试着在下面的伪代码中说明这个场景,希望这会有所帮助:

from scraper.myexceptions import *

def parseRound1(self, response):

    .... some parsing routines ...
    if something wrong happened:
       # this causes the spider raises a SpiderException and stops
       raise CaptchaError
    ...

    if no enough fields scraped:
       raise ParseError(task, "no enough fields")
    else:
       return items

def parseRound2(self, response):
    ...some other parsing routines...

def errHandler(self, failure):
    # how to trap all the exceptions?
    r = failure.trap()
    # cannot trap ParseError here
    if r == CaptchaError:
       # how to enqueue …
Run Code Online (Sandbox Code Playgroud)

python scrapy

10
推荐指数
2
解决办法
5552
查看次数

我在哪里可以找到amzn repo的源rpm?

我需要在我的Centos6 EC2实例上构建一个RPM包,所以我认为最好使用amzn的"官方"规范.通常我这样做,yumdownloader --source xxx但在EC2实例上它找不到任何东西.

我查了一下/etc/yum.repo.d,似乎没有关于src的任何回购.

rpm amazon-ec2

4
推荐指数
1
解决办法
5415
查看次数

标签 统计

python ×2

scrapy ×2

amazon-ec2 ×1

json ×1

rpm ×1