2017-02-15 10 views
0

У меня есть имя сайта https://www.grohe.com/in В этой странице я хочу, чтобы получить один тип ванной краны https://www.grohe.com/in/25796/bathroom/bathroom-faucets/grandera/ В этой странице есть несколько продуктов/связанные products.I хотят получить каждый URL продукта и лом data.For, что я написал, как это ...очищающие: вложенная данные URL выскабливание

Мой items.py файл выглядит

from scrapy.item import Item, Field 

class ScrapytestprojectItem(Item): 
    producturl=Field() 
    imageurl=Field() 
    description=Field() 

код паук

import scrapy 
from ScrapyTestProject.items import ScrapytestprojectItem 
class QuotesSpider(scrapy.Spider): 
    name = "nestedurl" 
    allowed_domains = ['www.grohe.com'] 
    start_urls = [ 
    'https://www.grohe.com/in/7780/bathroom/bathroom-faucets/essence/', 
    ] 

    def parse(self, response): 
    for divs in response.css('div.viewport div.workspace div.float-box'): 
     item = {'producturl': divs.css('a::attr(href)').extract(), 
       'imageurl': divs.css('a img::attr(src)').extract(), 
       'description' : divs.css('a div.text::text').extract() + divs.css('a span.nowrap::text').extract()} 
     next_page = response.urljoin(item['producturl']) 
     yield scrapy.Request(next_page, callback=self.parse, meta={'item': item}) 

когда я бежал scrapy ** scrapy crawl nestedurl -o nestedurl.csv ** пустой файл создан. Консоли

2017-02-15 18:03:11 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6024 
2017-02-15 18:03:13 [scrapy] DEBUG: Crawled (200) <GET https://www.grohe.com/in/7780/bathroom/bathroom-faucets/essence/> (referer: None) 
2017-02-15 18:03:13 [scrapy] ERROR: Spider error processing <GET https://www.grohe.com/in/7780/bathroom/bathroom-faucets/essence/> (referer: None) 
Traceback (most recent call last): 
File "/usr/lib/python2.7/dist-packages/scrapy/utils/defer.py", line 102, in iter_errback 
yield next(it) 
     File "/usr/lib/python2.7/dist-  packages/scrapy/spidermiddlewares/offsite.py", line 28, in  process_spider_output 
    for x in result: 
     File "/usr/lib/python2.7/dist- packages/scrapy/spidermiddlewares/referer.py", line 22, in <genexpr> 
     return (_set_referer(r) for r in result or()) 
     File "/usr/lib/python2.7/dist-  packages/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr> 
     return (r for r in result or() if _filter(r)) 
     File "/usr/lib/python2.7/dist- packages/scrapy/spidermiddlewares/depth.py", line 54, in <genexpr> 
    return (r for r in result or() if _filter(r)) 
File "/home/pradeep/ScrapyTestProject/ScrapyTestProject/spiders/nestedurl.py", line 15, in parse 
    next_page = response.urljoin(item['producturl']) 
     File "/usr/lib/python2.7/dist-packages/scrapy/http/response/text.py", line 72, in urljoin 
    return urljoin(get_base_url(self), url) 
     File "/usr/lib/python2.7/urlparse.py", line 261, in urljoin 
    urlparse(url, bscheme, allow_fragments) 
    File "/usr/lib/python2.7/urlparse.py", line 143, in urlparse 
    tuple = urlsplit(url, scheme, allow_fragments) 
    File "/usr/lib/python2.7/urlparse.py", line 176, in urlsplit 
    cached = _parse_cache.get(key, None) 
    TypeError: unhashable type: 'list' 
    2017-02-15 18:03:13 [scrapy] INFO: Closing spider (finished) 
    2017-02-15 18:03:13 [scrapy] INFO: Dumping Scrapy stats: 
      {'downloader/request_bytes': 253, 
      'downloader/request_count': 1, 
     'downloader/request_method_count/GET': 1, 
      'downloader/response_bytes': 31063, 
    'downloader/response_count': 1, 
     'downloader/response_status_count/200': 1, 
      'finish_reason': 'finished', 
     'finish_time': datetime.datetime(2017, 2, 15, 12, 33, 13, 396542), 
     'log_count/DEBUG': 3, 
      'log_count/ERROR': 3, 
      'log_count/INFO': 7, 
      'response_received_count': 1, 
     'scheduler/dequeued': 1, 
     'scheduler/dequeued/memory': 1, 
      'scheduler/enqueued': 1, 
      'scheduler/enqueued/memory': 1, 
      'spider_exceptions/TypeError': 1, 
      'start_time': datetime.datetime(2017, 2, 15, 12, 33, 11, 568424)} 
      2017-02-15 18:03:13 [scrapy] INFO: Spider closed (finished) 

ответ

0

Я думаю, что вещь divs.css('a::attr(href)').extract() иногда возвращает список, который при использовании в urljoin приводит, что вызывает urlparse к сбою, поскольку он не может хэш списка.

0

URL получен неверно.

Вы должны включить ведение журнала и зарегистрировать некоторые сообщения для отладки кода.

import scrapy, logging 
from ScrapyTestProject.items import ScrapytestprojectItem 
class QuotesSpider(scrapy.Spider): 
    name = "nestedurl" 
    allowed_domains = ['www.grohe.com'] 
    start_urls = [ 
    'https://www.grohe.com/in/7780/bathroom/bathroom-faucets/essence/', 
    ] 

    def parse(self, response): 
    for divs in response.css('div.viewport div.workspace div.float-box'): 
     item = {'producturl': divs.css('a::attr(href)').extract(), 
       'imageurl': divs.css('a img::attr(src)').extract(), 
       'description' : divs.css('a div.text::text').extract() + divs.css('a span.nowrap::text').extract()} 
     next_page = response.urljoin(item['producturl']) 

     logging.info(next_page) # see what it prints in console. 

     yield scrapy.Request(next_page, callback=self.parse, meta={'item': item}) 
+0

генерируется URL, как «/ в/8257/ванной/ванная комната-смесители/сущность/продакт-детали/продукт = 19408-G145 & цвет? = 000 & material = 19408000 'он будет добавлен к URL-адресу «www.grohe.in», после чего он будет получать информацию о – mvnpgh

+0

[https://www.grohe.com/in/8257/bathroom/bathroom-faucets/essence/product- подробности /? продукт = 33623-G145 & цвет = 000 & материал = 33623000] .... sameway сформировано несколько URL-адресов – mvnpgh

+0

Нет, вы можете вручную join URL, например '' www.grohe.in "+ item ['producturl']' – Umair

0
item = {'producturl': divs.css('a::attr(href)').extract(), # <--- issue here 
      'imageurl': divs.css('a img::attr(src)').extract(), 
      'description' : divs.css('a div.text::text').extract() + divs.css('a span.nowrap::text').extract()} 
    next_page = response.urljoin(item['producturl']) # <--- here item['producturl'] is a list 

Чтобы исправить это использование .extract_first(''):

item = {'producturl': divs.css('a::attr(href)').extract_fist(''), 
      'imageurl': divs.css('a img::attr(src)').extract_first(''), 
      'description' : divs.css('a div.text::text').extract() + divs.css('a span.nowrap::text').extract()} 
    next_page = response.urljoin(item['producturl']) 
+0

В моем коде паука я использовал .extract_first() /. extract_first (''). Тот же вывод не изменился. Я пробовал в scrapy shell с .extract() it self.it кажется хорошим – mvnpgh

+0

producturl как ---->/in/8257/ванная комната/смесители для ванной/сущность/детали продукта /? product = 19408-G145 & color = 000 & material = 19408000 после этого мы введите ссылку как «https://www.grohe.com/in/8257/bathroom/bathroom-faucets/essence/product-details/?product=19408-G145&color=000&material=19408000 ' – mvnpgh

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

  • Нет связанных вопросов^_^