所以,伙计们,在过去的 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/