2015-09-24 2 views
1

У меня есть код ScraPy, который работает в оболочке, но когда я пытаюсь экспортировать его в csv, он возвращает пустой файл. Он экспортирует данные, когда я не вхожу в ссылку, и пытаюсь разобрать описание, но как только я добавлю дополнительный метод анализа содержимого, он не сработает. Вот код:ScraPy spider сканирует, но не экспортирует

class MonsterSpider(CrawlSpider): 
    name = "monster" 
    allowed_domains = ["jobs.monster.com"] 
    base_url = "http://jobs.monster.com/v-technology.aspx?" 
    start_urls = [ 
     "http://jobs.monster.com/v-technology.aspx" 
    ] 
    for i in range(1,5): 
     start_urls.append(base_url + "page=" + str(i)) 

    rules = (Rule(SgmlLinkExtractor(allow=("jobs.monster.com",)) 
     , callback = 'parse_items'),) 

    def parse_items(self, response): 
     sel = Selector(response) 
     sites = sel.xpath('//div[@class="col-xs-12"]') 

     #items = [] 

     for site in sites.xpath('.//article[@class="js_result_row"]'): 
      item = MonsterItem() 
      item['title'] = site.xpath('.//span[@itemprop = "title"]/text()').extract() 
      item['company'] = site.xpath('.//span[@itemprop = "name"]/text()').extract() 
      item['city'] = site.xpath('.//span[@itemprop = "addressLocality"]/text()').extract() 
      item['state'] = site.xpath('.//span[@itemprop = "addressRegion"]/text()').extract() 
      item['link'] = site.xpath('.//a[@data-m_impr_a_placement_id= "jsr"]/@href').extract() 
      follow = ''.join(item["link"]) 
      request = Request(follow, callback = self.parse_dir_contents) 
      request.meta["item"] = item 
      yield request 
      #items.append(item) 
      #return items 

    def parse_dir_contents(self, response): 
     item = response.meta["item"] 
     item['desc'] = site.xpath('.//div[@itemprop = "description"]/text()').extract() 
     return item 

вынимая parse_dir_contents и раскомментирован пустой список «списков» и «добавить» код был исходный код.

ответ

2

Ну, поскольку @tayfun предлагает вам использовать response.xpath или определить переменную site.

Кстати, вам не нужно использовать sel = Selector(response). Ответы идут с функцией xpath, нет необходимости закрывать ее в другом селекторе.

Однако Основная проблема заключается в том, что вы ограничиваете домен паука. Вы определяете allowed_domains = ["jobs.monster.com"], однако, если вы посмотрите на URL-адрес follow вашего пользователя Request, вы увидите, что они что-то вроде http://jobview.monster.com/ или http://job-openings.monster.com. В этом случае ваш parse_dir_contents не выполнен (домен не разрешен), и ваш item не возвращается, так что вы не получите никаких результатов.

Изменение allowed_domains = ["jobs.monster.com"] в

allowed_domains = ["monster.com"] 

и вам будет хорошо, и ваше приложение будет работать и возврат товаров.

+0

спасибо! это создало выход, но теперь поля немного перепутались. придется устранить проблему, чтобы получить правильный вывод, но это устранило проблему. – genghistong

0

У Вас есть ошибка в вашем методе parse_dir_contents:

def parse_dir_contents(self, response): 
    item = response.meta["item"] 
    item['desc'] = response.xpath('.//div[@itemprop=description"]/text()').extract() 
    return item 

Обратите внимание на использование response. Я не знаю, где вы получили site, из которого вы сейчас используете.

Кроме того, постарайтесь предоставить сведения об ошибке при отправке вопроса. Написание «он не работает» не говорит много.

+0

согласны с включением сведений об ошибках, за исключением того, что паук работает нормально, но в результирующем файле csv нет вывода. – genghistong