每天30分钟 一起来学习爬虫——day6(urllib库——cookie和auth认证,实例:人人网模拟登录)

auth认证

有的公司抓取自己的网站做数据分析,这时一般用户登录的话权限特别小,这是一般有个admin,

import urllib.parse
import urllib.request
# 公司爬取内网数据的时候可能用,不过后面都用requests


def auth_nei_wang():
    user = 'username'
    pwd = 'lsdfdfsd'
    neiwang_url = 'http://192.168.179.66'  # 这是自己编的内网 ip

    # 创建密码管理器,和昨天一样,用HTTPPasswordMgrWithDefaultRealm
    pwd_manage = urllib.request.HTTPPasswordMgrWithDefaultRealm()
    pwd_manage.add_password(None, neiwang_url, user, pwd)

    # 创建认证处理器 handler,这时候就不同了,使用的是HTTPBasicAuthHandler
    handler = urllib.request.HTTPBasicAuthHandler(pwd_manage)
    # 创建opener
    opener = urllib.request.build_opener(handler)

    response = opener.open(neiwang_url)


# 调用一下看看
auth_nei_wang()

没有什么难的东西,主要是介绍不同的处理器,用到什么功能,选择什么处理器,下面主要看 cookie

cookie ,人人网模拟登录

首先我们知道 http 协议 是无状态的(即两次连接没有关系),
比如我现在看到的是这个界面:
在这里插入图片描述

然后我复制这个网址http://www.renren.com/973708073/profile其他浏览器,但是出现了如图的,,要我登录的界面

在这里插入图片描述

其实cookie 就是在登录的时候,服务端给客户端的一个身份信息,用来记录用户身份,当我在同一个浏览器使用这个网址的时候,浏览器就是客户端,它已经保存了身份信息,所以不需要再次登录, 但是当我用其他浏览器时,并没有携带 cookie所以出现了要我登录的界面

模拟登录:通过程序访问登录后的页面。
两个思路

  1. 登录时抓包得到 cookie 然后写入代码
  2. 通过代码直接模拟登录 :

下面先看第一种

手动登录,抓包,把cookie写入代码中登录
这里我们仍然要使用一下抓包工具(不会的看看这个Fiddle抓包工具使用)其实用谷歌自带的也可以,但是,我习惯这个
在这里插入图片描述在这里插入图片描述

# 这个是直接把cookie 写进 header

import urllib.parse
import urllib.request
url = 'http://www.renren.com/973708073/profile'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'Cookie': ''# 引号里写刚才复制下来的cookie,
}
# 构建请求对象,发送请求,这是之前学的
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)

with open('rr.html', 'w', encoding='utf8') as f:
    f.write(response.read().decode())

双击打开,我们就可以看到个人主页了
在这里插入图片描述

如果我们把cookie注释掉,我们会看到,要登陆的界面

在这里插入图片描述



下面我们来看第二种方法:

这里用户是输入然后点击登录,我们需要的是携带参数,发送请求
还是看我们刚才抓到的数据,这次找到login这条信息如图:
在这里插入图片描述我们查看他的Formdata,可以看到有许多信息,下面呢我们要做的就是

  1. 对这个地址发送post请求,注意去Raw里把请求的网站也复制下来,记得带着Formdata,把cookie保存下来,
  2. 用保存有cookie的东西来向 个人主页 发送get请求
# 这里是直接用代码 模拟登录
import urllib.request
import urllib.parse
post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2020142158520'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}

# 构建和处理表单数据
form_data = {
    'rkey': '',# 这里写自己抓取的对应的信息
    'password': '',# 这里写自己抓取的对应的信息
    'origURL': 'http://www.renren.com/home',
    'key_id': '1',
    'icode': '',
    'f': 'http%3A%2F%2Fsafe.renren.com%2Fsecurity%2Faccount',
    'email': '',# 这里写自己抓取的对应的信息
    'domain': 'renren.com',
    'captcha_type': 'web_login',
}
# 处理表单数据
# POST data 应该是 bytes 而不是 str 所以我们把字典拼接,然后转化为 bytes 类型
form_data = urllib.parse.urlencode(form_data).encode()

# 发送请求,获得响应,
request = urllib.request.Request(url=post_url, headers=headers)
response = urllib.request.urlopen(request, data=form_data)
# print(response.read().decode())发现已经登录成功了。
#下面我们访问个人主页,,,

get_url = 'http://www.renren.com/973708073/profile'

req = urllib.request.Request(url=get_url, headers=headers)

respon = urllib.request.urlopen(req)

with open('renren.html', 'wb') as f:
    f.write(respon.read())

双击打开后,,很遗憾,得到的是需要登录的界面,这是为什么呢???(问号 三连)
其实,我们虽然访问成功了,但是,我们并没有保存下来cookie信息,这个时候去访问 个人主页 当然还是不行啊(哭唧唧

接下来我们看看到底该如何保存cookie
这里我们用一个叫做HTTPCookieProcessor的处理器

# 这里是直接用代码 模拟登录,
# 在登录的时候 抓取 post 得到 formdata
# 发送完 post 请求后,吧 cookie 保存在代码中
import urllib.request
import urllib.parse
import http.cookiejar

# 创建一个cookiejar的对象,这个是用来保存cookie的
cj = http.cookiejar.CookieJar()
# 通过cj 创建一个handler处理器
handler = urllib.request.HTTPCookieProcessor(cj)
# 根据handler 创建一个 opener
opener = urllib.request.build_opener(handler)
# 这以后,所有的请求都用opener发送
post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2020142158520'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

form_data = {
    'rkey':  '',#这里写自己抓取的对应的信息
    'password':	'', #这里写自己抓取的对应的信息
	'origURL'	:'http://www.renren.com/home',
    'key_id':'1',
    'icode': '',
    'f':'http%3A%2F%2Fsafe.renren.com%2Fsecurity%2Faccount',
    'email': '', #这里写自己抓取的对应的信息
    'domain': 'renren.com',
    'captcha_type': 'web_login',
}
# 同样处理表单数据,构建请求对象
form_data = urllib.parse.urlencode(form_data).encode()
request = urllib.request.Request(url=post_url, headers=headers)
# 这之后的请求都是通过 opener来发送的
response = opener.open(request, data=form_data)
# print(response.read().decode())
# opener 在第一次发送成功 后,会把服务器的 cookie 保存在 cj 里面。
# 这次再访问个人主页看看
get_url = 'http://www.renren.com/973708073/profile'
req = urllib.request.Request(url=get_url, headers=headers)

respon = opener.open(req)
with open('renren.html', 'wb') as f:
    f.write(respon.read())

总结一下:
创建一个 cookiejar 的对象
cj = http.cookiejar.CookieJar()
通过 cj 创建一个 handler 类
handler = urllib.request.HTTPCookieProcessor(cj)
根据 handler 创建一个 opener
opener = urllib.request.build_opener(handler)
这以后,所有的请求都用 opener 发送


关于urllib我们大致学的就差不多了,明天我们来 学习第三方库requests


我又来要赞了,如果觉得可以学到点什么的话,,点个赞再走吧,
欢迎各位大佬品论指正错误

发布了50 篇原创文章 · 获赞 50 · 访问量 2710

猜你喜欢

转载自blog.csdn.net/weixin_45691686/article/details/104968164
今日推荐