динамический код, сгенерированный JS при очистке сайта - PullRequest
3 голосов
/ 26 марта 2019

Я новичок в соскобе. Я пытаюсь очистить значение этого сайта с помощью кнопки Купить сейчас .
Я попробовал вариант:

from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebPage

class Client(QWebPage):
    def __init__(self):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        # self.loadFinished.connect(self.on_page_load)
        # self.mainFrame().load(QUrl(url))
        # self.app.exec_()
    def on_page_load(self):
        self.app.quit()
    def mypage(self, url):
        self.loadFinished.connect(self.on_page_load)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()
client_response = Client()
def parse(url):                # OSRS + RS3
    client_response.mypage(url)
    source = client_response.mainFrame().toHtml()
    soup = BeautifulSoup(source, 'html.parser')
    osrs_text = soup.findAll('input', attrs={'type': 'number'})
    quantity = (osrs_text[0])['min']
    final = 0
    if(quantity == '1'):
        final_osrs = round(float(soup.findAll('span', attrs={'id':'goldprice'})[0].text),3)
        print(final_osrs)

    else:
        price = round(float(soup.findAll('span', attrs={'id':'goldprice'})[0].text),3)
        final_rs3 = price/int(quantity)
        print(final_rs3)

Этот подход не очень хорош, потому что на его очистку уходит слишком много времени. Я также попробовал Selenium Approach, но в данный момент он также не нужен.
Не могли бы вы, ребята, предложить мне лучший способ проанализировать ценность? Here is what I need. Любая помощь будет высоко оценена. Спасибо.



П.С .: Я попробовал эту библиотеку, потому что содержимое было сгенерировано динамически.

1 Ответ

3 голосов
/ 26 марта 2019

Я не уверен, какую разницу в производительности вы получите, но вы можете попробовать и проверить это решение.

import requests
from bs4 import BeautifulSoup

baseUrl = 'https://www.rsmalls.com/osrs-gold'
postUrl = 'https://www.rsmalls.com/index.php?route=common/quickbuy/rsdetail'

with requests.Session() as session:
    res = session.get(baseUrl)
    soup = BeautifulSoup(res.text, 'lxml')
    game_id = soup.select_one("#choose-game > option[selected]")['value']
    response = session.post(postUrl, data={'game_id': game_id}).json()
    print(f"{'Gold Price:'} {response['price']}")

В этом коде сначала я получаю идентификатор «Runescape 2007»,на случай, если владелец сайта изменит его.Вы можете пропустить этот шаг и напрямую указать значение «345» в качестве идентификатора для следующего пост-запроса, если вы уверены, что он не изменится.

Цена загружена кодом JS, как вы упомянули.Используя инструменты разработки браузера, я мог получить фактический запрос POST, чтобы получить цену, для которой требуется идентификатор, выбранный из выпадающего списка.Запрос POST к https://www.rsmalls.com/index.php?route=common/quickbuy/rsdetail, дает ответ json, например:

{"success":true,"product_id":"30730","price":0.85,"server_id":"1661","server_option":"463","quantity":"1|5|10|20|50|100|200|300|500|1000|1500|2000","name":"M"}

Итак, я проанализировал ответ как json и получил от него цену.
Дайте мне знать, если у вас естьлюбые вопросы.

РЕДАКТИРОВАТЬ:

Существует другой запрос POST на https://rsmalls.com/runescape3-gold,, поэтому то же решение не работает.Запрос POST может быть разным для каждой страницы / веб-сайта / данных.Вы можете найти такой пост самостоятельно, используя devtools для браузера, как показано здесь.Справа, где вы видите, что выполняется POST-запрос к URL, внизу вы найдете также данные, отправленные на POST-запрос.Также обратите внимание, что в ответ на этот запрос он всегда отвечает с ценой 1 единица, поэтому он может не совпадать, если количество единиц по умолчанию на сайте больше 1 (например, 5 на скриншоте ниже).

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...