我的Scrapy / Elasticsearch脚本返回"无法序列化"错误

时间:2017-12-12 22:18:07

标签: python elasticsearch scrapy

所以大家,在过去的18个小时里,我一直在拼命寻找代码中的错误解决方法,我认为现在是时候寻求帮助。

我正在构建网络抓取工具,其目标是下载网页,抓取锚文本,内部链接,引荐来源网址以及将数据保存到数据库。这是我的Scrapy代码的相关部分;

def parse_items(self, response):
    item = InternallinkItem()

    # Current URL
    item["current_url"] = response.url

    # get anchor text and clean it
    anchor = response.meta.get('link_text')
    item["anchor_text"] = " ".join(anchor.split())


   # get the referrer URL (Problem is here)
   referring_url = response.request.headers.get('Referer')
   item["referring_url"] = referring_url


    yield item

我使用的技术是Python,Scrapy,Elasticsearch。它们都是最新的,我的开发环境是Windows。当我运行上面的代码时,我遇到了这个错误;

raise TypeError("Unable to serialize %r (type: %s)" % (data, type(data)))

TypeError: Unable to serialize b'https://example.com' (type: <class 'bytes'>)

所以,经过这么多试验和错误后,我能够追踪并查明问题。当我删除抓取引荐来源网址的部分时,一切正常。它获取我想要的数据并成功保存到Elasticsearch。

作为一个对编程比较陌生的人,我不知道如何继续。

我尝试过,以其他方式获取引荐来源网址,但没有工作......

尝试编写我自己的管道,而不是使用scrapy-elasticsearch库,但得到了同样的错误,还给了一个从字节到STR改变类型的镜头,你猜对了,它也没有工作。

任何帮助都会受到高度赞赏,因为我真的被困在这里!

编辑: 我的settings.py文件;

ITEM_PIPELINES = {
    'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline': 500
}

ELASTICSEARCH_SERVERS = ['localhost'] 
ELASTICSEARCH_INDEX = 'myindex'
ELASTICSEARCH_TYPE = 'internallink'
#ELASTICSEARCH_UNIQ_KEY = ['current_url']

2 个答案:

答案 0 :(得分:1)

好吧,在喝了9杯咖啡并将我的头撞在墙上20个小时后,我能够解决这个问题。这很简单我在这里张贴它几乎感到羞耻,但这里什么都没有;

当我昨天第一次收到错误时,我尝试像这样解码推荐者

    referring_url = response.request.headers.get('Referer')
    item["referring_url"] = referring_url.decode('utf-8')

它没有用......直到我把它改成这个;

    referring_url = response.request.headers.get('Referer').decode('utf-8')
    item["referring_url"] = referring_url

我不知道为什么或如何,但它的确有效。

非常感谢@alecxe和@furas推动我朝着正确的方向前进。

答案 1 :(得分:0)

确保您安装的Elasticsearch模块与Elasticsearch服务器兼容。

Scrapy-elasticsearch使用Elasticsearch模块的v7〜版本,但服务器可能未更新。我遇到了同样的问题,将其修复的模块降级了。

文档:

对于Elasticsearch 7.0和更高版本,请使用该库的主要版本7(7.x.y)。

对于Elasticsearch 6.0和更高版本,请使用该库的主要版本6(6.x.y)。

对于Elasticsearch 5.0和更高版本,请使用该库的主要版本5(5.x.y)。

对于Elasticsearch 2.0和更高版本,使用库的主要版本2(2.x.y),依此类推。