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

python模拟登陆网站

2018-01-15 16:56 369 查看
  上次写了一个C++的小爬虫,能够爬一些网站上的图片,但是有些网站需要登陆后才能访问内容,用C++的话需要openSSL,配置起来好像挺麻烦的,所以选择了python,以及使用reques网络库。

  模拟登陆,也就是我们要知道登陆的过程,以及我们在网页中发出的请求是什么,比如,账号、密码、验证码,等等,当我们得到以上的数据,然后POST出去后,我们要记录下cookie(用于辨识用户身份以及存储一些数据),然后通过加载这个cookie去访问网站内的其他网址。

  本来想爬取知乎来着,但是知乎现在改版,加入了挺多要提交的数据,我是不知道怎么弄了,而豆瓣的话,我在查看网页代码的时候,发现验证码的地址是每次都在变化,而知乎的验证码就是一个地址,只是返回的结果不同,而豆瓣的每次都不一样,所以无从下手,下面的代码是从加载cookie访问的。

  运行douban()函数后会加载captcha,然后用opencv的打开图片功能打开,然后输出图片的内容,然后把数据POST到服务器,测试是否成功,则通过去请求一个网站内只有用户的访问的网址,若成功则返回内容,否则返回登陆的内(目前验证码无从下手,只试了一下加载cookie)

代码:

from http import cookiejar
import requests
import cv2
import re

def downLoadCaptcha(url):
captcha=requests.get(url)
image=open('captcha.jpg','wb')
image.write(captcha.content)
image.close()

def printCaptcha():
img=cv2.imread('captcha.jpg')
cv2.imshow('yzm',img)
cv2.waitKey()
str=input('输入验证码:')
print('输入的验证码为:%s'%str)
return str
def getCaptchaUrlAndId(url):
login=requests.get(url)
tmp=str(login.content.decode('utf_8'))
ruler=re.compile(r'name="captcha-id"(.*)value="(.*)"')
match=ruler.search(tmp)
if match:
#豆瓣captcha格式
temp='https://www.douban.com/misc/captcha?id='+match.group(2)+'&size=s'
mlist=[match.group(2),temp]
return mlist

def readCookie(cookieName):
f=open(cookieName,'r')
temp=f.read()
f.close()
cookie={}
for i in temp.split('\n'):
key,value=i.split(':',1)
cookie[key]=value
print(cookie)
return cookie
#豆瓣爬取
def douban():
username='******@qq.com'
password='*****'
data={
'form_email':username,
'form_password':password,
'redir':'http://www.douban.com',
'captcha-solution':'',
'captcha-id':'',
'source':'index_nav',
}
url='https://accounts.douban.com/login'
#afturl为测试数据,登陆后可见
afturl='https://www.douban.com/people/172618226'
#首先获取登陆界面的验证码
captcha=getCaptchaUrlAndId(url)
captcha_id=captcha[0]
print('captcha url :%s'%captcha[1])
#验证码显示及输入
downLoadCaptcha(captcha[1])
yzm=printCaptcha()
data['captcha-solution']=str(yzm)
data['captcha-id']=str(captcha_id)
print(data)
print('验证码:%s'%yzm)
#post请求
login=requests.post(url,data=data)
loginafter=requests.get(afturl,cookies=login.cookies)
#记录内容
f=open('text.txt','wb')
f.write(loginafter.content)
f.close()

#main为加载cookie访问
def main():
url='https://accounts.douban.com/login'
cookie=readCookie('cookies.txt')
loginafter=requests.get('https://www.douban.com/people/172618226',cookies=cookie)
f=open('text1.txt','wb')
f.write(loginafter.content)
f.close()
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: