【问题标题】:Web scraping a simulator content网页抓取模拟器内容
【发布时间】:2019-05-24 09:38:13
【问题描述】:

我正在尝试从网站上抓取模拟器中的一些数据,但我被困在其中一个上。我无法获取 JSON 结构。

这是我尝试过的:

import requests

url_puzzle = 'https://puzzle.pt/scripts/ITSector_Simulator.js?'
headers_puzzle = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'} 

response_puzzle = requests.get(url_puzzle, headers=headers_puzzle).json()

我想要的是获得模拟器返回的 TAN、TAEG、MTIC... 或提供给模拟器的整个 JSON 结构。

【问题讨论】:

  • 检查网络选项卡,观察模拟器发送什么样的请求,最重要的是在什么 url,参数是什么,你手动在那个 url 发送请求并获取数据和模拟器中的一样。
  • 嗯,我找不到手动操作的参数或完整的 url :(
  • 这是一个 js 文件。你希望从中得到什么?查看 js,它似乎都是其他页面用来操作内容的函数等(例如,使用提供的函数定义执行某些计算)。使用这个js文件的网页url是什么?
  • @QHarr 来自此网页 (puzzle.pt/pt),我想获取模拟器的一组给定值的 TAN、TAEG、MTIC...。我想我必须使用带有参数的 POST 来返回此信息,但我不知道如何
  • 您希望更改 Escolher o montante 和 Definir o prazo 等的值吗?

标签: python json web-scraping python-requests


【解决方案1】:

一种冗长的方法是单击 +/- 以实现您的目标值。这使用硒。你可以试试 sendKeys 到 amountdays webElements 而不是点击。

例如

amount.clear()
amount.send_keys(escolher_o_montante)
days.clear()
days.send_keys(definir_o_prazo) 

我目前无法对此进行测试。您可能需要添加“€”和“meses”。不确定因为无法测试该选项是否有效。

Python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select

url = 'https://puzzle.pt/pt'
d = webdriver.Chrome()
d.get(url)
d.maximize_window()
escolher_o_montante = 2000
definir_o_prazo = 40
marcar_o_dia_dos_pagamentos = 1 #24

amount = d.find_element_by_css_selector('#simAmountInput')
days = d.find_element_by_css_selector('#simDaysInput')
up_amount = d.find_element_by_css_selector('#amountSlider + .slider-plus')
down_amount = d.find_element_by_css_selector('[data-for=amountSlider].slider-minus')
up_days = d.find_element_by_css_selector('#deadlineSlider + .slider-plus')
down_days = d.find_element_by_css_selector('[data-for="amountSlider"].slider-minus')
one = d.find_element_by_css_selector('#day38')
twenty_four = d.find_element_by_css_selector('#day52')
amount.clear()

while amount.get_attribute('value').replace(' €','') != escolher_o_montante:
    current_amount = amount.get_attribute('value').replace(' €','')
    if int(current_amount) > escolher_o_montante: down_amount.click()
    if int(current_amount) < escolher_o_montante: up_amount.click()

while days.get_attribute('value').replace(' meses','') != definir_o_prazo:
    current_days = days.get_attribute('value').replace(' €','')
    if int(current_days) > definir_o_prazo: down_days.click()
    if int(current_days) < definir_o_prazo: up_days.click()

if marcar_o_dia_dos_pagamentos == 1:
    one.click()
else if marcar_o_dia_dos_pagamentos == 24:
    twenty_four.click()
else:
    print('invalid option')

mtic = d.find_element_by_css_selector('#TotalvalueToReturn').text
tan = d.find_element_by_css_selector('#TanValue').text
taeg = d.find_element_by_css_selector('#TAEGValue').text
prestação_mensal = d.find_element_by_css_selector('#MonthlyValueToReturn').text

【讨论】:

  • 感谢您的回答。我相信我的 cookie 消息有问题...代码打开网站然后冻结。我相信它正在等待在 cookie 消息中选择“确定”。有没有办法覆盖它?
  • 是的。检查 cookie 横幅的 html。找到接受元素并单击它。
  • d.find_element_by_css_selector("#CybotCookiebotDialogBodyButtonAccept").click()
猜你喜欢
  • 1970-01-01
  • 2010-10-09
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多