将python请求与javascript页面一起使用
我试图将Requests框架与python()结合使用,但我试图访问的页面使用javascript获取我想要的信息 我曾尝试在web上搜索解决方案,但事实上,我正在使用关键字javascript进行搜索,我得到的大部分内容都是如何使用javascript语言进行搜索将python请求与javascript页面一起使用,python,web-scraping,python-requests,Python,Web Scraping,Python Requests,我试图将Requests框架与python()结合使用,但我试图访问的页面使用javascript获取我想要的信息 我曾尝试在web上搜索解决方案,但事实上,我正在使用关键字javascript进行搜索,我得到的大部分内容都是如何使用javascript语言进行搜索 是否有必要对使用javascript的页面使用requests框架?您必须发出与javascript相同的请求(使用请求库)。您可以使用任意数量的工具(包括内置于Chrome和Firefox中的工具)来检查来自javascript的
是否有必要对使用javascript的页面使用requests框架?您必须发出与javascript相同的请求(使用请求库)。您可以使用任意数量的工具(包括内置于Chrome和Firefox中的工具)来检查来自javascript的http请求,只需自己从Python发出此请求。虽然Selenium看起来很吸引人而且很有用,但它有一个无法修复的主要问题:性能。通过计算浏览器所做的每一件事,您将需要更多的功能。即使是PhantomJS也不能与简单的请求竞争。我建议您仅在确实需要单击按钮时使用Selenium。如果您只需要javascript,我建议您使用PyQt(检查以了解它) 但是,如果您想使用Selenium,我建议使用Chrome而不是PhantomJS。许多用户在PhantomJS中遇到问题,网站根本无法在PhantomJS中工作。Chrome也可以是无头(非图形化)的 首先,确保您已经安装了ChromeDriver,Selenium在使用Google Chrome时依赖它 然后,通过在URL中检查Google Chrome版本60或更高版本,确保您拥有该版本chrome://settings/help 现在,您只需执行以下代码:
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
查找元素:
使用元素或元素方法。示例:driver.find_element_by_css_selector("div.logo-subtext") #Find your country in Google. (singular)
- 驱动程序。通过_css_选择器(css_选择器)查找_元素#匹配此css选择器的每个元素
- 驱动程序。通过类名称(类名称)查找元素
- 驱动程序。通过_id(id)查找_元素#具有以下id的每个元素
- 驱动程序。通过链接文本(链接文本)查找元素
- 驱动程序。通过部分链接文本(部分链接文本)查找元素
- driver.find_element_by_name(name)#name=argument的每个元素
- driver.find_element_by_tag_name(tag_name)#使用tag name参数的每个元素
- elem.tag_name#可以在一个窗口中返回按钮
- elem.get_属性(“id”)#返回元素的id
- elem.text#元素的内部文本
- elem.clear()#清除文本输入
- 元素是否显示()#对于可见元素为True,对于不可见元素为False
- 元素is_enabled()#对于启用的输入为True,否则为False
- 元素是否选中()#是否选中此单选按钮或复选框元素
- elem.location#表示屏幕上元素的X和Y位置的字典
- 元素。单击()#单击元素
- elem.send_键(“legend27”)#在elem中键入legend27(用于文本输入)
- elem.submit()#提交elem参与的表单
- driver.back()#单击后退按钮
- driver.forward()#单击前进按钮
- driver.refresh()#刷新页面
- driver.quit()#关闭浏览器,包括所有选项卡
- foo=driver.execute_脚本(“return'hello';”)#执行javascript(可以获取返回值!)
美丽的小组,这样你就可以做类似的事情了
r.html.find('#myElementID').text
它返回HTML元素的内容,正如您所期望的那样。它是Pypetteer或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
使用Selenium或支持jQuery的请求速度较慢。更有效的方法是在网站检查浏览器上的JavaScript后找出生成的cookie,然后获取cookie并将其用于每个请求
在一个示例中,它通过以下cookies工作:
在本例中检查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即可。因此,没有办法让请求使用JavaScript。不,请求是一个http库。它不能运行JavaScript。我使用Chrome工具调试网站,并查找Javascript正在调用。到目前为止,您可以看到我创建的结果,这是最好的。您还可以获得很好的JSON,以便更容易获取数据。应该是r.html.find(“#myElementID”).text
?以及r=session.get('http://www.yourjspage.com“)
?在解决了菲尔指出的问题后,我仍然“RuntimeError:无法在现有事件循环中使用HTMLSession。请改用AsyncHTMLSession。”@KubaFYI是的,他们可以开始将内容转移到python3@HuckIt要解决此问题,将导入AsyncHTMLSession
而不是htmlession
,并使用wait session.get(url.result().arender()调用渲染
。我刚刚遇到了这个问题,我就是这样解决的。正如在文档请求中所写的那样,html在后台使用Chromium。所以它是Chromium浏览器,由请求(如包装器)控制。
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"
})