python模拟登陆网站
2018-01-15 16:56
369 查看
上次写了一个C++的小爬虫,能够爬一些网站上的图片,但是有些网站需要登陆后才能访问内容,用C++的话需要openSSL,配置起来好像挺麻烦的,所以选择了python,以及使用reques网络库。
模拟登陆,也就是我们要知道登陆的过程,以及我们在网页中发出的请求是什么,比如,账号、密码、验证码,等等,当我们得到以上的数据,然后POST出去后,我们要记录下cookie(用于辨识用户身份以及存储一些数据),然后通过加载这个cookie去访问网站内的其他网址。
本来想爬取知乎来着,但是知乎现在改版,加入了挺多要提交的数据,我是不知道怎么弄了,而豆瓣的话,我在查看网页代码的时候,发现验证码的地址是每次都在变化,而知乎的验证码就是一个地址,只是返回的结果不同,而豆瓣的每次都不一样,所以无从下手,下面的代码是从加载cookie访问的。
运行douban()函数后会加载captcha,然后用opencv的打开图片功能打开,然后输出图片的内容,然后把数据POST到服务器,测试是否成功,则通过去请求一个网站内只有用户的访问的网址,若成功则返回内容,否则返回登陆的内(目前验证码无从下手,只试了一下加载cookie)
代码:
模拟登陆,也就是我们要知道登陆的过程,以及我们在网页中发出的请求是什么,比如,账号、密码、验证码,等等,当我们得到以上的数据,然后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()
相关文章推荐
- python模拟登陆网站
- python模拟网站登陆
- Python使用requests库模拟登陆网站的方式--以豆瓣为例
- python模拟浏览器webdriver登陆网站后抓取页面并输出
- Python模拟浏览器登陆网站
- python模拟登陆网站抓取数据
- python之selenium模拟网站登陆
- Python模拟用户登陆网站
- 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站
- (转)Python-详解抓取网站,模拟登陆,抓取动态网页的原理和实现
- 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站
- python模拟登陆后用户访问网站
- 【python学习】模拟登陆网站
- 详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
- Python使用requests库模拟登陆网站的方式--以豆瓣为例
- Python模拟浏览器登陆网站
- 【转】详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
- 模拟登陆网站 之 Python版(内含两种版本的完整的可运行的代码)
- 如何用Python去实现抓取静态网页+抓取动态网页+模拟登陆网站
- Python3.5.2模拟网站登陆