python模拟登陆网站

  上次写了一个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()

猜你喜欢

转载自blog.csdn.net/qq_21049875/article/details/79066413