2016-08-31 2 views
1

Я соскабливаю сайт, просматривая страницу поиска, а затем просматривая все результаты. Однако, похоже, он возвращает только первый результат для каждой страницы. Я также не думаю, что это ударит по результатам стартовой страницы.Scrapy: Цитирование по результатам поиска возвращает только первый элемент

Во-вторых, цена возвращается как какой-то Юникод (символ £) - как я могу ее вообще удалить, просто оставив цену?

'regular_price': [u'\xa38.59'], 

Вот HTML: http://pastebin.com/F8Lud0hu

Вот паук:

import scrapy 
import random 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from scrapy.selector import Selector 
from cdl.items import candleItem 

class cdlSpider(CrawlSpider): 
     name = "cdl" 
     allowed_domains = ["www.xxxx.co.uk"] 
     start_urls = ['https://www.xxxx.co.uk/advanced_search_result.php'] 

     rules = [ 
       Rule(LinkExtractor(
         allow=['advanced_search_result\.php\?sort=2a&page=\d*']), 
         callback='parse_listings', 
         follow=True) 
     ] 

     def parse_listings(self, response): 
       sel = Selector(response) 
       urls = sel.css('a.product_img') 

       for url in urls: 
         url = url.xpath('@href').extract()[0] 
         return scrapy.Request(url,callback=self.parse_item) 

     def parse_item(self, response): 

       candle = candleItem() 

       n = response.css('.prod_info_name h1') 

       candle['name'] = n.xpath('.//text()').extract()[0] 


       if response.css('.regular_price'): 
         candle['regular_price'] = response.css('.regular_price').xpath('.//text()').extract() 
       else: 
         candle['was_price'] = response.css('.was_price strong').xpath('.//text()').extract() 
         candle['now_price'] = response.css('.now_price strong').xpath('.//text()').extract() 

       candle['referrer'] = response.request.headers.get('Referer', None) 
       candle['url'] = response.request.url 

       yield candle 

ответ

2

Да, он возвращает только первый результат из-за вашего метода parse_listing (вы возвращаете первый URL-адрес, и вы должны его уступать). Я хотел бы сделать что-то вроде:

def parse_listings(self, response): 
    for url in response.css('a.product_img::attr(href)').extract(): 
     yield Request(url, callback=self.parse_item) 

В этом случае я бы даже сделать что-то вроде:

class CdlspiderSpider(CrawlSpider): 
    name = 'cdlSpider' 
    allowed_domains = ['www.xxxx.co.uk'] 
    start_urls = ['https://www.xxxx.co.uk/advanced_search_result.php'] 

    rules = [ 
     Rule(LinkExtractor(allow='advanced_search_result\.php\?sort=2a&page=\d*')), 
     Rule(LinkExtractor(restrict_css='a.product_img'), callback='parse_item') 
     ] 

    def parse_item(self, response): 
     ... 
     if response.css('.regular_price'): 
      candle['regular_price'] = response.css('.regular_price::text').re_first(r'\d+\.?\d*') 
     else: 
      candle['was_price'] = response.css('.was_price strong::text').re_first(r'\d+\.?\d*') 
      candle['now_price'] = response.css('.now_price strong::text').re_first(r'\d+\.?\d*') 
     ... 
     return candle 
+0

Спасибо, переход от возврата scrapy.Request (URL, обратного вызова = self.parse_item) To: выход scrapy.Request (url, callback = self.parse_item) Работает отлично. –

+0

Привет, следующий вопрос извините. Некоторые из цен, которые я соскабливаю, входят в тысячи и форматируются запятой, например, 1 190,00 фунтов стерлингов. С этими условиями условие регулярного выражения будет соответствовать цене здесь как «1». Нормальные цены работают нормально. У вас есть предложение о том, как изменить это? Спасибо –

+0

Измените регулярное выражение '' \ d + \.? \ D * ''на'' (?: \ D {1,3} [, \.]) * \ D \ d'', которое должно сделать трюк. – Guillaume

1

Для удаления Е, просто заменить его с пустой строкой, как это:

pricewithpound = u'\xa38.59' 
price = pricewithpound.replace(u'\xa3', '') 

Чтобы исследовать проблему скрипирования, можете ли вы предоставить HTML-файлы наш?

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