使用需要javascript输入的python刮取网站

时间:2016-12-27 01:43:56

标签: python web-scraping

我正在尝试使用以下python代码抓取网站

import re
import requests

def get_csrf(page):
    matchme = r'name="csrfToken" value="(.*)" /'
    csrf = re.search(matchme, str(page))
    csrf = csrf.group(1)
    return csrf

def login():
    login_url = 'https://www.edline.net/InterstitialLogin.page'

    with requests.Session() as s:
        login_page = s.get(login_url)
        csrf = get_csrf(login_page.text)

        username = 'USER'
        password = 'PASS'

        login = {'screenName': username,
                 'kclq': password,
                 'csrfToken': csrf,
                 'TCNK':'authenticationEntryComponent',
                 'submitEvent':'1',
                 'enterClicked':'true',
                 'ajaxSupported':'yes'}
        page = s.post(login_url, data=login)
        r = s.get("https://www.edline.net/UserDocList.page?")
        print(r.text)

login()

此代码成功登录https://www.edline.net/InterstitialLogin.page,但在尝试

时失败
r = s.get("https://www.edline.net/UserDocList.page?")
print(r.text)

它不打印预期的页面,而是抛出错误。经过进一步测试后,我发现即使您尝试从浏览器直接访问该页面,也会抛出此错误。这意味着访问页面的唯一方法是运行单击按钮时执行的代码。因此,当我调查页面源代码时,我发现用于链接到我试图抓取的页面的按钮使用以下代码

<a href="javascript:submitEvent('viewUserDocList', 'TCNK=headerComponent')" tabindex="-1">Private Reports</a>

所以基本上我正在寻找一种方法来在python中触发上面的javascript代码,以便刮掉结果页面。

1 个答案:

答案 0 :(得分:0)

由于网站使用javascript,您需要使用浏览器访问网页的硒等内容。以下代码将像其他代码一样登录到edline:

from selenium import webdriver
import time
driver = webdriver.Firefox() #any browser really
url = 'https://www.edline.net/InterstitialLogin.page'
driver.get(url)
username_text = driver.find_element_by_xpath('//*[@id="screenName"]') #finds the username text box
username_text.send_keys('username') #sends 'username' to the username text box
password_text = driver.find_element_by_xpath('//*[@id="kclq"]') #finds the password text box
password_text.send_keys('password') # sends 'password' to the password text box
click_button = 
driver.find_element_by_xpath('/html/body/form[3]/div/div[2]/div/div[1]/div[3]/button').click() #finds the submit button and clicks on it

登录后,可以获得完整的预期页面。通过Selenium文档很容易找到它们!如果您还有其他问题,请与我们联系。