2015-12-17 4 views
0

вот мой код. Фактически я следовал примеру в «Recursively Scraping Web Pages With Scrapy», и, похоже, я где-то ошибся.crawlSpider, похоже, не соответствует правилу

Может кто-нибудь помочь мне найти его, пожалуйста? Это сводит меня с ума, мне нужны только все результаты на всех страницах результатов. Вместо этого он дает мне результаты, начиная со страницы 1.

Вот мой код:

import scrapy 

from scrapy.selector import Selector 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.http.request import Request 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 

from githubScrape.items import GithubscrapeItem 


class GithubSpider(CrawlSpider): 
    name = "github2" 
    allowed_domains = ["github.com"] 

    rules = (
     Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//*[contains(@class, "next_page")]')), callback='parse_items', follow=True), 
    ) 

    def start_requests(self): 

     baseURL = 'https://github.com/search?utf8=%E2%9C%93&q=eagle+SYSTEM+extension%3Asch+size%3A' 
     for i in range(10000, 20000, +5000): 
      url = baseURL+str(i+1)+".."+str(i+5000)+'&type=Code&ref=searchresults' 
      print "URL:",url 
      yield Request(url, callback=self.parse_items) 


    def parse_items(self, response): 

     hxs = Selector(response) 
     resultParagraphs = hxs.xpath('//div[contains(@id,"code_search_results")]//p[contains(@class, "title")]') 

     items = [] 
     for p in resultParagraphs: 
      hrefs = p.xpath('a/@href').extract() 
      projectURL = hrefs[0] 
      schemeURL = hrefs[1] 
      lastIndexedOn = p.xpath('.//span/time/@datetime').extract() 

      i = GithubscrapeItem() 
      i['counter'] = self.count 
      i['projectURL'] = projectURL 
      i['schemeURL'] = schemeURL 
      i['lastIndexedOn'] = lastIndexedOn 
      items.append(i) 
     return(items) 

ответ

1

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

Scrapy начинает ползать, вызывая метод start_requests, но правила составляются и используются на parse метод, который вы не используете, потому что ваши запросы идут непосредственно от start_requests к parse_items.

Вы можете удалить callback по методу start_requests, если вы хотите, чтобы правила применялись на этом уровне.

+0

Большое спасибо, мне было интересно, когда правила станут активными! – steph