2016-07-11 6 views
0

Это мой первый опыт использования scrapy, и я пытаюсь поместить нужную мне информацию в файл csv, используя конвейер. Казалось, что все работает нормально, пока я не попытался очистить более чем одну страницу, и он начал возвращать пустой файл csv. Я думаю, что проблема заключается в пауке (так как когда я вносил изменения там, он прекратил работать правильно), но я поставлю конвейер на случай, если там что-то не так.Scrapy return blank csv

вот мой паук:

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from indeed.items import IndeedItem 


class IndeedSpider(CrawlSpider): 
    name = "indeed" 
    allowed_domains = ['www.indeed.com'] 
    start_urls = [ 
    'http://www.indeed.com/jobs?as_and=&as_phr=&as_any=&as_not=&as_ttl=&as_cmp=&jt=all&st=&salary=&radius=50&l=19103&fromage=30&limit=10&sort=&psf=advsrch' 
    ] 
    rules = (Rule(LinkExtractor(allow=('http://www.indeed.com/jobs?q=&l=19103&radius=50&fromage=30&start=.*'))),) 

    def parse_item(self, response): 
     for sel in response.xpath("//div[contains(@class, 'row ')]"): 
      items = [] 
      jobs = sel.xpath('//a[contains(@data-tn-element, "jobTitle")]/text()').extract() 
      city = sel.xpath('//span[@class="location"]/text()').extract() 
      company = sel.xpath('//span[@class="company"]/text()').extract() 
      for j, c, co in zip(jobs, city, company): 
       position = IndeedItem() 
       position['jobs'] = j.strip() 
       position['city'] = c.strip() 
       position['company'] = co.strip() 
       items.append(position) 
      yield items 

А вот мой трубопровод:

from scrapy import signals 
from scrapy.xlib.pydispatch import dispatcher 
from scrapy.exporters import CsvItemExporter 

class IndeedPipeline(object): 
    def process_item(self, item, spider): 
     return item 


class CsvExportPipeline(object): 

    def __init__(self): 
     dispatcher.connect(self.spider_opened, signals.spider_opened) 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 
     self.files = {} 

    def spider_opened(self, spider): 
     file = open('%s_jobs.csv' % spider.name, 'w+b') 
     self.files[spider] = file 
     self.exporter = CsvItemExporter(file) 
     self.exporter.start_exporting() 

    def spider_closed(self, spider): 
     self.exporter.finish_exporting() 
     file = self.files.pop(spider) 
     file.close() 

    def process_item(self, item, spider): 
     self.exporter.export_item(item) 
     return item 

Любая помощь будет оценена.

+1

Какие статы, когда ползать заканчивается? Он должен сказать, сколько предметов было очищено и т. Д. Может быть, все ваши предметы упали? – Granitosaurus

+0

Итак, он говорит '[scrapy] INFO: Просканировал 0 страниц (на 0 страницах/мин), очистил 0 пунктов (по 0 пунктов/мин)'. Так что, похоже, это часть проблемы. –

+0

есть проблема с вашим ползанием. Как обычно вы отлаживаете это, добавьте 'inspect_response (response, self)' где-то в функции синтаксического анализа и во время обхода сканирования выкинет режим оболочки, который вы можете использовать для проверки объекта 'response'. т. е. проверьте, что ваш xpath находит что-либо. – Granitosaurus

ответ

0

LinkExtractor не извлекает никаких ссылок.

если вы: scrapy shell "http://www.indeed.com/jobs?as_and=&as_phr=&as_any=&as_not=&as_ttl=&as_cmp=&jt=all&st=&salary=&radius=50&l=19103&fromage=30&limit=10&sort=&psf=advsrch"

и воссоздать вашу ссылку экстрактор в Scrapy оболочки:

from scrapy.linkextractor import LinkExtractor 
le = LinkExtractor(allow=('http://www.indeed.com/jobs?q=&l=19103&radius=50&fromage=30&start=.*')) 
le.extract_links(response) 

вы заметите, что он ничего не извлечь.
Вы должны проверить чиновника documentation on LinkExtractors и попытаться построить рабочий, используя тот же подход, а затем использовать его в своем паук.

+0

Спасибо, я посмотрю. –

+0

@MatthewBarnette не стесняйтесь принять ответ, если найдете его достаточно :) – Granitosaurus

+0

Извините, первый раз выкладываю на стек. Все еще сортировка протокола. –

0

попробовать это: (удалить //)

jobs = sel.xpath('a[contains(@data-tn-element, "jobTitle")]/text()').extract() 
    city = sel.xpath('span[@class="location"]/text()').extract() 
    company = sel.xpath('span[@class="company"]/text()').extract() 
+0

Теперь он работает, но спасибо за предложение. –