От селена к запросам - PullRequest
       5

От селена к запросам

0 голосов
/ 13 апреля 2020

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

Это мой код, который печатает таблицу с веб-страницы.

Я не могу понять, как я мог бы использовать запросы, чтобы сделать этот код быстрее и на питоне c.

#my imports
import pandas as pd
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException, NoSuchElementException,StaleElementReferenceException
from datetime import datetime
import untangle,xmltodict,glob, os, csv, time
from openpyxl import load_workbook

#Paths that i use later in code
path = r"G:\Meu Drive\Balanços\\"
pathxml =r"C:\Users\GuilhermeMachado\Documents\XML\\"

#Pandas table configs
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

#chromedriver options
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
options.add_argument("--disable-extensions")
options.add_argument("--incognito")
options.add_experimental_option("prefs", {
  "download.default_directory": pathxml,
  "download.prompt_for_download": False,
  "download.directory_upgrade": True,
  "safebrowsing.enabled": True
})

driver = webdriver.Chrome(options=options)
driver.implicitly_wait(2)

#URL i want to get data from
driver.get('http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/fundos-de-investimentos/fii/')
#driver.maximize_window()
time.sleep(2)
iframe = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.ID, 'bvmf_iframe')))
driver.switch_to.frame(iframe)

#the table i need to scrap
tabel = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, '//table[@class="responsive"]')))

time.sleep(2)
df = pd.read_html(driver.page_source)[0]
print(df)

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Если вы используете запросы, вы не получите данные в iframe. То, что вы, похоже, ищете. Просматривая вашу страницу, я вижу, что на таблицу iframe ссылается следующий URL http://bvmf.bmfbovespa.com.br/Fundos-Listados/FundosListados.aspx?tipoFundo=imobiliario&Idioma=pt-br

Если этот URL-адрес остается постоянным, то вы можете использовать запросы для получения содержимого этого URL, используя следующее. Затем вы можете использовать beautifulSoup для разбора таблицы.

from urllib.request import Request, urlopen    
page = Request("http://bvmf.bmfbovespa.com.br/Fundos-Listados/FundosListados.aspx?tipoFundo=imobiliario&Idioma=pt-br")
content = urlopen(page).read()
print(content)

Редактировать: В качестве альтернативы, вы все равно можете запросить главную страницу. Используйте Beautifulsoup, чтобы найти iframe и получить тег sr c, который приведет к этой новой ссылке. Затем используйте другой запрос для получения данных таблицы.

Edit2: Простое решение

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

page = Request("http://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/fundos-de-investimentos/fii/")
content = urlopen(page).read()
soup = BeautifulSoup(content, 'html.parser')
iframe_url = soup.find('iframe', id='bvmf_iframe')['src']

page = Request(iframe_url)
content = urlopen(page).read()
soup = BeautifulSoup(content, 'html.parser')

table = soup.find('table')
print(table)
0 голосов
/ 13 апреля 2020

Вот пример получения данных таблицы с использованием запросов и BeautifulSoup . Обратите внимание, что ни одна из них не является частью стандартной библиотеки, и их необходимо установить (например, с помощью pip).

import requests
from bs4 import BeautifulSoup

url = 'http://bvmf.bmfbovespa.com.br/Fundos-Listados/FundosListados.aspx?tipoFundo=imobiliario&Idioma=pt-br'
r = requests.get(url)
soup = BeautifulSoup(r.content)

table = soup.find('table')
rows = table.find_all('tr')
for row in rows:
    columns = row.find_all('td')
    if len(columns) == 4:  # skip rows without 4 cells
        razao, fundo, segmento, codigo = columns
        print(razao.text)  # prints the company names
...