Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当将碎片项存储到couchdb时,它们不可JSON序列化_Python_Json_Couchdb_Scrapy - Fatal编程技术网

Python 当将碎片项存储到couchdb时,它们不可JSON序列化

Python 当将碎片项存储到couchdb时,它们不可JSON序列化,python,json,couchdb,scrapy,Python,Json,Couchdb,Scrapy,我的刮刀 从scrapy.contrib.spider导入爬行爬行爬行器,规则 从scrapy.contrib.linkextractors.sgml导入SgmlLinkExtractor 从scrapy.selector导入HtmlXPathSelector 从scrapy.item导入项目 从scrapy.spider导入BaseSpider 从scrapy导入日志 从scraper.items导入bookItem、属性、供应商 进口couchdb 导入日志记录 导入json 导入时间 从

我的刮刀

从scrapy.contrib.spider导入爬行爬行爬行器,规则
从scrapy.contrib.linkextractors.sgml导入SgmlLinkExtractor
从scrapy.selector导入HtmlXPathSelector
从scrapy.item导入项目
从scrapy.spider导入BaseSpider
从scrapy导入日志
从scraper.items导入bookItem、属性、供应商
进口couchdb
导入日志记录
导入json
导入时间
从couchdb导入服务器
类自由蜘蛛(爬行蜘蛛):
coach=couchdb.Server()
db=coach['python-tests']
name=“libertybooks”
允许的_域=[“libertybooks.com”]
未访问的\u URL=[]
已访问的URL=[]
起始URL=[
"http://www.libertybooks.com"
]
url=[”http://www.kaymu.pk"]
规则=[规则(SgmlLinkExtractor(),callback='parse_item',follow=True)]
总数=0
productpages=0
exceptionnum=0
def解析_项(自身、响应):
如果response.url.find(“pid”)=-1:
打开(“number.html”、“w”)作为w:
self.total=self.total+1
w、 写(str(self.total)+“,“+str(self.productpages))
itm=bookItem()
attrib=属性()
ven=供应商()
图像=[]
尝试:
name=response.xpath('//span[@id=“pagecontent\u lbookname”]/text()).extract()[0]
name=name.encode('utf-8')
除:
name=“找不到名称”
尝试:
price=response.xpath('//span[@id=“pagecontent\u lblPrice”]/text()).extract()[0]
价格=价格。编码('utf-8')
除:
价格=-1
尝试:
marketprice=response.xpath('//span[@id=“pagecontent\u lblmarketprice”]/text()).extract()[0]
marketprice=marketprice.encode('utf-8')
除:
市场价格=-1
尝试:
pages=response.xpath('//span[@id=“pagecontent\u spanpages”]/text()).extract()[0]
pages=pages.encode('utf-8')
除:
页数=-1
尝试:
author=response.xpath('//span[@id=“pagecontent\u lblautor”]/text()).extract()[0]
author=author.encode('utf-8')
除:
author=“找不到作者”
尝试:
description=response.xpath('//span[@id=“pagecontent\u lbookdetail”]/text()).extract()[0]
description=description.encode('utf-8')
除:
description=“des:未找到”
尝试:
image=response.xpath('//img[@id=“pagecontent\u imgProduct”]/@src')。extract()[0]
image=image.encode('utf-8')
除:
image=“#”
ven['title']='libertybooks'
ven['order_url']=response.url
itm['vendor']=ven
itm['time_scraped']=time.ctime()
itm['title']=名称
itm['url']=response.url
itm['price']=价格
itm['marketprice']=市场价格
itm['images']=图像
attrib['pages']=页面
attrib['author']=作者
属性['description']=描述
itm['attributes']=attrib
自我保存数据库(itm)
返回itm
def saveindb(自身,obj):
logging.debug(obj)

self.db.save(obj)
那么,简短的答案就是使用:

较长的版本是:如果您希望这个爬行器增长(如果它不是一次性的事情),您可能希望使用a将项目存储在CouchDB中,并将关注点分开(爬行/抓取爬行器代码,存储在数据库中管道代码)


起初,这看起来像是过度工程化,但当项目开始增长时,它确实很有帮助,并且使测试更容易。

我已经将存储代码分离到管道中,并使用self.db.save(_encoder.encode(obj)),但它仍然不起作用,并且说(u'bad_content_type',u'content-type必须是application/json')其堆栈跟踪是File“/usr/local/lib/python2.7/dist packages/couchdb/http.py”,在post_json**params)文件“/usr/local/lib/python2.7/dist packages/couchdb/http.py”,在_requestjson headers=headers,**params)文件“/usr/local/lib/python2.7/dist packages/couchdb/http.py”,第529行,在_requestcredentials=self.credentials)文件中”/usr/local/lib/python2.7/dist packages/couchdb/http.py”,第383行,在request raise ServerError((状态,错误))couchdb.http.ServerError:(415,(u'bad_content_type',u'content-type必须是application/json'))@user3344528这看起来像是一个单独的问题,与如何使用CouchDB API保存JSON对象有关——抱歉,我对CouchDB不太熟悉。这可能是另一个问题的情况。您可以尝试使用hack:
self.db.save(JSON.loads(_encoder.encode(obj)))
——这是转换为纯Python的过程,它会记录编码的JSON,但可能有更好的方法。
items.py classes

import scrapy
from scrapy.item import Item, Field
import json


class Attributes(scrapy.Item):
    description = Field()
    pages=Field()
    author=Field()
class Vendor(scrapy.Item):
    title=Field()
    order_url=Field()

class bookItem(scrapy.Item):

    title = Field()
    url = Field()
    marketprice=Field()
    images=Field()
    price=Field()
    attributes=Field()
    vendor=Field()
    time_scraped=Field()
from scrapy.utils.serialize import ScrapyJSONEncoder
_encoder = ScrapyJSONEncoder()

    ...

    def saveindb(self,obj):
        logging.debug(obj)
        self.db.save(_encoder.encode(obj))