python - 我的 Scrapy/Elasticsearch 脚本返回 "Unable to serialize"错误

标签 python elasticsearch scrapy

所以,伙计们,在过去的 18 小时里,我一直在拼命寻找代码中错误的解决方法,我认为是时候寻求一些帮助了。

我正在构建一个网络抓取工具,其目标是下载页面、抓取 anchor 文本、内部链接、引用网址并将数据保存到数据库。这是我的 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 库,但遇到了相同的错误,也尝试将类型从 byte 更改为 STR,好吧,你猜对了,它也不起作用。

任何帮助将不胜感激,因为我真的被困在这里了!

编辑: 我的settings.py文件;

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

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

最佳答案

好吧,在喝了 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 将我推向正确的方向。

关于python - 我的 Scrapy/Elasticsearch 脚本返回 "Unable to serialize"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47782447/

相关文章:

python - 从字典创建饼图并更改箭头

elasticsearch - 在 Elasticsearch 查询的内联脚本中使用聚合函数

python - 如何使用 http 请求启动我的 scrapy 蜘蛛?

javascript - Scrapy从javascript脚本中提取数据

python - Python3 ssl 中手动验证证书

python - 无法使用 pyautogui 选择文本

Elasticsearch multi should 查询多个minimum_should_match

elasticsearch - Elasticsearch :查询字符串和数字并不总是返回所需结果

mysql - 从面包屑重新创建目录

python - 尝试 MNIST 数据集时,tensorflow 和 matplotlib 包出现问题