Python-爬虫(二)-urllib的代理设置和cookie设置自动登陆

目录

 

一:ProxyHandler处理器(代理设置)

二:cookie设置自动登陆

使用cookielib库和HTTPCookieProcessor模拟登陆:

设置cookie信息

三:cookie保存到本地


一:ProxyHandler处理器(代理设置)

许多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数过多,就会禁用这个iP,我们可以设置一些代理服务器,每隔一段时间换一个IP,就算IP被禁止,也可以换一个IP。

urllib中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理。

我们使用httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。

我们直接访问这个http://httpbin.org/ip页面会返回一个ip这个ip地址就是我们本机在外网中的地址。

我们使用代码设置代理的方式来访问看怎么做。

from urllib import request

url="http://httpbin.org/ip"

#不使用代理
res= request.urlopen(url)
print("代理之前",res.read())
#使用代理
#1:使用ProxyHandler,传入代理,得到代理handler
#handler=request.ProxyHandler({"http":"223.241.78.43:8010"})
#2:使用上面的handler创建一个opener
#opener=request.build_opener(handler)
#3:使用自定义的opener发起请求

#使用代理
#1使用ProxyHandler,传入代理构建一个handler
handler= request.ProxyHandler({"http":"113.195.200.33:9999"})
#2使用上面创建的handler构建一个opener
opener=request.build_opener(handler)
#3使用opener发送一个请求
req = request.Request('https://blog.csdn.net/A7_A8_A9/article/details/107299437')
resp=opener.open(req)
print(resp.read().decode("utf-8"))

这里设置代理之后我请求自己的博客,因为请求: http://httpbin.org/ip一直报如下错误:

  File "D:\Python\python-3.8\lib\urllib\request.py", line 1322, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>

没有得到解决。后续了解的更多的话再来解决。如果某位大佬看到知道如何解决请指点一二。

二:cookie设置自动登陆

在网站中,http是无状态的。也就是说即使第一次和服务器链接并登陆成功之后,第二次访问服务器,服务器仍不知道当前用户是哪一个,cookie的出现就是为了解决这个问题的。第一次登陆服务器返回一些(cookie)数据给浏览器,然后浏览器保存在本地,当该用户发送第二次发送请求给服务器的时候,就携带此cookie,这样服务器就知道是那个用户了。

Cookie的格式:

Set-Cookie: NAME=VALUE; Expires/Max-age=DATE; Path=PATH; Domain=DOMAIN_NAME;  SECURE

参数意义:

NAME:cookie的名字。

VALUE:cookie的值。

Expres: cookie的过期时间。

Path:cookie作用的路径。

Domain: cookie作用的域名。

SECURE:是否在https协议下作用。

使用cookielib库和HTTPCookieProcessor模拟登陆:

我们以人人网为例,如果我们直接访问人人网,如果之前没有登陆过,肯定让我们先进行登陆。比如如下代码:

from urllib import request

url="http://www.renren.com/332038891/profile"
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
req=request.Request(url,headers=header)
resStr=request.urlopen(req)
#print(resStr.read().decode("utf-8"))
with open("index.html","w",encoding="utf-8") as fp:
    #write写入的必须是str类型的,而resStr是字节byte
    #byte->decode->str
    #str->encode->byte
    fp.write(resStr.read().decode("utf-8"))

我们看生成的index.html如下:

设置cookie信息

登陆访问个人照片墙代码如下:

from urllib import request
from urllib import parse
from http.cookiejar import  CookieJar
def get_opener():
    # 1.登陆
    #1.1 创建一个cookiejar对象
    cookiejar=CookieJar()
    #1.2 使用cookiejar创建一个HTTPCOOKIEProcess对象
    handler=request.HTTPCookieProcessor(cookiejar)
    #1.3 使用上一步的handler创建一个opener
    opener=request.build_opener(handler)
    return opener
def login(opener):
    #1.4使用opener发送登陆的请求(人人网的邮箱和密码)
    header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
    data={"email":"18238903856","password":"*****94"}
    login_url="http://www.renren.com/PLogin.do"
    req=request.Request(login_url,data=parse.urlencode(data).encode("utf-8"),headers=header)
    opener.open(req)
def access_picturewall(opener):
    #2.访问主页
       #获取个人主页的页面时候不要新创建一个opener,还使用上面的那个,因为那个里面包含了cookie
    #个人照片墙地址
    picture_url="http://www.renren.com/974784400/newsfeed/photo"
    resp=opener.open(picture_url)
    with open("pciture.html","w", encoding="utf-8") as fp:
        fp.write(resp.read().decode("utf-8"))
if __name__ == '__main__':
    opener=get_opener()
    login(opener)
    access_picturewall(opener)

密码我就不明示了,这样就可以访问到照片墙,虽然我的照片墙啥也没有,如下:

三:cookie保存到本地

from urllib import request
from http.cookiejar import MozillaCookieJar
#1.使用MozillaCookieJar可以把cookie保存到本地,参数为保存的文件名
cookiejar= MozillaCookieJar("cookie.txt")
#2.创建handler
handler= request.HTTPCookieProcessor(cookiejar=cookiejar)
#3.构建opener
opener= request.build_opener(handler)
#4.发起请求
opener.open("https://blog.csdn.net/A7_A8_A9/article/details/107299437")
#5.保存cookie,ignore_discard=True表示即使cookie过期了也要保存下来
cookiejar.save(ignore_discard=True)

保存内容如下:

有保存,就有读取。读取操作如下:

from urllib import request
from http.cookiejar import MozillaCookieJar
#指定加载的文件
cookiejar=MozillaCookieJar("cookie.txt")
#如果创建cookiejar的时候不指定文件,load的时候也可以指定,ignore_discard=True参数和保存的时候参数一样
#过期的cookie是否加载进来
cookiejar.load(ignore_discard=True)
handler=request.HTTPCookieProcessor(cookiejar)
opener= request.build_opener(handler)
opener.open("http://www.baidu.com")
for cookie in cookiejar:
    print(cookie)

 看到打印的cookie,不仅有文件里面的cookie信息,还有请求百度返回的cookie信息,说明正常加载。这样我们后面可以把登陆的cookie保存本地,下次直接读取文件中的cookie,就不用再登陆了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用urllib库中的HTTPCookieProcessor和urllib.request.build_opener()方法来自动保存cookie。 具体步骤如下: 1. 导入urllib库中的HTTPCookieProcessor和urllib.request.build_opener()方法。 2. 创建一个CookieJar对象,用于保存cookie。 3. 创建一个HTTPCookieProcessor对象,并将CookieJar对象作为参数传入。 4. 使用urllib.request.build_opener()方法创建一个opener对象,并将HTTPCookieProcessor对象作为参数传入。 5. 使用opener对象发送请求,自动保存cookie。 示例代码如下: import urllib.request import http.cookiejar # 创建一个CookieJar对象,用于保存cookie cookie_jar = http.cookiejar.CookieJar() # 创建一个HTTPCookieProcessor对象,并将CookieJar对象作为参数传入 cookie_processor = urllib.request.HTTPCookieProcessor(cookie_jar) # 使用urllib.request.build_opener()方法创建一个opener对象,并将HTTPCookieProcessor对象作为参数传入 opener = urllib.request.build_opener(cookie_processor) # 使用opener对象发送请求,自动保存cookie response = opener.open('http://www.example.com') # 打印cookie for cookie in cookie_jar: print(cookie) ### 回答2: Python 是一种高级编程语言,非常适合进行网络数据爬取和处理。而在 Python 爬虫中,urllib 是一个重要的库,可以帮助我们轻松实现网页数据的请求和处理。 在进行 Python 爬虫开发时,有时需要保存 cookie ,以便之后再次使用,这在从网站中获取数据时非常有用。为了自动保存 cookie ,可以在 urllib 中使用 Request 类中的 http.cookiejar.CookieJar() 对象。 下面是一份用 Python 编写自动保存 cookie 的示例代码: ```python import urllib.request, http.cookiejar cookiejar = http.cookiejar.CookieJar() cookie_support = urllib.request.HTTPCookieProcessor(cookiejar) opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler) urllib.request.install_opener(opener) # 发送请求,并保存 cookie 信息 response = urllib.request.urlopen('http://www.baidu.com') for cookie in cookiejar: print('Name: ' + cookie.name) print('Value: ' + cookie.value) print('Host: ' + cookie.domain) print('Path: ' + cookie.path) # 保存 cookie 到文件 filename = 'cookie.txt' cookiejar.save(filename, ignore_discard=True, ignore_expires=True) ``` 在上面的代码中,首先创建了一个 CookieJar 对象,并将其作为参数传递给了 HTTPCookieProcessor 对象,然后使用 build_opener() 方法将其与 HTTP 请求处理器结合起来,并将其安装到全局 urllib.request 中。接下来,通过 urlopen() 方法向百度发送请求,并将返回的 cookie 信息保存到 CookieJar 对象中。最后,使用 save() 方法将 cookie 信息保存到 cookie.txt 文件中,并将 ignore_discard 和 ignore_expires 参数都设置为 True,以保证保存所有的 cookie 信息。 通过使用上述代码,我们可以轻松实现 Python 爬虫自动保存 cookie 的功能。同时,如果在后续的爬虫开发中需要使用之前保存的 cookie ,只需要将其从文件中读取并加载到 CookieJar 对象中即可。 ### 回答3: 在进行Python爬虫开发时,经常需要使用到urllib库来发送http请求。而使用urllib库发送的请求需要携带cookie,否则很多网站并不会认为用户已经登录,这样就会导致后续的操作受到限制。因此,在Python编写爬虫程序时,自动保存cookie就显得非常重要了,这样可以帮助我们实现更高效、稳定的爬虫程序。 首先,我们需要在Python中使用urllib库发送http请求获取cookie,这可以通过代码如下实现: ``` import urllib.request import http.cookiejar def get_cookie(): # 创建cookie实例 cookie = http.cookiejar.CookieJar() handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) # 发送请求 response = opener.open('http://www.example.com') # 输出得到的cookie for item in cookie: print(item.name + "=" + item.value) ``` 上述代码使用了Python中内置的cookiejar库来创建一个cookie实例,并使用HTTPCookieProcessor来处理发送请求时所携带的cookie。最后我们可以使用for循环来遍历返回的cookie。 当然,如果我们需要将cookie保存下来,稍作处理,方便后续的使用,我们可以对上述代码进行一定的修改,如下: ``` import urllib.request import http.cookiejar def save_cookie(): filename = 'cookie.txt' # 创建MozillaCookieJar实例 cookie = http.cookiejar.MozillaCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) # 发送请求 response = opener.open('http://www.example.com') # 保存cookie到文件 cookie.save(ignore_discard=True, ignore_expires=True) ``` 在上述代码中,我们在创建cookie实例时,使用了MozzillaCookieJar,这是一个专门用于保存cookie的对象,它可以直接将cookie保存到文件中。在进行cookie保存时,我们可以忽略掉cookie过期的时间,以及当窗口关闭时cookie是否自动清除的属性。最后,我们可以使用cookie.save()函数直接将cookie保存到文件中。 除了上述的方法,我们还可以在cookie文件中查找到需要用到的cookie值,这可以通过如下代码实现: ``` import urllib.request import http.cookiejar def load_cookie(): filename = 'cookie.txt' # 创建MozillaCookieJar实例 cookie = http.cookiejar.MozillaCookieJar() cookie.load(filename, ignore_discard=True, ignore_expires=True) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) # 发送请求 response = opener.open('http://www.example.com') # 输出返回的结果 print(response.read().decode('utf-8')) ``` 上述代码中,我们可以通过调用cookie.load()函数,从之前保存的cookie文件中读取出cookie数据,然后使用HTTPCookieProcessor来处理发送请求时所携带的cookie,并使用build_opener创建对应的opener对象,以访问目标网站。最后我们可以通过response.read()方法得到服务器返回的结果,然后进行后续处理。 总的来说,自动保存cookie可以帮助我们更加轻松、高效地使用Python进行爬虫开发,同时也可以提高爬虫程序的稳定性。如果我们能够正确地使用上述方法,相信自动保存cookie爬虫程序开发中将会发挥不可替代的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姑苏冷

您的打赏是对原创文章最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值