Как отображается цена этого сайта? - PullRequest
1 голос
/ 26 апреля 2019

Мне нужен паук для сканирования этого веб-сайта ():

Я хочу, чтобы сканер загрузил информацию о продукте на этой странице (https://search.suning.com/iphone/), включая цену, но я не могу ее получитьнепосредственно с этой страницы. Кажется, что цена этой страницы отображается асинхронно, но я не могу найти, как она выполняется. Кто-то может мне помочь? Спасибо.

Я проверил панель «Сеть» в Chrome Developerинструменты, но не могу найти его.

# just example , not done
class SuningSpider(scrapy.Spider):
    name = "sn"
    keyWord = "笔"
    prefix = "https://"

    def start_requests(self):
        yield scrapy.Request(url="https://search.suning.com/%s/" % self.keyWord, callback=self.parse)

    def parse(self, response):
        logging.error(response.text)
        selector = scrapy.Selector(response)


        productLists = selector.xpath("//div[@id='product-list']/ul/li")

        for p in productLists:
            deatailUrl = p.css("div > div > div.res-info > div.title-selling-point > a::attr(href)")
            # price = p.css("div > div > div.res-info > div.price-box > span > i:nth-child(1)::text")
            s.xpath('//*[@id="0070130312-164968740"]/div/div/div[2]/div[1]/span/i[2]')
            # //div[contains(@class,'foo')]
            fullUrl = self.prefix + deatailUrl
            yield scrapy.Request(url=deatailUrl, callback=)


    def crawlDetailPage(self, response):
        selector = scrapy.Selector(response)
        price = selector.xpath('//*[@id="mainPrice"]/dl[1]/dd/span')

    def finished(self, response):
        item = DataItem()
        item["url"] = response.url
        selector = scrapy.Selector(response)

        price = selector.xpath("")

1 Ответ

2 голосов
/ 26 апреля 2019

Цена отображается асинхронно с обратным вызовом JavaScript (jsonp), и вы увидите эти запросы, отправленные на ds.suning.com. Вы можете получить простой JSON, изменив запрошенный URL. Они вызываются при прокрутке страницы вниз, поэтому вам нужно будет динамически создавать эти urls с помощью ids продуктов.

Это дает вам цену первых 5 элементов на странице:

from bs4 import BeautifulSoup
import requests
import json

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0'}

with requests.Session() as s:

      baseurl = 'https://ds.suning.com/ds/generalForTile/000000010606656239_,000000000690128135_,000000010606649857_,000000010597840415_,000000010597840391_-010-2-0000000000-1--ds0000000002391.json'

      url_fetch = s.get(baseurl, headers=headers).json()

      print([rs['price'] for rs in url_fetch['rs']])

      #['5588.00', '5988.00', '7188.00', '7688.00', '5188.00']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...