我正在尝试使用python(http://docs.python-requests.org/en/latest/)的Requests框架,但我试图访问的页面使用javascript来获取我想要的信息。
我试图在网上搜索一个解决方案,但事实上我正在搜索关键字javascript我得到的大部分内容是如何使用javascript语言。
是否有使用请求框架的页面使用javascript?
答案 0 :(得分:26)
您将不得不使用javascript创建相同的请求(使用Requests库)。您可以使用任意数量的工具(包括Chrome和Firefox中内置的工具)来检查来自javascript的http请求,并自行从Python发出此请求。
答案 1 :(得分:15)
虽然Selenium看起来很诱人且有用,但它有一个无法解决的主要问题:性能。通过计算浏览器所做的每件事,您将需要更多的功能。甚至PhantomJS也不会与简单的请求竞争。我建议您在真正需要单击按钮时才使用Selenium。如果你只需要javascript,我推荐PyQt(检查https://www.youtube.com/watch?v=FSH77vnOGqU来学习它。)
但是,如果您想使用Selenium,我推荐Chrome over PhantomJS。很多用户都遇到PhantomJS的问题,其中一个网站根本无法在Phantom中运行。 Chrome也可以是无头的(非图形化的)!
首先,请确保您已安装了Chlenium所依赖的ChromeDriver,以便使用Google Chrome。
然后,通过在网址chrome:// settings / help
中查看,确保您拥有版本为60或更高版本的Google Chrome现在,您需要做的就是以下代码:
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
如果您不知道如何使用Selenium,请参阅以下快速概述:
driver.get("https://www.google.com") #Browser goes to google.com
寻找元素:
使用ELEMENTS或ELEMENT方法。实例:
driver.find_element_by_css_selector("div.logo-subtext") #Find your country in Google. (singular)
确定!我找到了一个元素(或元素列表)。但我现在该怎么办?
以下是您可以对元素 elem 执行的方法:
特殊命令:
答案 2 :(得分:6)
好消息:现在有一个支持javascript的请求模块:https://pypi.org/project/requests-html/
from requests_html import HTMLSession
session = HTMLSession()
r = session('http://www.yourjspage.com')
r.html.render() # this call executes the js in the page
我认为,BeautifulSoup
可以作为奖励,所以您可以做类似的事情
r.find('#myElementID').text
它将按预期返回HTML元素的内容。
答案 3 :(得分:2)
我没有足够的声誉来发表评论,但我想分享使用“ requests_html”包的经验。
它实际上将网页上的所有内容下载到本地以执行所有操作。对我来说,这是极度冒险的。输出如下:
r.html.render() # this call executes the js in the page
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
100%|██████████| 84299992/84299992 [00:18<00:00, 4644126.66it/s]
[W:pyppeteer.chromium_downloader]
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: .../Library/Application Support/pyppeteer/local-chromium/575458
答案 4 :(得分:-1)
它是围绕pyppeteer还是smth的包装? :(我认为这有所不同
@property
async def browser(self):
if not hasattr(self, "_browser"):
self._browser = await pyppeteer.launch(ignoreHTTPSErrors=not(self.verify), headless=True, args=self.__browser_args)
return self._browser
答案 5 :(得分:-1)
使用 Selenium 或 jQuery 启用的请求很慢。在网站检查浏览器上的 JavaScript 之后找出哪个 cookie 生成并获取该 cookie 并将其用于您的每个请求会更有效。
在一个示例中,它通过以下 cookie 起作用:
在此示例中检查 javascript 后生成的 cookie 是“cf_clearance”。 所以只需创建一个会话。 像这样更新 cookie 和标题:
s = requests.Session()
s.cookies["cf_clearance"] = "cb4c883efc59d0e990caf7508902591f4569e7bf-1617321078-0-150"
s.headers.update({
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
})
并且您无需使用诸如 Selenium 之类的 JavaScript 解决方案就好了。这是更快和有效的方式。你只需要在打开浏览器后获取一次 cookie。