Функция Requests.get () не дает того же результата, что и функция webbrowser.open () - PullRequest
1 голос
/ 06 ноября 2019

У меня есть URL, который мне нужно запустить, чтобы произошло обновление. Он обновит кэш данных и отобразит последние загруженные данные на сервере таблиц. URL выглядит следующим образом:

http://servername/views/workbookname/dashboard1?:refresh=yes

Когда я использую библиотеку веб-браузера, чтобы открыть URL-адрес, обновление выполняется, но я получаю браузер, который открыт. Когда я использую запросы, чтобы получить URL-адрес, он не обновляется и дает мне ответ 200, который я считаю успешным.

Кто-нибудь знает, почему это могло произойти? Как я могу молча использовать библиотеку webbrowser, чтобы открыть URL-адрес и впоследствии закрыть его, или чтобы запросы выполняли роль веб-браузера при выполнении функции get?

import webbrowser
url = 'http://servername/views/workbookname/dashboard1?:refresh=yes'
webbrowser.open(url)

import requests
url = "http://servername/views/workbookname/dashboard1?:refresh=yes"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36', "Upgrade-Insecure-Requests": "1","DNT": "1","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language": "en-US,en;q=0.5","Accept-Encoding": "gzip, deflate"}
html = requests.get(url,headers=headers)
print(html)

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

requests.get() просто возвращает разметку, полученную с сервера после запроса «GET», без дальнейшего выполнения на стороне клиента.

Принимая во внимание, что в контексте браузера гораздо больше можно сделать с помощью клиентского JavaScript. Я не смотрел вашу страницу специально, но, возможно, какой-то код JavaScript выполняет дальнейшую обработку.

Вместо web browser или requests вы можете использовать Selenium. Вы можете узнать больше об этом здесь .

Selenium позволяет вам просматривать страницы, как вы используете браузер, но также дает вам возможность автоматизировать + контролировать действия на странице с кодом Python.

Возможно, вы можете использовать Selenium Chrome Webdriver для загрузки страницы в фоновом режиме. (Или вы можете использовать драйвер Firefox).

Перейдите на chrome://settings/help, проверьте текущую версию Chrome и загрузите драйвер для этой версии с здесь . Обязательно сохраните файл драйвера в PATH или в той же папке, где находится скрипт Python.

Попробуйте:

from selenium.webdriver import Chrome # pip install selenium
from selenium.webdriver.chrome.options import Options

url = "http://servername/views/workbookname/dashboard1?:refresh=yes"

#Make it headless i.e. run in backgroud without opening chrome window
chrome_options = Options()  
chrome_options.add_argument("--headless")

# use Chrome to get page with javascript generated content
with Chrome(executable_path="./chromedriver", options=chrome_options) as browser:
     browser.get(url)
     page_source = browser.page_source

Примечание

Когда вы открываете свой URL, модуль webbrowser запускает браузер по умолчанию, в котором уже кэшированы ваши учетные данные / куки. Принимая во внимание, что если для доступа к вашему URL требуется какая-либо аутентификация или логин, вы должны будете указать это при получении страницы с использованием селена. Думайте о каждом сеансе веб-драйвера Selen как о сеансе incognito . Здесь - пример того, как имитировать вход в систему с помощью веб-драйвера.


Ссылки:

selenium - исполняемый файл chromedriver должен находиться в PATH

1 голос
/ 06 ноября 2019

Причина, по которой ваш браузер открывается, заключается просто в том, что именно так должна делать webbrowser.open (), вместо отправки HTTP-запроса он открывает браузер и вставляет URL-адрес. Возможным решением было бы использование селена вместо веб-браузера, потому что, когда я смотрел на него, я еще не нашел безголовый вариант для пакета, который вы используете. Итак, вот оно:

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

url = "<URL>"

chrome_options = Options()  
chrome_options.add_argument("--headless")

with Chrome(options=chrome_options) as browser:
     browser.get(url)

В случае, если это решение неприемлемо, потому что вам нужно использовать веб-драйвер вместо селена, вам нужно будет найти способ передачи параметров в ваш экземпляр браузера. Я не нашел способа с помощью dir () или help () передать этот аргумент веб-браузеру, но если я что-то найду, я его добавлю.

...