使用 cookie 进行模拟登陆与爬虫自动登陆访问授权页面

代理IP

许多网站都有反爬技术,或当爬虫使用同一个 IP 进行高速的信息爬取时,对方服务器可能会将这个 IP 禁止访问此网站。所以爬虫需要许多的 IP 来进行信息的爬取

代理的原理

在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到数据后,再转发给我们的代码

运用 ProxyHandler 实现代理 IP

我们可以使用 http://httpbin.org/ip 来查看我们的 IP

首先使用 urllib.request.ProxyHandler 来传入一个代理,这个代理是一个字典。字典的 key 以来与代理服务器能够接受的类型(http 或 https),value 是 ip:port ,例如:47.98.174.153:8118。
使用上一步创建的 handler,以及 request.build_opener 创建一个 opener 对象
使用上一步创建的 opener,调用 open 函数,发起请求

from urllib import request, parse

# url = 'http://httpbin.org/ip'
# resp = request.urlopen(url)
# print(resp.read())

handler = request.ProxyHandler({'http': '47.98.174.153:8118'})
opener = request.build_opener(handler)
resp = opener.open("http://httpbin.org/ip")
print(resp.read())

使用代理前:
在这里插入图片描述
使用代理后:
在这里插入图片描述

cookie

在网站里, http 请求是无状态的,在首次与服务器连接并成功登陆后,服务器识别出登陆者是谁,但当第二次登陆时,服务器无法识别登陆者是谁。而使用cookie可以解决这个问题,在第一次登陆后服务器会返回一些 cookie 信息给浏览器,浏览器会将这些信息保存在本地,当第二次发送请求时,浏览器会同时将 cookie 信息也传给服务器,从而帮助浏览器辨别使用者身份

cookie的格式

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

参数意义
NAMEcookie的名字
VALUEcookie的值
Expirescookie的过期时间
Pathcookie作用的路径
Domaincookie作用的域名
SECURE是否只在 https 协议下起作用

使用cookie模拟登陆

访问 http://www.renren.com/971549574/profile 该用户的页面,在没有登陆的情况下,会直接返回人人网登陆页面

代码实现(只在 headers 中加入 User-Agent ):

from urllib import request

url = 'http://www.renren.com/971549574/profile'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',

}
req = request.Request(url=url, headers=headers)
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
#with open('renren.html', 'w') as fp:
#fp.write(resp.read().decode('utf-8'))

可以发现,在没有登陆的情况下,输出的是登陆页面。

我们将 Cookie 信息加入到 headers 中,模拟已经登陆的情况

from urllib import request

url = 'http://www.renren.com/971549574/profile'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
    'Cookie': 'anonymid=jya2zl4g-2104r5; depovince=GW; _r01_=1; JSESSIONID=abcWSjOMBDkeOdM_DnkWw; ick_login=58aa36a7-870b-4655-a802-98dd3332d493; loginfrom=null; jebe_key=3cef8eed-8f1a-47f9-b527-cb33f9f50318%7C98922b0cc1a0e77016f939cddb439b6a%7C1563539605609%7C1%7C1563539607386; jebe_key=3cef8eed-8f1a-47f9-b527-cb33f9f50318%7C98922b0cc1a0e77016f939cddb439b6a%7C1563539605609%7C1%7C1563539607388; wp_fold=0; t=8f618e47c9c511b709b91d0d9567c6fd4; societyguester=8f618e47c9c511b709b91d0d9567c6fd4; id=971549574; xnsid=f5baadd0; jebecookies=e7c1fb71-f260-4ecb-95b2-18c50faba847|||||; ver=7.0'

}
req = request.Request(url=url, headers=headers)
resp = request.urlopen(req)
#print(resp.read().decode('utf-8'))
with open('renren.html', 'w', encoding='utf-8') as fp:
    fp.write(resp.read().decode('utf-8'))

可以发现我们直接能访问那个用户的页面

在这里插入图片描述

爬虫自动登陆访问授权页面

该模块主要的类为 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar

  • CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

  • FileCookieJar:从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

  • MozillaCookieJar:从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。

  • LWPCookieJar:从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。

      from urllib import request, parse
      from http.cookiejar import  CookieJar
      
      # 创建cookiejar的对象
      cookiejar = CookieJar()
      # 使用cookiejar创建一个HTTPCookieProcess对象
      handler = request.HTTPCookieProcessor(cookiejar)
      # 使用上一步创建的handler创建一个opener
      opener = request.build_opener(handler)
      # 使用opener发送登陆的请求
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
      }
      data = {
          'email' : '123',
          'password': '123'
      }
      
      url = 'http://www.renren.com/PLogin.do'
      
      req = request.Request(url=url, headers=headers, data=parse.urlencode(data).encode('utf-8'))
      
      opener.open(req)
      
      url1 = 'http://www.renren.com/971549574/profile'
      # 发送获取个人主页的页面的时候,不需要新建一个opener,因为之前那个opener已经包含了登陆所需要的cookie信息
      # resp = opener.open(url1)
      req = request.Request(url=url1,headers=headers)
      resp = opener.open(req)
      with open('renren.html', 'w',encoding='utf-8') as fp:
          fp.write(resp.read().decode('utf-8'))
    

或写成

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

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}


def get_opener():
    # 创建cookiejar的对象
    cookiejar = CookieJar()
    # 使用cookiejar创建一个HTTPCookieProcess对象
    handler = request.HTTPCookieProcessor(cookiejar)
    # 使用上一步创建的handler创建一个opener
    opener = request.build_opener(handler)
    # 使用opener发送登陆的请求
    return opener


def login(opener):

    data = {
        'email' : '123',
        'password': '123'
    }

    url = 'http://www.renren.com/PLogin.do'
    req = request.Request(url=url, headers=headers, data=parse.urlencode(data).encode('utf-8'))
    opener.open(req)


def visit(opener):
    url1 = 'http://www.renren.com/971549574/profile'
    # 发送获取个人主页的页面的时候,不需要新建一个opener,因为之前那个opener已经包含了登陆所需要的cookie信息
    # resp = opener.open(url1)
    req = request.Request(url=url1,headers=headers)
    resp = opener.open(req)
    with open('renren.html', 'w',encoding='utf-8') as fp:
        fp.write(resp.read().decode('utf-8'))


if __name__ == '__main__':
    opener = get_opener()
    login(opener)
    visit(opener)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值