2014-07-30 2 views
1

Пожалуйста, руководство меня, как писать Правило SgmlLinkExtractor
Я запутался и не могу выяснить английские документыScrapy: Правило концепция SgmlLinkExtractor

Я хочу ползать в Интернете с большим количеством страниц
И правило:

http://abctest.com/list.php?c=&&page=1 
http://abctest.com/list.php?c=&&page=2 
http://abctest.com/list.php?c=&&page=3 ... 

Вот мой код:

from scrapy.selector import Selector 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
import re 

class Spider(CrawlSpider): 
    name = "find" 
    start_urls = ["http://abctest.com/list.php?c=&&page=1",] 
    #crawl 2 pages to test if the data is normal allow=('?c=&&page=/d+') 
    rules = [Rule(SgmlLinkExtractor(allow=('?c=&&page=2')),callback='parse_item',follow=True)] 


    #get the page1 item 
    def parse(self, response): 
     sel = Selector(response) 
     sites = sel.css("div#list table tr ") 
     for site in sites: 
      item = LAItem() 
      item['day'] = site.css(" td.date::text ").extract() 
      item['URL'] = site.css(" td.subject a::attr(href) ").extract() 
     yield item 

    #get the page2 item  
    def parse_item(self, response): 
     sel = Selector(response) 
     sites = sel.css("div#list table tr ") 
     for site in sites: 
      item = LAItem() 
      item['day'] = site.css(" td.date::text ").extract() 
      item['URL'] = site.css(" td.subject a::attr(href) ").extract() 
     yield item 
+0

Знаете ли вы, сколько у вас страниц? – alecxe

+0

более 10, но я хочу протестировать всего 2 страницы, чтобы узнать, являются ли данные норнальными. – user2492364

ответ

1

Вы не повторно союзнику нужен LinkExtractor и CrawlSpider здесь - только обычный Spider. Что вам нужно определить start_requests() метод и доходности запросов от клиентов:

from scrapy import Request, Spider 
from scrapy.exceptions import CloseSpider 
from scrapy.selector import Selector 

URL = 'http://abctest.com/list.php?c=&&page={page}' 


class Spider(Spider): 
    handle_httpstatus_list = [404] 
    name = "find" 

    def start_requests(self): 
     index = 1 
     while True: 
      yield Request(URL.format(page=index)) 
      index +=1 

    def parse(self, response): 
     if response.status == 404: 
      raise CloseSpider("Met the page which doesn't exist") 

     sel = Selector(response) 
     sites = sel.css("div#list table tr ") 
     for site in sites: 
      item = LAItem() 
      item['day'] = site.css(" td.date::text ").extract() 
      item['URL'] = site.css(" td.subject a::attr(href) ").extract() 
     yield item 

Обратите внимание, что трюк здесь, чтобы продолжать получать страницы, пока мы не встретимся первый ответ с 404 - Страница не найдена. Это должно заставить его работать на любое количество страниц.

+0

Что делать, если я хочу протестировать только 2 страницы? Я использую index + = 1 , если index == 6: raise CloseSpider («Встретил страницу, которая не существует») Она работает, но имеет ОШИБКУ: получение запроса от начальных запросов – user2492364

+0

просто поместите 'break' в while если 'index' попадает в значение' 6': 'if index == 6: break'. – alecxe

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