Python网络爬虫之用户名密码及验证码登陆
对于登陆情况的处理
1.1 使用表单登陆
这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。
data = {data1:XXXXX, data2:XXXXX} Requests:data为dict,json import requests response = requests.post(url=url, data=data) Urllib2:data为string import urllib, urllib2 data = urllib.urlencode(data) req = urllib2.Request(url=url, data=data) response = urllib2.urlopen(req)
1.2 使用cookie登陆
使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。
import requests requests_session = requests.session() response = requests_session.post(url=url_login, data=data)
若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下:
response_captcha = requests_session.get(url=url_login, cookies=cookies) response1 = requests.get(url_login) # 未登陆 response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie! response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
网络爬虫之用户名密码及验证码登陆:爬取知乎网站一些说明:
-
使用requests包来爬取。首先尝试用用户名密码自动登陆,如果失败,则需要采用cookie登陆。 配置文件config.ini,其中包括用户名密码信息,如果有验证码情况,需要手动登陆一次网站获取cookie信息。 判断登陆成功与否,看生成的html文件中有没有用户信息。
代码分享:
# -*- coding: utf-8 -*- 网络爬虫之用户名密码及验证码登陆:爬取知乎网站 import requests import ConfigParser def create_session(): cf = ConfigParser.ConfigParser() cf.read(config.ini) cookies = cf.items(cookies) cookies = dict(cookies) from pprint import pprint pprint(cookies) email = cf.get(info, email) password = cf.get(info, password) session = requests.session() login_data = {email: email, password: password} header = { User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36, Host: www.zhihu.com, Referer: http://www.zhihu.com/ } r = session.post(http://www.zhihu.com/login/email, data=login_data, headers=header) if r.json()[r] == 1: print Login Failed, reason is:, for m in r.json()[data]: print r.json()[data][m] print So we use cookies to login in... has_cookies = False for key in cookies: if key != __name__ and cookies[key] != : has_cookies = True break if has_cookies is False: raise ValueError(请填写config.ini文件中的cookies项.) else: # r = requests.get(http://www.zhihu.com/login/email, cookies=cookies) # 实现验证码登陆 r = session.get(http://www.zhihu.com/login/email, cookies=cookies) # 实现验证码登陆 with open(login.html, w) as fp: fp.write(r.content) return session, cookies if __name__ == __main__: requests_session, requests_cookies = create_session() # url = http://www.zhihu.com/login/email url = http://www.zhihu.com/topic/19552832 # content = requests_session.get(url).content # 未登陆 # content = requests.get(url, cookies=requests_cookies).content # 已登陆 content = requests_session.get(url, cookies=requests_cookies).content # 已登陆 with open(url.html, w) as fp: fp.write(content)
①2000多本Python电子书有 ②Python开发环境安装教程有 ③Python400集+自学视频有 ④软件开发常用词汇有 ⑤Python学习路线图有 ⑥项目游戏源码案例分享有
下一篇:
用Python怎么进行web开发?