2015-10-19 6 views
1

Я пытаюсь рекурсивно очистить названия заданий от https://iowacity.craigslist.org/search/jjj. То есть, я хочу, чтобы паук соскребал все названия работ на странице 1, а затем переместился по ссылке «далее>» внизу, чтобы очистить следующую страницу и так далее. Я передразнил учебник Майкла Хермана, чтобы написать своего паука. http://mherman.org/blog/2012/11/08/recursively-scraping-web-pages-with-scrapy/#.ViJ6rPmrTIU.Нет данных, скребковых после рекурсивного выскабливания

Вот мой код:

import scrapy 
from craig_rec.items import CraigRecItem 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 


class CraigslistSpider(CrawlSpider): 
    name = "craig_rec" 
    allowed_domains = ["https://craigslist.org"] 
    start_urls = ["https://iowacity.craigslist.org/search/jjj"] 

    rules = (
     Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True), 
) 

    def parse_items(self, response): 
     items = [] 
     for sel in response.xpath("//span[@class = 'pl']"): 
      item = CraigRecItem() 
      item['title'] = sel.xpath("a/text()").extract() 
      items.append(item) 
     return items 

Я выпустил паук, но никаких данных не соскабливают. Любая помощь? Благодаря!

+0

Зачем вам задавать один и тот же вопрос дважды, если решение будет одинаковым для обоих ваших пауков? – GHajba

ответ

1

Когда вы установили допустимые_домены в «https://craigslist.org», он прекращает сканирование из-за внешнего запроса на субдомен «iowacity.craigslist.org».

Вы должны установить его как:

allowed_domains = ["craigslist.org"] 

Согласно docsallowed_domains представляет собой список строк, содержащих домены, которые этот паук разрешено ползать. Он ожидает, что он будет в формате domain.com, что позволяет самому домену и всем подобластям разбираться пауком.

Вы также можете быть конкретным, позволяя использовать только несколько субдоменов или разрешать все запросы, оставив атрибут пустым.

+0

Андре, спасибо за ваш ответ! Я внес изменения в своего паука, и теперь он работает хорошо. Но тем не менее, я не совсем понимаю разницу между 'allowed_domains = [" craigslist.org "]' и 'allowed_domains = [" http://craigslist.org "]'. Не могли бы вы объяснить немного больше? Я действительно новичок в Scrapy. Большое спасибо! –

+0

Я не уверен, почему Scrapy не справляется с включением префикса https. В соответствии с примером не следует делать так. Не знаю, разрешает ли он только корневой домен, или если он принимает всю строку «http: // craigslist» в качестве домена. –

1

Учебное пособие Михаэля Германа отлично, но для более старой версии терапии. Этот фрагмент кода позволяет избежать появления предупреждений устаревания, а также превращает parse_page в генератор:

import scrapy 
from craig_rec.items import CraigRecItem 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 


class CraiglistSpider(CrawlSpider): 
    name = "craiglist" 
    allowed_domains = ["craigslist.org"] 
    start_urls = (
     'https://iowacity.craigslist.org/search/jjj/', 
    ) 

    rules = (
     Rule(LinkExtractor(restrict_xpaths=('//a[@class="button next"]',)), 
      callback="parse_page", follow=True), 
    ) 

    def parse_page(self, response): 
     for sel in response.xpath("//span[@class = 'pl']"): 
      item = CraigRecItem() 
      item['title'] = sel.xpath(".//a/text()").extract() 
      yield item 

Это post также имеет некоторые большие советы по выскабливание Craigslist.

+0

Я ценю ваш отличный ответ, Луис! –

Смежные вопросы