所以大家,在过去的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']
答案 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),依此类推。