Requests.get() 函数不会给出与 webbrowser.open() 函数相同的结果
Requests.get() function does not give same result as the webbrowser.open() function
我有一个 url,我需要 运行 才能进行刷新。它将刷新数据缓存并在 Tableau Server 中显示最新上传的数据。 url 是这样的:
http://servername/views/workbookname/dashboard1?:refresh=yes
当我使用 webbrowser 库打开 url 时,执行了刷新,但我得到了一个打开的浏览器。当我使用请求获取 url 时,它不会刷新并给我一个 200 的响应,我认为这是成功的。
有人知道为什么会这样吗?我怎样才能默默地使用网络浏览器库打开 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)
您的浏览器打开的原因仅仅是因为那是 webbrowser.open() 应该做的,而不是发送 HTTP 请求,它打开浏览器并放入 URL。一个可能的解决方案是使用 selenium 而不是 webbrowser,因为当我查看它时,我还没有找到你正在使用的包的无头选项。所以这里是:
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)
如果此解决方案不可接受,因为您需要使用 webdriver 而不是 selenium,则您需要找到一种方法将选项传递给浏览器实例。我没有找到使用 dir() 或 help() 将此参数传递给 webbrowser 的方法,但如果我找到了一些东西,我会添加它。
requests.get()
只是 returns 在 'GET' 请求后从服务器收到的标记,无需任何进一步的客户端执行。
而在浏览器上下文中,可以在客户端完成更多工作 javascript。我没有专门查看您的页面,但可能有某些 javascript 代码在做进一步处理。
您可以使用 Selenium 而不是 web browser
或 requests
。您可以阅读更多相关信息 here.
Selenium 让您可以像使用浏览器一样浏览页面,还可以让您灵活地使用 python 代码来自动化 + 控制页面上的操作。
您或许可以使用 Selenium Chrome Webdriver 在后台加载页面。 (或者您可以使用 Firefox 驱动程序)。
转到 chrome://settings/help
检查您当前的 chrome 版本并从 here 下载该版本的驱动程序。确保将驱动程序文件保存在 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
模块会启动您的默认浏览器,该浏览器已经缓存了您的 credentials/cookies。然而,如果您的 URL 需要任何身份验证或登录才能访问,则您必须在使用 selenium 获取页面时提供这些。将每个 selenium 网络驱动程序会话视为一个 incognito 会话。 Here 是一个关于如何使用网络驱动程序模拟登录的示例。
参考文献:
我有一个 url,我需要 运行 才能进行刷新。它将刷新数据缓存并在 Tableau Server 中显示最新上传的数据。 url 是这样的:
http://servername/views/workbookname/dashboard1?:refresh=yes
当我使用 webbrowser 库打开 url 时,执行了刷新,但我得到了一个打开的浏览器。当我使用请求获取 url 时,它不会刷新并给我一个 200 的响应,我认为这是成功的。
有人知道为什么会这样吗?我怎样才能默默地使用网络浏览器库打开 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)
您的浏览器打开的原因仅仅是因为那是 webbrowser.open() 应该做的,而不是发送 HTTP 请求,它打开浏览器并放入 URL。一个可能的解决方案是使用 selenium 而不是 webbrowser,因为当我查看它时,我还没有找到你正在使用的包的无头选项。所以这里是:
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)
如果此解决方案不可接受,因为您需要使用 webdriver 而不是 selenium,则您需要找到一种方法将选项传递给浏览器实例。我没有找到使用 dir() 或 help() 将此参数传递给 webbrowser 的方法,但如果我找到了一些东西,我会添加它。
requests.get()
只是 returns 在 'GET' 请求后从服务器收到的标记,无需任何进一步的客户端执行。
而在浏览器上下文中,可以在客户端完成更多工作 javascript。我没有专门查看您的页面,但可能有某些 javascript 代码在做进一步处理。
您可以使用 Selenium 而不是 web browser
或 requests
。您可以阅读更多相关信息 here.
Selenium 让您可以像使用浏览器一样浏览页面,还可以让您灵活地使用 python 代码来自动化 + 控制页面上的操作。
您或许可以使用 Selenium Chrome Webdriver 在后台加载页面。 (或者您可以使用 Firefox 驱动程序)。
转到 chrome://settings/help
检查您当前的 chrome 版本并从 here 下载该版本的驱动程序。确保将驱动程序文件保存在 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
模块会启动您的默认浏览器,该浏览器已经缓存了您的 credentials/cookies。然而,如果您的 URL 需要任何身份验证或登录才能访问,则您必须在使用 selenium 获取页面时提供这些。将每个 selenium 网络驱动程序会话视为一个 incognito 会话。 Here 是一个关于如何使用网络驱动程序模拟登录的示例。
参考文献: