Я использую 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
страницы с 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
На ваш комментарий я пошел дальше и изменил «class productsSpider (scrapy.Spider)» на «class productsSpider (scrapy.contrib.spiders.CrawlSpider):« И я использую start_url, у которого есть ссылки с «ahproducts» 'в нем. Но он все равно не тянет никаких данных. – jkupczak
, пожалуйста, обновите свой вопрос с изменениями – eLRuLL