在python 3.6中使用urllib保持会话打开

时间:2017-12-27 14:01:24

标签: python-3.x urllib

我正在尝试登录scrape tumblr但是当您通常通过浏览器登录网站时,它有两个步骤(首先输入电子邮件并检查是否有与该电子邮件关联的帐户然后您可以输入如果电子邮件正确,请输入密码)。不幸的是,当尝试在不使用请求模块的情况下自动执行此登录时,这会出现一些问题(我正在尝试使用已在python 3.6中提供的urllib.request和urllib.parse),因为没有明确的启动方式会话,以便您可以为电子邮件验证保留相同的会话,然后输入电子邮件。

我是否需要使用cookie来执行此操作,还是必须安装请求模块?到目前为止,我的代码看起来有点像这样:

import urllib.request
import urllib.parse
from html.parser import HTMLParser

input_tags = []

class myHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
    if tag == "input":
        for i in range(len(attrs)):
            if attrs[i][0] == "name" and attrs[i][1] == "form_key":
                input_tags.append(attrs[i+1][1])

parser = myHTMLParser()

form_key = ""

def get_form_key():
    global form_key
    global input_tags
    url = "https://www.tumblr.com/login"
    req = urllib.request.Request(url)
    resp = urllib.request.urlopen(req)
    resp = resp.read()
    parser.feed(str(resp))
    print(input_tags)
    form_key = input_tags
    print("form key is : ", form_key)
    if len(form_key) > 1:
        form_key = form_key[:1]
    print("\nform key should be one value long now: ", form_key)

get_form_key()

headers = {}
headers["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"

url = "https://www.tumblr.com/login"


login_data = {
    "determine_email" : "my.email@email.com",
    "user[email]" : "my.email@email.com",
    "user[password]" : "secretpassword",
    "tumblrlog[name]" : "",
    "user[age]" : "",
    "http_referer" : "https://www.tumblr.com/logout",
    "form_key" : form_key
    }

encoded_data = urllib.parse.urlencode(data)
encoded_data = encoded_data.encode("utf-8")

request = urllib.request.Request(url, headers = headers, data = encoded_data)
response = urllib.request.urlopen(request)
response_url = response.geturl()
print(response_url)

这会打印两次表单键(不是那个重要的,只是来自我的错误检查),然后它返回url: https://www.tumblr.com/login 这表明腰部没有成功。

知道如何解决这个问题吗?

0 个答案:

没有答案