python:使用随机属性抓取网站

时间:2017-01-19 17:00:21

标签: python html web-scraping web-crawler

完全披露:我是网络抓取的新手,我对HTML的体验非常有限。如果我做错了,或者你需要更多信息,请告诉我。

私人内容:MY_PASSWORD,MY_USERNAME,MY_SCHOOL,SITE2

我的目标:使用我的学生帐户抓取我有权访问的学校网页(https://SITE2.MY_SCHOOL.edu/Main_Page.Asp?Page=Select_Subject)。

网站信息:当我在浏览器上输入https://SITE2.MY_SCHOOL.edu/时,我会被重定向到https://login.MY_SCHOOL.edu/?App=J4200以登录我的学校帐户。

登录后,我被重定向回https://SITE2.MY_SCHOOL.edu/Main_Page.Asp?Page=Select_Subject(我要抓的页面)

问题:刷新https://login.MY_SCHOOL.edu/?App=J4200时,输入ID /类型的名称属性'密码'随机化,输入名称的值属性' EncryptedStamp'是随机的。我可以从加载的页面获取所有这些信息,如下所示。当我拨打session.post('https://login.MY_SCHOOL.edu/?App=J4200', data=form)

import requests, lxml.html

s = requests.session()
login = s.get("https://login.MY_SCHOOL.edu/")

login_html = lxml.html.fromstring(login.text)
hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]')

  # The input type 'password' has a name tag that changes on refresh
  # See the example form below
password_input = login_html.xpath(r'//form//input[@type="password"]')

password_nametag = password_input[0].name
jse_id = s.cookies['JSESSIONID']

  # Create dict used as 'data' argument of POST request
form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
form['AlternateID'] = 'MY_USERNAME'    # AlternateID is name tag for username
form[password_nametag] = 'MY_PASSWORD'
form['JSESSIONID'] = jse_id

示例表单:

{'AlternateID': 'MY_USERNAME',
 'App': 'MY_SCHOOLNet',
 'EncryptedStamp': 'ZYWSNQLPJKMH',
 'JSESSIONID': 'EFC8B3319A63332484DFE8F90E4E0272',
 'MXVQY': 'MY_PASSWORD'}

响应:

response = s.post('https://login.MY_SCHOOL.edu/?App=J4200', data=form)
         # s.get will return the same results
print(response.url)
  'https://login.MY_SCHOOL.edu/'
  # I think this should be https://SITE2.MY_SCHOOL.edu/Main_Page.Asp?Page=Select_Subject

重新运行所有表单行以更新表单:

{'AlternateID': 'MY_USERNAME',
'App': 'MY_SCHOOLNet',
'EncryptedStamp':'ZYWSNQLPJKMH',
'JSESSIONID':'EFC8B3319A63332484DFE8F90E4E0272',
'RYCSX': 'MY_PASSWORD'}

我认为解决方案:更新页面而不刷新页面,以防止这两个属性发生变化。我不知道怎么回事。谷歌说要使用JQuery,但这对于我甚至可能得不到的结果来说是一个陡峭的学习曲线。

感谢阅读,我期待着任何建议。

0 个答案:

没有答案