2016-06-17 1 views
0

J'ai été bloqué sur ce problème pendant des heures. Je ne pouvais pas suivre les liens sur ce site en utilisant la syntaxe de la règle, donc j'ai trouvé manuellement tous les liens dont j'avais besoin pour faire une demande. Même si j'ai testé que les liens extraits sont des URL valides, mon robot d'exploration n'explore pas les pages supplémentaires. J'ai été bloqué dessus pendant des heures. Je ne trouve pas non plus que la documentation sur Scrapy soit aussi utile car elle est présentée dans une carte de mots parfaite. Quelqu'un peut-il m'aider?Scrawy crawler ne suit pas les liens même lorsque je les collecte et les analyse

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

from banker.items import BarclaysOfferItem 

class BarclaySpider(CrawlSpider): 
    name = "barclay" 
    allowed_domains = ['partners.barclaycardrewardsboost.com/'] 
    start_urls = [ 
     'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=1&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers' 
     # 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=2&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers'  
     # 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=3&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers',  
     # 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=4&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers',  
     # 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=5&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers',  
     # 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=6&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers',  
     # 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=7&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers'  

    ] 

    def parse(self, response): 

     base = 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm' 
     links = response.xpath('//p[contains(@class, "mn_pageLinks")]/a') 

     for sel in links: 
      url = base + str(sel.xpath('@href').extract()[0]) 

      logging.info(url) 

      yield scrapy.Request(url, callback=self.parse_item) 


    def parse_item(self, reponse): 
     for sel in response.xpath('//table/tr'): 
      item = BarclaysOfferItem() 
      item['merchant'] = sel.xpath('td/div/a[last()]/text()').extract() 
      item['rate'] = sel.xpath('td/span/a/text()').extract() 
      item['offer'] = sel.xpath('td/a[last()]/text()').extract() 
      item['coupon_code'] = sel.xpath('td[@class="mn_cpCode"]/text()').extract() 
      item['expiration_date'] = sel.xpath('td[@class="mn_expiry"]/text()').extract() 
      yield item 

Mise à jour # 1

Retrait de la liste allowed_urls a obtenu mes demandes de travail. Cependant maintenant je continue à obtenir NameError: global name 'response' is not defined.

Répondre

1

J'ai finalement réussi à le faire fonctionner!

Selon le scrapy documentation si OffsiteMiddleware est activé, les domaines ne figurant pas dans la liste allowed_domains ne seront pas lus pour une demande. Je sais que mes URL sont sur le domaine spécifié mais je suppose que la façon dont le site interroge les données donne l'impression que les URL sont hors site.

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.spiders import Spider, Rule 
from scrapy.linkextractors import LinkExtractor 
import logging 
from banker.items import BarclaysOfferItem 

class BarclaySpider(Spider): 
    name = "barclay" 
    start_urls = [ 
     'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm?rows=25&page=1&ref_page_id=2167&ref_section_id=9720&ref_section_title=All%\20Online%\20Offers' 

    ] 

    # Parse for the links of interest 
    def parse(self, response): 

     base = 'https://partners.barclaycardrewardsboost.com/shopping/sp____.htm' 
     links = response.xpath('//p[contains(@class, "mn_pageLinks")]/a') 
     for sel in links: 
      url = base + str(sel.xpath('@href').extract()[0]) 
      logging.info(url) 
      yield scrapy.Request(url, callback=self.parse_item)  

    # parse for the items of interest 
    def parse_item(self, response): 
     for sel in response.xpath('//table/tr'): 
      item = BarclaysOfferItem() 
      item['merchant'] = sel.xpath('td/div/a[last()]/text()').extract() 
      item['rate'] = sel.xpath('td/span/a/text()').extract() 
      item['offer'] = sel.xpath('td/a[last()]/text()').extract() 
      item['coupon_code'] = sel.xpath('td[@class="mn_cpCode"]/text()').extract() 
      item['expiration_date'] = sel.xpath('td[@class="mn_expiry"]/text()').extract() 
      yield item