我正在尝试使用以下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代码,以便刮掉结果页面。
答案 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文档很容易找到它们!如果您还有其他问题,请与我们联系。