用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/

赞赏

微信赞赏支付宝赞赏

发表评论