2016-05-22 176 views
0

私はスタックオーバーフローに関するユーザー情報を取得するためにWebスパイダーを作成しています。そして私はmongodbを使って情報を保存しようとしています。ここ は正常に動作します私のWebスパイダー、のためのコードです:scrapy mongodbを使用して情報を保存する

import pymongo 


from scrapy import log 
from scrapy.conf import settings 

class Spider1Pipeline(object): 
    def __init__(self): 

     connection = pymongo.Connection(
      settings['MONGODB_SERVER'],settings['MONGODB_PORT']) 
     db = connection[settings['MONGODB_DB']] 

     self.collection = db[settings['MONGODB_COLLECTION']] 

    def process_item(self, item, spider): 
     self.collection.insert(dict(item)) 
     log.msg('Item written to MongoDB database ',level=log.DEBUG, spider=spider) 
     return item 

設定:

BOT_NAME = 'test1' 

SPIDER_MODULES = ['test1.spiders'] 
NEWSPIDER_MODULE = 'test1.spiders' 


ROBOTSTXT_OBEY = True 

ITEM_PIPELINES = ['test1.pipelines.Spider1Pipeline',] 

MONGODB_SERVER='localhost' 
MONGODB_PORT=27017 
MONGODB_DB='test1' 
MONGODB_COLLECTION='user_info' 

class webSpider(Spider): 
    name = "user_spider1" 
    allowed_domains = ["stackoverflow.com"] 
    start_urls = [] 
def start_requests(self): 
    for i in range(1,2): 
     self.start_urls.append( "http://stackoverflow.com/users?page="+ str(i)+"&tab=reputation&filter=week") 
    for url in self.start_urls: 
     yield self.make_requests_from_url(url) 

def parse(self, response): 

    htmlTxt = response.body 
    baseDomain = etree.HTML(htmlTxt) 

    userSubUrl = baseDomain.xpath('//div[@class="user-details"]/a/@href') 
    baseUrl = 'http://stackoverflow.com' 
    for subUrl in userSubUrl: 


     yield Request(baseUrl+subUrl,callback=self.parse_userinfo) 

def parse_userinfo(self,response): 
    htmlTxt = response.body 
    infoDomain = etree.HTML(htmlTxt) 

    item['user_name'] = stringprocessor(str(infoDomain.xpath('//h2[@class="user-card-name"]/text()[1]'))) 
    item['user_location'] = stringprocessor(str(infoDomain.xpath('//ul[@class="list-unstyled"]/li[1]/text()[2]'))) 
    item['user_reputation'] = stringprocessor(str(infoDomain.xpath('//div[@class="reputation"]/text()[1]'))) 
    tags = infoDomain.xpath('//div[@class="tag-container row"]/div/a[@class="post-tag"]/text()') 

    item['user_tags'] = tags 
    yield item 

、ここでは、おそらく間違っている私のパイプラインファイルと設定、です

エラーは次のようになります。

AttributeError: 'list' object has no attribute 'iteritems' 

私は本当にここで混乱しています。 Plzは私をここで助けます。

+0

あなたはそれを行うべきではありません、それはstackoverflowのに反し[TOS](http://meta.stackexchange.com/questions/277369/a-terms-of-service-update-restricting-companies - あなたのプロファイル情報 - rq = 1) –

答えて

0

あなたのパイプラインは大丈夫です。あなたのクモはやや奇妙です。ここでは少し良く働くバージョンがあります:

import scrapy 
from scrapy import Request 

class WebSpider(scrapy.Spider): 
    name = "user_spider1" 
    allowed_domains = ["stackoverflow.com"] 
    start_urls = [] 

    def start_requests(self): 
     for i in range(1,2): 
      self.start_urls.append( "http://stackoverflow.com/users?page="+ str(i)+"&tab=reputation&filter=week") 
     for url in self.start_urls: 
      yield self.make_requests_from_url(url) 

    def parse(self, response): 
     userSubUrl = response.xpath('//div[@class="user-details"]/a/@href').extract() 
     baseUrl = 'http://stackoverflow.com' 
     for subUrl in userSubUrl: 
      yield Request(baseUrl+subUrl, callback=self.parse_userinfo) 

    def parse_userinfo(self,response): 
     item = {} 

     stringprocessor = lambda x: x 
     item['user_name'] = stringprocessor(str(response.xpath('//h2[@class="user-card-name"]/text()[1]').extract_first())) 
     item['user_location'] = stringprocessor(str(response.xpath('//ul[@class="list-unstyled"]/li[1]/text()[2]').extract_first())) 
     item['user_reputation'] = stringprocessor(str(response.xpath('//div[@class="reputation"]/text()[1]').extract_first())) 
     tags = response.xpath('//div[@class="tag-container row"]/div/a[@class="post-tag"]/text()').extract_first() 

     item['user_tags'] = tags 
     yield item 
0

私は同じ問題 が整数であなたに割り当てた値」

ITEM_PIPELINES = {'test1.pipelines.Spider1Pipeline':300} 

辞書によって

ITEM_PIPELINES = ['test1.pipelines.Spider1Pipeline',] 

あなたのリストを交換していましたこの設定のクラスは、イン - アイテムで実行される順序を決定します。オーダー番号が低いものから高いものへのパイプラインを経由します。これらの数値は、0-1000の範囲で定義するのが通例ですe。 " ソースは:http://doc.scrapy.org/en/0.24/topics/item-pipeline.html#activating-an-item-pipeline-component

関連する問題