Scrapy: концепция правила SgmlLinkExtractor

Подскажите, пожалуйста, как написать правило 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   

person user2492364    schedule 30.07.2014    source источник
comment
Вы знаете, сколько у вас страниц?   -  person alecxe    schedule 30.07.2014
comment
более 10, но я хочу проверить только 2 страницы, чтобы убедиться, что данные нормальные.   -  person user2492364    schedule 30.07.2014


Ответы (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 — Страница не найдена. Это должно заставить его работать для любого количества страниц.

person alecxe    schedule 30.07.2014
comment
Что делать, если я хочу протестировать только 2 страницы? Я использую индекс +=1, если индекс ==6 : поднять CloseSpider (встретить несуществующую страницу) Это работает, но есть ОШИБКА: получение запроса из запросов на запуск - person user2492364; 01.08.2014
comment
просто поместите break в цикл while, если index достигнет значения 6: if index == 6: break. - person alecxe; 01.08.2014