如何使用Python请求到达转发的网页?

时间:2015-03-05 15:18:23

标签: python web-scraping python-requests

如何使用Python请求访问以下网页?

https://www.fidelity.com.hk/investor/en/fund-prices-performance/fund-price-details/factsheet-historical-nav-dividends.page?FundId=10306

enter image description here

转发页面,直到我点击2“接受”按钮。

enter image description here

这就是我的所作所为:

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>

3 个答案:

答案 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&amp;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设置:

  • “irdFundId”,来自“FundId”表单输入的“FundId”值或来自请求的URL的值(参见“?FundId = 10306”)
  • “isAgreed =是”
  • “isExpand =真”
  • 带有时间戳的“lastAgreedTime”

让我们使用此信息来构建使用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)

您无法使用requestsurllib模块处理JavaScript。但根据我的知识(不多),我会告诉你我将如何解决这个问题。

此网站使用特定Cookie来了解您是否已接受其政策。如果没有,服务器会将您重定向到上图所示的页面。使用一些附加组件查找该cookie并手动设置,以便网站向您显示您正在寻找的内容。

另一种方法是使用Qt的内置Web浏览器(使用WebKit)来执行JavaScript代码。只需使用evaluateJavaScript("agree();")就可以了。

希望它有所帮助。