通过请求

时间:2015-07-22 19:40:55

标签: login http-post python-requests urllib2 cas

我试图通过我的大学CAS登录页面到达数据库,然后循环浏览一些已经收集的网址,用BeautifulSoup美化它们,然后从辅助URL(通过BeautifulSoup找到)下载PDF。在我的大学网络上,我已经能够用urllib完成所有这些工作(因此不必担心通过登录页面)但我无法弄清楚如何通过登录页面然后返工/重做我在urllib中的代码。

我对所有事情都非常陌生,而我对这一切的理解是基本的,但却在不断发展。我在这里搜索了很多方法并在其他地方尝试了很多方法,但我遇到的一个主要问题是我不知道这是否真的有效。

编辑:我真的需要帮助弄清楚为什么我无法通过登录页面。我试过的一切,每当我尝试打印登录页面之外的页面时,它只返回登录页面!每当有人在网上提出这类问题时,总会得到一些回答:哦,我用Python请求"但除了我在下面尝试的内容之外,其他任何代码都没有。我真的很想帮助弄清楚什么是错的。

这是我到目前为止已经超越登录页面以及徒劳地试图美化一个网址:

import requests
from bs4 import BeautifulSoup

# url for login page
url = "https://login.gmu.edu/login?service=http%3a%2f%2fmutex.gmu.edu%2flogin%3fqurl%3dezp.2aHR0cDovL3NlYXJjaC5wcm9xdWVzdC5jb20vcHFybD9hY2NvdW50aWQ9MTQ1NDE-"
# url for hidden page
shorturl = 'http://search.proquest.com.mutex.gmu.edu/hnpwashingtonpost/docview/141535544?accountid=14541'

payload = {
'username': 'myusername',
'password': 'mypassword'
#'_eventID': 'submit',
#'submit': 'LOGIN'
}

with requests.Session() as c:
    c.post(url, data=payload)
    result = c.get(shorturl)
    f = result.content
    soup = BeautifulSoup(f)
    links = soup.find_all('embed')
    for link in links:
        print link
编辑:Lukasa已经向我展示了如何将下面的代码翻译成请求。我确实需要一些帮助才能通过登录,否则我脚本的其余部分毫无意义。

这是我在urllib2中的代码,我不知道如何更改为使用请求(它首先从临时文件导入一个短网址数组):

# this is the section I need help translating to Requests although since I can't 
# prettify even one url after the login page it's a bit of a moot point at the moment
request2 = urllib2.Request(longurl)
print("... Sending HTTP GET to %s" % longurl)
f2 = opener.open(request2)
data = f2.read()
f2.close()
opener.close()

i = 0
while os.path.exists("Jun62-%s.pdf" % i ):
    i += 1

FILE = open("Jun62-%s.pdf" % i, "wb")
FILE.write(data)
FILE.close()

任何和所有帮助/建议都将非常感激。我严重阻碍了该做什么以及从哪里开始。谢谢!

1 个答案:

答案 0 :(得分:0)

这是一个字面翻译,因此您可以看到urllib2如何转换为请求。可以说你的代码可以通过一些更改来更加惯用,但这在这里没有用。

重要的一块位于底部:

with requests.Session() as c:
    c.post(url, data=payload)
    result = c.get(shorturl)
    f = result.content
    soup = BeautifulSoup(f)
    links = soup.find_all('embed')
    for link in links:
        link = link["src"].split("src=")[-1]
        longurl = link

        r = c.get(longurl)

        i = 0
        while os.path.exists("Jun62-%s.pdf" % i ):
            i += 1

        FILE = open("Jun62-%s.pdf" % i, "wb")
        FILE.write(r.content)
        FILE.close()

正如您所看到的,这是转移到请求的一个重要原因:您的6行块变为带有请求的单行。