Crawlspider ничего не царапает

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
#scrapy crawl dmoz -o items.json -t json
from scrapy.http import Request
from urlparse import urlparse

from manga.items import MangaItem

class MangaHere(CrawlSpider):
    name = "mangahs"
    allowed_domains = ["mangahere.com"]
    start_urls = ["http://www.mangahere.com/seinen/"]
    rules = [Rule(SgmlLinkExtractor(allow = ('//a[@class="next"]')), follow=True, 

        callback='parse_item'),]


#def parse(self, response):
    # get indext depth for every page
   # hxs = HtmlXPathSelector(response)
   # next_link = hxs.select('//a[@class="next"]')
   # index_depth = int(next_link.select('preceding-sibling::a[1]/text()').extract()[0])        
    #create a request for the first page

  #  url = urlparse("http://www.mangahere.com/seinen/")
  #  yield Request(url.geturl(), callback=self.parse_item)

    #create a request for each subsequent page in the form "./seinen/x.html"
 #   for x in xrange(2, index_depth):
 #       pageURL = "http://www.mangahere.com/seinen/%s.htm" % x
 #       url = urlparse(pageURL)
  #      yield Request(url.geturl(), callback=self.parse_item)
    def parse_start_url(self, response):
        list(self.parse_item(response))

    def parse_item(self,response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//ul/li/div')
        items = []
        for site in sites:
            rating = site.select("p/span/text()").extract()      
            desc = site.select("p[2]/text()").extract()
            for i in rating: 
                for p in desc:
                    if float(i) > 4.8 and "ecchi" not in str(p):
                        item = MangaItem()
                        item['title'] = site.select("div/a/text()").extract()
                        item['link'] = site.select("div/a/@href").extract()
                        item['desc'] = site.select("p[2]/text()").extract()
                        item['rate'] = site.select("p/span/text()").extract()         

                        items.append(item)
        return items

Комментарии — это метод обхода страниц без обходного паука, с которым мне помог кто-то здесь. Но я все еще хочу узнать, как заставить работать ползучий паук ради знания.

Я не получаю ошибок, но он очищает 0 страниц, я проверил много тем, и это звучало так, как будто мне нужно было добавить parse_start_url по какой-то причине, но это не помогло, изменение имен функции разбора также не помогло.

Что не работает? Моё правило неверное или я что-то упустил?


person gallly    schedule 29.01.2013    source источник


Ответы (3)


Вам нужно изменить правило на что-то вроде этого:

rules = [Rule(SgmlLinkExtractor(allow = ('/\d+.htm')), follow=True, 
    callback='parse_item'),]
person Talvalin    schedule 30.01.2013
comment
спасибо всем, я добавил путь ограничения без пути разрешения, и, похоже, он работает! потратил много времени на это ›‹ - person gallly; 30.01.2013

allow должен быть REGEX для URL-адресов, а не xpath http://doc.scrapy.org/en/0.12/topics/spiders.html

Если вы хотите использовать xpath, вам нужно использовать restrict_xpath

person Mirage    schedule 30.01.2013

Ваш обратный вызов в вашем правиле не соответствует методу. CrawlSpider имеет метод по умолчанию с именем parse, поэтому def parse(CrawlSpider) следует изменить на def parse_item, чтобы он соответствовал вашему обратному вызову.

person larrywgray    schedule 29.12.2013