2016-05-22 11 views
0

Ich schreibe eine Webspinne, um Benutzerinformationen über Stapelüberlauf zu erhalten. Und ich versuche die Informationen mit mongodb zu speichern. hier ist der Code für meine Web-Spider, der gut arbeitet:scrapy verwenden mongodb, um Informationen zu speichern

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 

und hier ist meine Pipeline-Datei und Einstellungen, die wahrscheinlich falsch ist:

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 

Einstellungen:

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' 

der Fehler, den ich bekomme, ist wie folgt:

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

Ich bin hier wirklich verwirrt. Plz hilf mir hier draußen.

+0

Sie sollten das nicht tun, geht es gegen Stackoverflow [TOS] (http://meta.stackexchange.com/questions/277369/a-terms-of-service-update-restricting-companies -das-scrape-your-profile-informa? rq = 1) –

Antwort

0

Ihre Pipeline sieht gut aus. Deine Spinne ist etwas komisch. Hier ist eine Version, die ein bisschen besser funktioniert:

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

hatte ich das gleiche Problem Ersetzen Sie Ihre Liste

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

von einem dict

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

„Die Integer-Werte, die Sie zuweisen Klassen in dieser Einstellung bestimmen die Reihenfolge, in der sie laufen In-Items durchlaufen Pipelines von der Bestellnummer niedrig zu hoch Es ist üblich, diese Nummern im 0-1000-Bereich zu definieren e. " Quelle: http://doc.scrapy.org/en/0.24/topics/item-pipeline.html#activating-an-item-pipeline-component

Verwandte Themen