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

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

可是本是初学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.py

import urllib2
import re
import cookielib
import EncodePostData
import webbrowser

class 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 urllib

def 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)
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值