2015-09-17 3 views
4

У меня есть этот код для рамки Scrapy:Scrapy ползти со следующей страницей

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.contrib.spiders import Rule 
from scrapy.linkextractors import LinkExtractor 
from lxml import html 

class Scrapy1Spider(scrapy.Spider): 
    name = "scrapy1" 
    allowed_domains = ["sfbay.craigslist.org"] 
    start_urls = (
     'http://sfbay.craigslist.org/search/npo', 
    ) 

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

    def parse(self, response): 
     site = html.fromstring(response.body_as_unicode()) 
     titles = site.xpath('//div[@class="content"]/p[@class="row"]') 
     print len(titles), 'AAAA' 

Но проблема в том, что я получаю 100 результатов, это не идет на следующие страницы.

Что здесь не так?

ответ

7

Ваш rule не используется, потому что вы не используете CrawlSpider.

Таким образом, вы должны создать следующую страницу requests вручную следующим образом:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.contrib.spiders import Rule 
from scrapy.linkextractors import LinkExtractor 
from lxml import html 

class Scrapy1Spider(scrapy.Spider): 
    name = "craiglist" 
    allowed_domains = ["sfbay.craigslist.org"] 
    start_urls = (
     'http://sfbay.craigslist.org/search/npo', 
    ) 

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

    def parse(self, response): 
     site = html.fromstring(response.body_as_unicode()) 
     titles = site.xpath('//div[@class="content"]/p[@class="row"]') 
     print len(titles), 'AAAA' 

     # follow next page links 
     next_page = response.xpath('.//a[@class="button next"]/@href').extract() 
     if next_page: 
      next_href = next_page[0] 
      next_page_url = 'http://sfbay.craigslist.org' + next_href 
      request = scrapy.Request(url=next_page_url) 
      yield request 

Или использовать CrawlSpider так:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from lxml import html 

class Scrapy1Spider(CrawlSpider): 
    name = "craiglist" 
    allowed_domains = ["sfbay.craigslist.org"] 
    start_urls = (
     'http://sfbay.craigslist.org/search/npo', 
    ) 

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

    def parse_page(self, response): 
     site = html.fromstring(response.body_as_unicode()) 
     titles = site.xpath('//div[@class="content"]/p[@class="row"]') 
     print len(titles), 'AAAA' 
+0

вы можете дать мне пример с 'CrawlSpider'? И рекомендуется ли это? –

+0

Добавлен код 'CrawlSpider'. Обратите внимание, что вы не должны использовать 'parse' в качестве функции обратного вызова, потому что это используется внутри! –

+0

Спасибо, он отлично работает. –

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