2015-05-04 22 views
2

我在Windows 64位机器上的Python 2.7.9上使用Scrapy 0.24。我试图告诉scrapy从一个特定的URL http://www.allen-heath.com/products/开始,并从那里仅收集来自网址的数据,其中url包含字符串ahproducts如何抓取网站并仅解析使用Scrapy匹配RegEx的页面0.24

不幸的是,当我这样做时,根本没有任何数据被刮掉。我究竟做错了什么?以下是我的代码如下。如果我可以提供更多信息来帮助解答问题,请询问我将进行修改。

这是我的履带日志的pastebin: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”链接的页面。我的原始代码在起始页上没有任何匹配的网址。

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.CrawlSpiderscrapy.Spider

然后,你的方法的名称更改为类似parse_itemparse并更新你的规则,如:

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

匹配'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'上的链接数据。在这种情况下,我想我需要首先生成许多'start_url'? – jkupczak

+0

根据您的评论,我已经提前将类产品Spider(scrapy.Spider)'改为'class productsSpider(scrapy.contrib.spiders.CrawlSpider):'并且我使用了一个start_url,它与'ahproducts '在里面。但它仍然没有提取任何数据。 – jkupczak

+0

请更新您的问题,并更改 – eLRuLL