我在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
匹配'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
根据您的评论,我已经提前将类产品Spider(scrapy.Spider)'改为'class productsSpider(scrapy.contrib.spiders.CrawlSpider):'并且我使用了一个start_url,它与'ahproducts '在里面。但它仍然没有提取任何数据。 – jkupczak
请更新您的问题,并更改 – eLRuLL