您的位置:首页 > 编程语言 > Python开发

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

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

可是本是初学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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫 豆瓣