python爬虫模拟登录网站(一)-----豆瓣

来源:互联网 发布:淘宝装修自定义内容区 编辑:程序博客网 时间:2024/06/09 04:55

在爬虫模拟登录的程序实现中,有很多网站比如新浪登录过程很复杂,而且还有很多数据加密传输,但是豆瓣就稍微简单一点了

可是本是初学python爬虫,所以在自己写登录程序时还是遇到了很多问题。

不多BB,进入正文。

一、分析一下吧

1、登录程序中,看到要先找到登录地址url=“https://accounts.douban.com/login”,我使用的是火狐的HttpFox,先在浏览器上使用账户密码登录一下,使用工具HttpFox获取到header和提交的数据
这里写图片描述
这里写图片描述

2、在post data中可以看到几个传输的参数,提交的数据在源码里找到相应的位置,其值就可以在源码里面提取出来。

3、在登录的时候还需要判断是否需要输入验证码,在我的程序里使用的是半自动化,从源码中获取到验证码图片的地址,程序自动打开浏览器并打开图片,人为手动在控制台输入验证码。

4、豆瓣的登录程序较简单,所以只需要找到提交的数据,然后模拟提交并获取到cookie就可以登录进去了。

5、问题就来了,对于初学者的我来说,获取cookie的方法还不是很熟悉,所以花了很多时间来完成了这个程序,主要问题是在提交数据方面正确,各种数据获取也正确,但是就是登录不进去,响应返回的是一大堆乱码的东西,后来对cookie进行了值的跟踪监测,总算发现了问题,在程序获取cookie时并没有获取到原始cookie,导致后面提交了表单后的cookie出错,也是导致登录失败的主要原因。经过逻辑和cookie的使用方式的更正后,程序模拟登录成功了。!!

二、程序实现

直接上全部源代码吧。。

# DoubanMain.pyimport urllib2import reimport cookielibimport EncodePostDataimport webbrowserclass DOUBAN:    def __init__(self, username, password):        # 初始化登录地址、账号和密码        self.loginUrl = "https://accounts.douban.com/login"        self.username = username        self.password = password        self.cookies = cookielib.CookieJar()        self.headers = {            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',            'Host': 'accounts.douban.com',            'Referer': 'https://accounts.douban.com/login?alias=&redir=https%3A%2F%2Fwww.douban.com%2F&source=index_nav&error=1001',            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',            'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',            'Accept-Encoding': 'gzip, deflate, br',            'Content-Type': 'application/x-www-form-urlencoded',            'Content-Length': '129'        }    # 登录程序    def login(self):        self.EnableCookieAndProxy()   # 使用代理        source, redir, yzmUrl, captchaID = self.getData()   # 返回相关post数据和验证码链接        if yzmUrl:  # 如果有验证码            captchaSolution = self.getCaptchSolution(yzmUrl)   # 获取验证码            print captchaSolution        else:            captchaSolution = ""        postData = EncodePostData.PostEncode(self.username, self.password, source, redir, captchaSolution, captchaID)        request = urllib2.Request(self.loginUrl, postData, self.headers)        response = urllib2.urlopen(self.loginUrl, postData)    # 添加代理和cookie    def EnableCookieAndProxy(self):        # 添加cookie        cookieSupport = urllib2.HTTPCookieProcessor(self.cookies)        # 添加代理        proxySupport = urllib2.ProxyHandler({'http': '58.222.254.11:3128'})  # 使用代理        opener = urllib2.build_opener(proxySupport, cookieSupport, urllib2.HTTPHandler)        urllib2.install_opener(opener)  # 构建对应的opener    # 获取post数据和验证码链接    def getData(self):        page = urllib2.urlopen(self.loginUrl).read()        # source, redir, captchaID, login, yzm        pattern = re.compile('<input name="source".*?value="(.*?)".*?<input name="redir".*?value="(.*?)".*?<img id="captcha_image" src="(.*?)".*?<input.*?name="captcha-id" value="(.*?)"', re.S)        items = re.search(pattern, page)        print "captcha-id: ", items.group(4)        #       source          redir           yzmUrl          captcha-id        return items.group(1), items.group(2), items.group(3), items.group(4)    # 读取验证码    def getCaptchSolution(self, yzmUrl):        webbrowser.open_new_tab(yzmUrl)  # 打开验证码图片        # 手动输入验证码        yzm = raw_input("请输入浏览器显示的验证码: ")        return str(yzm)# 测试代码db = DOUBAN("这是账号", "这是密码")db.login()
# EncodePostData.py# 封装post数据import urllibdef PostEncode(username, password, source, redir, captchaSolution, captchaID):    postData = {        'form_email': username,        'form_password': password,        'source': source,        'redir': redir,        'login': "登录"    }    if captchaSolution:        postData['captcha-solution'] = captchaSolution        postData['captcha-id'] = captchaID    print "post data: ", postData    return urllib.urlencode(postData)
0 0
原创粉丝点击