urllib库如何设置代理&如何传递并保存cookie【python爬虫入门进阶】(02-3)

举报
码农飞哥 发表于 2021/11/22 07:41:23 2021/11/22
【摘要】 urllib库如何设置代理&如何传递并保存cookie

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
😁 1. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
💪🏻 2. Python基础专栏,基础知识一网打尽。 Python从入门到精通
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

@[TOC]

前言

上一篇文章我们简单的介绍了urllib库的简单使用,这篇文章同样来简单介绍下urllib库的使用,本文主要侧重于介绍如果设置代理服务器,以及如何传递和保存cookie。

如何设置代理服务器

很多网站都会检测同一个IP的访问次数,如果访问次数过多的话,它会禁止这个IP的访问。IP被禁止了就不能爬取数据了,所以我们需要设置代理服务器,每隔一段时间就更换一个代理,就换这个IP被禁止了,也可以换个IP继续访问。
这里的代理服务器是正向代理,也就是让代理服务器帮我们发起请求。
urllib库中有个ProxyHandler处理器,可以设置代理服务器。
首先,找一个靠谱的代理服务器网站,这里我找了快代理,访问该链接,拉到网站底部,就可以看到代理IP列表了。该列表详细记录了每个代理IP支持的地址,端口,以及支持的请求类型和请求方法。
在这里插入图片描述

from urllib import request
handle = request.ProxyHandler({'http': "111.231.86.149:7890"})

ProxyHandler方法支持传入一个字典,字典的key是http或者https。字典的value是代理的IP地址以及代理的端口。
使用代理的正确方式是:

from urllib import request

url = 'http://httpbin.org/ip'
# 1. 使用ProxyHandler,传入代理构建一个handler
handle = request.ProxyHandler({'http': "111.231.86.149:7890"})
# 2. 使用上面创建的handler构建一个opener
opener = request.build_opener(handle)
# 3. 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())
  1. 使用ProxyHandler,传入代理构建一个handler
  2. 使用第一步创建的handler来构建一个opener。
  3. 使用opener去发送一个请求。

这里需要介绍一下 http://httpbin.org/ip,该网站是用于测试一个http请求和响应的服务。可以用来在线测试Http的请求。
在这里插入图片描述

cookie是什么

http请求是无状态的,即每次请求都是一个全新的请求。但是对于那些需要登录的接口,我们需要通过某种方式将用户的登录信息告诉服务器。cookie就是用来实现处理这种问题的方式。用户登录之后,用户的登录信息会存在浏览器的cookie中,当请求其他需要登录的接口是浏览器会将cookie中的信息放在请求头中随请求传给服务器。
下面就简单介绍下如何实现自动登录以及在请求中传递cookie。
这里以秀展网为例。
未登录的时候是这样子的:
在这里插入图片描述
登录之后是这样的
在这里插入图片描述
下面就通过爬虫的方式来实现自动登录,登录成功之后访问主页。

  1. 保存cookie
    python中通过http.cookiejar模块来操作cookie的
    该模块主要的类有CookieJar,FileCookieJar,MozillaCookieJar、LWPCookieJar 这四个类的作用分别如下:
  2. CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie,向传出HTTP请求添加cookie的对象,整个cookie都是存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
  3. FileCookieJar(filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。delayload为True时支持延迟访问文件,即只有需要时才读取文件或在文件中存储数据。
  4. MozillaCookieJar(filename,delayload=None,policy=None): 从FileCookieJar派生而来,创建与Mozilla浏览器cookie.txt兼容的FileCookieJar实例。
  5. LWPCookieJar(filename,delayload=None,policy=None): 从FileCookieJar派生而来,创建与libwww-per标准的Set-Cookie3文件格式兼容的FileCookieJar实例。
# 创建CookieJar的处理器
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
  1. 登录秀展网
    这里的umail表示用户名,upass表示用户密码,需要替换成可用的用户名和密码。
    同时这个接口的请求方式是form-data的方法。
# 登录
def login_blog():
    url = 'https://www.xiuzhan365.com/userLoad/handle-user-log-in.php'
    data = {
        'umail': '6956',
        'upass': '12314132',
        'remember': 1
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
        "Content-Type": 'application/x-www-form-urlencoded'
    }
    req = request.Request(url=url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
    resp = opener.open(req)
    print(resp.read().decode('utf-8'))
  1. 访问主页
# 访问主页
def visit_home():
    url = 'https://www.xiuzhan365.com/'
    req = request.Request(url, headers=head)
    resp = opener.open(req)
    with open('xiuzhan.html', 'w') as fp:
        fp.write(resp.read().decode('utf-8'))

访问主页,并将接口的响应接口保存到xiuzhan.html中。 访问xiuzhan.html页面可以看到如下信息,这就表明此时访问主页是已经是登录的状态了。
在这里插入图片描述
这里本质上是使用opener发送多个请求,多个请求之间共享cookie
特别需要注意:
由于https://www.xiuzhan365.com/ 是一个https的链接,如果直接运行的话会报ssl的错误。这里就需要定义一个HTTPSHandler的Handler
并且在生成opener的时候传入。就像下面这样。

import ssl
context = ssl._create_unverified_context()
# 支持https请求
https_handler = request.HTTPSHandler(context=context)
# 保存cookie
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler, https_handler)

完整代码如下:

from urllib import request, parse
from http.cookiejar import CookieJar
import ssl

context = ssl._create_unverified_context()

# 支持https请求
https_handler = request.HTTPSHandler(context=context)

# 保存cookie
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)

opener = request.build_opener(handler, https_handler)

head = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}


# 登录
def login_blog():
    url = 'https://www.xiuzhan365.com/userLoad/handle-user-log-in.php'
    data = {
        'umail': '6956',
        'upass': '12314132',
        'remember': 1
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
        "Content-Type": 'application/x-www-form-urlencoded'
    }
    req = request.Request(url=url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
    resp = opener.open(req)
    print(resp.read().decode('utf-8'))


# 访问主页
def visit_home():
    url = 'https://www.xiuzhan365.com/'
    req = request.Request(url, headers=head)
    resp = opener.open(req)
    with open('xiuzhan.html', 'w') as fp:
        fp.write(resp.read().decode('utf-8'))


if __name__ == '__main__':
    login_blog()
    visit_home()

保存cookie到文件中

前面说的cookieJar是将cookie信息保存到内存中,如果我们想把cookie信息保存到文件中,那么就需要使用MozillaCookieJar来操作了。
示例代码如下:

from urllib import request
from http.cookiejar import MozillaCookieJar

cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)

url = 'http://httpbin.org/cookies/set?username=test'
resp = opener.open(url)
cookiejar.save(ignore_discard=True)

这里将cookie信息保存到了cookie.txt文件中,传入ignore_discard参数的话就是将 即将过期的cookie信息也保存起来。

总结

本文简单介绍了如何urllib库如何设置代理&如何传递并保存cookie。希望对读者朋友们有所帮助。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200