如何使用Python请求访问以下网页?
转发页面,直到我点击2“接受”按钮。
这就是我的所作所为:
import requests
s = requests.Session()
r = s.post("https://www.fidelity.com.hk/investor/en/important-notice.page?submit=true&componentID=1298599783876")
r = s.get("https://www.fidelity.com.hk/investor/en/fund-prices-performance/fund-price-details/factsheet-historical-nav-dividends.page?&FundId=10306")
如何处理第一个“接受”按钮,我检查过有一个名为“已接受”的cookie,我是否正确?:
<a id="terms_use_accept" class="btn btn-default standard-btn smallBtn" title="Accept" href="javascript:void(0);">Accept</a>
答案 0 :(得分:1)
首先,requests
不是浏览器,并且没有内置的JavaScript引擎。
但是,当您单击“接受”时,可以通过检查浏览器中发生的情况来模仿不相关的逻辑。这就是 Browser Developer Tools 很方便。
如果在第一个“接受/拒绝”弹出窗口中单击“接受”,则会设置“accepted = true”cookie。至于第二个“接受”,下面是按钮链接在源代码中的显示方式:
<a href="javascript:agree()">
<img src="/static/images/investor/en/buttons/accept_Btn.jpg" alt="Accept" title="Accept">
</a>
如果单击按钮agree()
正在调用该功能。以下是它的作用:
function agree() {
$("form[name='agreeFrom']").submit();
}
换句话说,正在提交agreeFrom
表单。此表单已隐藏,但您可以在源代码中找到它:
<form name="agreeFrom" action="/investor/en/important-notice.page?submit=true&componentID=1298599783876" method="post">
<input value="Agree" name="iwPreActions" type="hidden">
<input name="TargetPageName" type="hidden" value="en/fund-prices-performance/fund-price-details/factsheet-historical-nav-dividends">
<input type="hidden" name="FundId" value="10306">
</form>
我们可以使用requests
提交此表单。但是,有一个更容易的选择。如果单击“接受”并检查设置了哪些cookie,您会注意到除“已接受”外,还有4个新的Cookie设置:
让我们使用此信息来构建使用requests
+ BeautifulSoup
的解决方案(对于HTML解析部分):
import time
from bs4 import BeautifulSoup
import requests
from requests.cookies import cookiejar_from_dict
fund_id = '10306'
last_agreed_time = str(int(time.time() * 1000))
url = 'https://www.fidelity.com.hk/investor/en/fund-prices-performance/fund-price-details/factsheet-historical-nav-dividends.page'
with requests.Session() as session:
session.headers = {'User-Agent': 'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}
session.cookies = cookiejar_from_dict({
'accepted': 'true',
'irdFundId': fund_id,
'isAgreed': 'yes',
'isExpand': 'true',
'lastAgreedTime': last_agreed_time
})
response = session.get(url, params={'FundId': fund_id})
soup = BeautifulSoup(response.content)
print soup.title
打印:
Fidelity Funds - America Fund A-USD| Fidelity
这意味着我们正在看到所需的页面。
答案 1 :(得分:1)
您还可以使用名为selenium
的浏览器自动化工具来处理它:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox() # could also be headless: webdriver.PhantomJS()
driver.get('https://www.fidelity.com.hk/investor/en/fund-prices-performance/fund-price-details/factsheet-historical-nav-dividends.page?FundId=10306')
# switch to the popup
frame = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "iframe.cboxIframe")))
driver.switch_to.frame(frame)
# click accept
accept = driver.find_element_by_link_text('Accept')
accept.click()
# switch back to the main window
driver.switch_to.default_content()
# click accept
accept = driver.find_element_by_xpath('//a[img[@title="Accept"]]')
accept.click()
# wait for the page title to load
WebDriverWait(driver, 10).until(EC.title_is("Fidelity Funds - America Fund A-USD| Fidelity"))
# TODO: extract the data from the page
答案 2 :(得分:0)
您无法使用requests
和urllib
模块处理JavaScript。但根据我的知识(不多),我会告诉你我将如何解决这个问题。
此网站使用特定Cookie来了解您是否已接受其政策。如果没有,服务器会将您重定向到上图所示的页面。使用一些附加组件查找该cookie并手动设置,以便网站向您显示您正在寻找的内容。
另一种方法是使用Qt的内置Web浏览器(使用WebKit)来执行JavaScript代码。只需使用evaluateJavaScript("agree();")
就可以了。
希望它有所帮助。