2015-05-04 1 views
2

Я использую Scrapy 0.24 на Python 2.7.9 на 64-разрядной машине Windows. Я пытаюсь сказать, что scrapy начнется с определенного URL http://www.allen-heath.com/products/, и оттуда будут собирать только данные со страниц, где url включает строку ahproducts.Как сканировать сайт и анализировать только страницы, соответствующие RegEx, используя Scrapy 0.24

К сожалению, когда я делаю это, данные не очищаются вообще. Что я делаю не так? Вот мой код ниже. Если есть дополнительная информация, которую я могу предоставить, чтобы помочь с ответом, спросите, и я сделаю редактирование.

Вот пастажина моего журнала гусениц: http://pastebin.com/C2QC23m3.

спасибо.

import scrapy 
import urlparse 

from allenheath.items import ProductItem 
from scrapy.selector import Selector 
from scrapy.http import HtmlResponse 
from scrapy.contrib.spiders import Rule 
from scrapy.contrib.linkextractors import LinkExtractor 

class productsSpider(scrapy.Spider): 
    name = "products" 
    allowed_domains = ["http://www.allen-heath.com/"] 
    start_urls = [ 
     "http://www.allen-heath.com/products/" 
    ] 
    rules = [Rule(LinkExtractor(allow=['ahproducts']), 'parse')] 

    def parse(self, response): 
     for sel in response.xpath('/html'): 
      item = ProductItem() 
      item['model'] = sel.css('#prodsingleouter > div > div > h2::text').extract() 
      item['itemcode'] = sel.css('#prodsingleouter > div > div > h2::text').extract() 
      item['shortdesc'] = sel.css('#prodsingleouter > div > div > h3::text').extract() 
      item['desc'] = sel.css('#tab1 #productcontent').extract() 
      item['series'] = sel.css('#pagestrip > div > div > a:nth-child(3)::text').extract() 
      item['imageorig'] = sel.css('#prodsingleouter > div > div > h2::text').extract() 
      item['image_urls'] = sel.css('#tab1 #productcontent .col-sm-9 img').xpath('./@src').extract() 
      item['image_urls'] = [urlparse.urljoin(response.url, url) for url in item['image_urls']] 
      yield item 

После некоторых предложений от eLRuLL вот мой обновленный файл-паук. Я изменил start_url, чтобы включить страницу, в которой есть ссылки, содержащие «ahproducts» в их URL-адресе. У моего исходного кода не было сопоставленных URL-адресов на стартовой странице.

products.py

import scrapy 
import urlparse 

from allenheath.items import ProductItem 
from scrapy.selector import Selector 
from scrapy.http import HtmlResponse 
from scrapy.contrib.spiders import Rule 
from scrapy.contrib.linkextractors import LinkExtractor 

class productsSpider(scrapy.contrib.spiders.CrawlSpider): 
    name = "products" 
    allowed_domains = ["http://www.allen-heath.com/"] 
    start_urls = [ 
     "http://www.allen-heath.com/key-series/ilive-series/ilive-remote-controllers/" 
    ] 
    rules = (
      Rule(
       LinkExtractor(allow='.*ahproducts.*'), 
       callback='parse_item' 
       ), 
      ) 

    def parse_item(self, response): 
     for sel in response.xpath('/html'): 
      item = ProductItem() 
      item['model'] = sel.css('#prodsingleouter > div > div > h2::text').extract() 
      item['itemcode'] = sel.css('#prodsingleouter > div > div > h2::text').extract() 
      item['shortdesc'] = sel.css('#prodsingleouter > div > div > h3::text').extract() 
      item['desc'] = sel.css('#tab1 #productcontent').extract() 
      item['series'] = sel.css('#pagestrip > div > div > a:nth-child(3)::text').extract() 
      item['imageorig'] = sel.css('#prodsingleouter > div > div > h2::text').extract() 
      item['image_urls'] = sel.css('#tab1 #productcontent .col-sm-9 img').xpath('./@src').extract() 
      item['image_urls'] = [urlparse.urljoin(response.url, url) for url in item['image_urls']] 
      yield item 

ответ

2

Во-первых, использовать правила, которые вы должны использовать scrapy.contrib.spiders.CrawlSpider не scrapy.Spider.

Затем измените имя вашего метода к чему-то вроде parse_item не parse, а также обновить свои правила, как:

rules = (
     Rule(
      LinkExtractor(allow='.*ahproducts.*'), 
      callback='parse_item' 
     ), 
    ) 

parse метод всегда вызывается как ответ для start_urls запросов.

Наконец только изменить allowed_domainsallowed_domains = ["allen-heath.com"] к

P.D. в Для просмотра различных уровней сайта с правилами, необходимо указать, какие ссылки следовать и которая связана с разбором, что-то вроде этого:

rules = (
    Rule(
     LinkExtractor(
      allow=('some link to follow') 
     ), 
     follow=True, 
    ), 
    Rule(
     LinkExtractor(
      allow=('some link to parse') 
     ), 
     callback='parse_method', 
    ), 
) 
+0

страницы с URL-адресами, которые соответствуют 'ahproducts' связаны на страницах, которые начинаются с 'http: // www.allen-heath.com/series /' или '/ key-series /'. Страницы, к которым вы можете перейти, начиная с http: // www.allen-heath.com/products/'. Я был под неправильным впечатлением, что scrapy будет следовать ссылкам на http: // www.allen-heath.com/products/', пока не найдет страницы, соответствующие« ahproducts ». Поэтому, если я понимаю, что правильно, используя правила, scrapy будет только соответствовать и собирать данные из ссылок, которые соответствуют моему правилу И существуют на моем 'start_url'. В этом случае, я полагаю, мне нужно будет генерировать MANY 'start_url's first? – jkupczak

+0

На ваш комментарий я пошел дальше и изменил «class productsSpider (scrapy.Spider)» на «class productsSpider (scrapy.contrib.spiders.CrawlSpider):« И я использую start_url, у которого есть ссылки с «ahproducts» 'в нем. Но он все равно не тянет никаких данных. – jkupczak

+0

, пожалуйста, обновите свой вопрос с изменениями – eLRuLL

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