用python模拟登录网站获取cookies(urllib与requests)
最近在学习使用python爬取网页信息,之前也写了几篇网站爬取以及图文混排爬取到word中的例子,有兴趣的可以在本站搜索python。之前大部分是不需要登录就可以访问的资源,所以使用python爬取的时候不需要登录。但是有些网站的信息(比如论坛)必须要登录用户才能访问,使用常规的python方法就无法获取到了。对于这种需要登录才能获取内容的网站,目前接触到两种方法,第一种是使用 Selenium库来调用浏览器 (chrome或firefox浏览器),模拟真实的用户操作浏览器来获取数据;另一种方法就是使用 模拟登录来获取并保存cookies,并且能实现获取目标url时携带cookies进行身份验证。本文仅介绍第二种方法,部分代码来自网络基于2.x版本修改,如果你使用的时python2.x版本可以尝试修改下再使用。
源码一、python3.7+cookiejar+urllib模拟登录人人获取cookies
#encoding=utf-8 #import urllib2 #ModuleNotFoundError: No module named 'urllib2' import urllib.request import urllib #import cookielib #ModuleNotFoundError: No module named 'cookielib' import http.cookiejar def renrenBrower(url,user,password): #登陆页面,可以通过抓包工具分析获得,如fiddler,wireshark #login_page用户名及密码post提交的目标url,也可以用网页打开登录地址F12查看form表单的action地址,或netwrok里面查看提交地址 login_page = "http://www.renren.com/PLogin.do" try: # 创建cookiejar实例对象 #cookie = http.cookiejar.CookieJar() cookie = http.cookiejar.MozillaCookieJar("cookie.txt") #这个用于保存cookies #cookie = cookiejar.MozillaCookieJar() #读取cookies #cookie.load("cookie.txt") print(cookie) # <CookieJar[]> # 创建管理器 cookie_handler = urllib.request.HTTPCookieProcessor(cookie) http_handler = urllib.request.HTTPHandler() https_handler = urllib.request.HTTPSHandler() # 创建请求求管理器 opener = urllib.request.build_opener(cookie_handler, http_handler, https_handler) #获得一个cookieJar实例 #cj = cookielib.CookieJar() #cj = http.cookiejar.CookieJar() #cookieJar作为参数,获得一个opener的实例 #opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) #伪装成一个正常的浏览器,避免有些web服务器拒绝访问。 opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')] #生成Post数据,含有登陆用户名密码。 #data = urllib.urlencode({"email":user,"password":password}) #urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus) data = urllib.parse.urlencode({"email":user,"password":password}).encode('utf-8') # 提交类型不能为str,需要为byte类型 # email 及password 是表单的名字浏览器F12里面查看,另外有些站点需要提交csrf隐藏表单 #以post的方法访问登陆页面,访问之后cookieJar会自定保存cookie opener.open(login_page,data) #以带cookie的方式访问页面 op=opener.open(url) print(cookie) cookie.save() #读取页面源码 data= op.read().decode("UTF-8") return data except Exception as e: print(str(e)) #访问某用户的个人主页,其实这已经实现了人人网的签到功能。 #result = renrenBrower("http://www.renren.com/home","用户名","密码") # #我们想要获取登录后的http://www.renren.com/309365594/profile?v=info_timeline页面的内容 result = renrenBrower("http://www.renren.com/309365594/profile?v=info_timeline","xxxx@163.com","mima123446") print(result)
正常使用中还需进一步对返回的结果页面进行处理,这里就不介绍了,可以在本站搜索python查看之前的教程结合使用。
源码二、python3.7+requests模拟登录人人获取cookies
#encoding=utf-8 import requests def renrenBrower(url,user,password): #登陆页面,可以通过抓包工具分析获得,如fiddler,wireshark #login_page用户名及密码post提交的目标url,也可以用网页打开登录地址F12查看form表单的action地址,或netwrok里面查看提交地址 login_page = "http://www.renren.com/PLogin.do" try: # 创建Session对象 # requests库的session对象会在同一个session实例的所有请求之间使用cookies保持登录状态 session = requests.Session() #伪装成一个正常的浏览器,避免有些web服务器拒绝访问。 headers = {'User-agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'} #headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'} #在session中发送登录请求,此后这个session里就存储了cookie #可以用print(session.cookies.get_dict())查看 resp = session.post(login_page,{"email":user,"password":password})#post提交表单数据到登录地址 # email 及password 是表单的名字浏览器F12里面查看,另外有些站点需要提交csrf隐藏表单 resp = session.get(url,headers=headers)#携带cookies 以get方式访问目标url data = resp.content.decode('UTF-8') print(session.cookies.get_dict()) return data except Exception as e: print(str(e)) #访问某用户的个人主页,其实这已经实现了人人网的签到功能。 #result = renrenBrower("http://www.renren.com/home","用户名","密码") #我们想要获取登录后的http://www.renren.com/309365594/profile?v=info_timeline页面的内容 result = renrenBrower("http://www.renren.com/309365594/profile?v=info_timeline","xxxx@163.com","mima123446") print(result)
总体而言使用requests还是比较方便的,推荐使用这种方法!
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/python-login-getcookies/
赞赏
微信赞赏支付宝赞赏
发表评论