Я новичок в области scrapy и html, и я пытаюсь создать простого паука, чтобы очистить сайт https://www.mobiel.nl.
Мне удалось получить доступ к страницам мобильных телефонов, например, https://www.mobiel.nl/smartphone/apple/iphone-6-32gb
Я пытаюсь получить информацию о планах, например имена операторов (взятые из имен изображений), имена планов и тарифы, которые хранятся в следующих контейнерах:
<div class="pc-result js-offer" data-offer-id="71-1928-3683-19.0">
Я пробовал десятки различных способов извлечения селекторов, например:
scrapy shell https://www.mobiel.nl/smartphone#
fetch('https://www.mobiel.nl/smartphone/apple/iphone-6-32gb')
In [37]: response.xpath('//*[@id="js-compare-results"]/text()')
Out[37]: []
In [38]: response.xpath('//*[@id="js-compare-results"]/*')
Out[38]: []
In [39]: response.xpath('//*[@id="js-compare-results"]')
Out[39]: []
In [40]: response.xpath('//*[@id="js-compare-results"]/div/div[2]/div[2]/div/div[1]/div/div[1]/div[1]/span[1]')
Out[40]: []
In [41]: response.xpath('//*[@id="js-compare-results"]/div/div[2]/div[2]/div/div[1]/div/div[1]/div[1]/span[1]').extract()
Out[41]: []
Я не смог найти способ получить любую информацию, кроме имени устройства, которое: response.xpath('//*[@class="phone-info__phone"]/text()').extract_first()
В конце концов, я хотел бы получить что-то вроде
[device name, operator (e.g. t-mobile), plan (e.g. 1GB), period (e.g. 1 year) rate (e.g. 15€)]
Кто-нибудь знает, как правильно извлечь (если возможно) такую информацию с этой страницы?
Заранее спасибо.
**Edit 1: spider sourcecode**
# -*- coding: utf-8 -*-
from scrapy import Spider
from scrapy.http import Request
from scrapy_splash import SplashRequest
import re
class TmnlPricecrawlerSpider(Spider):
name = 'tmnl_pricecrawler'
allowed_domains = ['www.mobiel.nl']
start_urls = ['https://www.mobiel.nl/smartphone#']
def parse(self, response):
#Process spartphone pages - for this website, all phones are in the same page, no multi-pages processing needed
mobielnl_items = response.xpath('//*[@class="phone-list-item__link"]/@href').extract()
for item in mobielnl_items:
item_url = response.urljoin(item)
yield Request(item_url, callback=self.parse_mobielnl)
#for url in item_url:
#yield SplashRequest(url=url, callback=self.parse_mobielnl)
def parse_mobielnl(self, response):
yield SplashRequest(url=url, callback=self.parse_aaa)
def parse_aaa():
pass
Я пытался получить внутренние URL-адреса с помощью scrapy_splash, но все равно безуспешно.
Редактировать 2:
Я понял, что:
In [87]: response.xpath('//*[@id="price-comparator"]').extract_first()
Out[87]: '<div id="price-comparator" class="page-width page-width--spacing" data-style="mobielnl" data-token="EnsjtkLMsBkkYyLQVEZwqA" data-phone="803"></div>'
<div id="price-comparator" class="page-width page-width--spacing" data-style="mobielnl" data-token="EnsjtkLMsBkkYyLQVEZwqA" data-phone="803"><iframe src="https://pcnltelecom.tdsapi.com/portal/iframe/full_compare/?api_token=EnsjtkLMsBkkYyLQVEZwqA&api_domain=https%3A%2F%2Fwww.mobiel.nl&dom_id=price-comparator&iframe_options[style]=mobielnl&iframe_options[click_outs_in_parent]=true&iframe_options[show_sponsored_positions]=false&iframe_options[filter][phones][]=803&iframe_options[type_options][phone_offers][show]=false&iframe_options[type_options][propositions][show]=true&iframe_options[type_options][sim_only][show]=false" width="100%" scrolling="no" frameborder="0" class="pc-iframe" id="iFrameResizer0" style="overflow: hidden; min-height: 500px; height: 1240.1px;"></iframe></div>
Элемент data-token и data-phone отправляют эти номера по URL-адресу, с которого запрашиваются нужные мне точки данных, так что это был бы способ попытаться получить эту информацию и заменить ее в URL или есть другой более адекватный способ сделать что-то подобное?