躲在被窝里偷偷学爬虫(6)---处理cookie模拟登录及代理IP

一,处理cookie模拟进行模拟登录

前面小编进行爬取的都是没设登录的网站,那么像QQ空间,17k小说网等众多网站,不先进行登录将无法进入个人主页的网站,是不是爬虫就束手无策了呢?

答案肯定是否定的,下面就来用代码模拟登录!!!

1,何为cookie?

cookie是储存在客户端的一组键值对。如下图QQ空间的cookie
在这里插入图片描述
2,cookie和爬虫之间有何关联?

sometimes,对一张网页进行请求时,假如要是在请求过程中不携带cookie值的话,那么我们将无法请求到页面正确的数据。

therefore,cookie是爬虫中一个常见且典型的反爬机制

3,17k小说网例子

拿取登录对应的url地址(https://passport.17k.com/ck/user/login)
在这里插入图片描述

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-27

import requests


# 创建一个session对象
session = requests.Session()

url1 = 'https://passport.17k.com/ck/user/login'
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54"
}
data = {
    
    
    'loginName': '15029494474',  # 这里填写账号
    'password': 'woshinidaye'    # 这里填写密码
}
# 进行登录
res = session.post(url=url1, headers=headers, data=data)
print(res)

<Response [200]>

返回200即说明模拟登录成功!

接下来拿取小编书架中收藏的书的基本信息,如下图
在这里插入图片描述
因为这些是动态加载的内容,所以去检查中在Network中,选中XHR,按f5刷新页面找到如下图包打开,并复制Headers中的url地址
在这里插入图片描述
仔细观察要的页面内容全在这里

import requests
import json


# 创建一个session对象
session = requests.Session()

url1 = 'https://passport.17k.com/ck/user/login'
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54"
}
data = {
    
    
    'loginName': '15029494474',
    'password': 'woshinidaye'
}
# 进行登录
res = session.post(url=url1, headers=headers, data=data)
# print(res)

# 拿取我的书架上的书
url2 = 'https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919'
resp = requests.get(url=url2, headers=headers).text
print(resp)

{
    
    "status":{
    
    "code":10103,"msg":"用户登陆信息错误"},"time":1616827996000}

报错了,说明当我去拿页面内容时,如果没携带cookie,网站就觉得咱们没登录

# 拿取我的书架上的书
url2 = 'https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919'
resp = session.get(url=url2, headers=headers).text
print(resp)

在这里插入图片描述
解析内容并持续化保存到本地

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-27

import requests
import json


# 创建一个session对象
session = requests.Session()

url1 = 'https://passport.17k.com/ck/user/login'
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54"
}
data = {
    
    
    'loginName': '15029494474',
    'password': 'woshinidaye'
}
# 进行登录
res = session.post(url=url1, headers=headers, data=data)
# print(res)

# 拿取我的书架上的书
url2 = 'https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919'
resp = session.get(url=url2, headers=headers).text
# print(resp)

# 把json字符串转换成python可交互的数据类型字典
resp_data = json.loads(resp)
data_list = resp_data['data']
# print(data_list)
f = open('./17k.txt', 'w', encoding='utf-8')
for data in data_list:
    # 书的类型
    category = data['bookCategory']['name']
    # 书名
    title = data['bookName']
    # 最近更新时间
    chapter = data['lastUpdateChapter']['name']
    # 作者
    author = data['authorPenName']
    # print(category, title, chapter, author)
    # 简单进行数据格式处理
    content = '类型:' + category + " , " + '书名:' + title + " , " + '最新更新章节:' + chapter + " , " + '作者:' + author + '\n\n'
    f.write(content)

print('over!!!')

在这里插入图片描述

二,使用代理IP

1,何为代理IP?

五个字,就是代理服务器

2,请问要她有什么鸟用?

用来转发请求和响应

3,请问在爬虫中为何要用他?

假如在爬虫中短时间内对某个服务器发起了高频率的请求,则服务器会检测到这种异常,进而会暂时封掉我们的IP地址,使在封的时间段内无法再访问服务器。因此,就要使用代理IP进行操作,使用代理IP后,服务器接收到请求的对应IP就是代理服务器的,而并非我们真正客户端的!

4,代理服务器的几种匿名度

①透明代理:就字面意思,也能猜到八九不离十.。使用此种代理,服务器知道你使用了代理,也知道你的真实IP。

②匿名代理:使用此种代理,服务器知道你使用了代理,但是不知道你真实的IP。

③高匿代理:使用此种代理,服务器不知道你使用了代理,也不知道你的真实IP。

5,小编推荐的代理(智连HTTP)

URL地址:http://http.zhiliandaili.cn/

免费的代理实在是能把人心态玩崩,所以小编选择卖肾续费版的,如下图
在这里插入图片描述
练习使用一天3元人民币。小编尽管家徒四壁,但也能勉强接受!

购买完成后我们点击API提取,如下图
在这里插入图片描述

据小编体验,有效1~5分钟的IP实际有效时间只有两分钟左右

6,编写代码拿到代理的IP地址
在这里插入图片描述

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-27
import requests
from lxml import etree


url = 'http://ip.ipjldl.com/index.php/api/entry?method=proxyServer.generate_api_url&packid=1&fa=0&fetch_key=&groupid=0&qty=5&time=1&pro=&city=&port=1&format=html&ss=5&css=&dt=1&specialTxt=3&specialJson=&usertype=15'

page_content = requests.get(url).text
tree = etree.HTML(page_content)
all_ip = tree.xpath('//body//text()')
https_ip = []
for ip in all_ip:
    dic = {
    
    
        'https': ip
    }
    https_ip.append(dic)
print(https_ip)

[{
    
    'https': '123.73.63.67:46603'}, {
    
    'https': '220.161.32.108:45111'}, {
    
    'https': '183.159.83.169:45112'}, {
    
    'https': '222.37.78.253:32223'}, {
    
    'https': '114.99.11.51:23890'}]

7,让某个网站封掉我的ip

这个最好玩了,哈哈哈!看客朋友们千万不要学小编奥,我只为做个实例

对快代理(https://www.kuaidaili.com/free/inha)发起高频请求,使其封掉我的本机IP
在这里插入图片描述

import requests
from lxml import etree

url = 'https://www.kuaidaili.com/free/inha/%s/'
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54"
}
all_ip = []
for i in range(1,100):
    page_url = url % i
    page_content = requests.get(url=page_url, headers=headers).text
    tree = etree.HTML(page_content)
    ip = tree.xpath('//*[@id="list"]/table')
    for d in ip:
        page = d.xpath('./tbody/tr/td[1]/text()')
        # print(one)
        for d in page:
            all_ip.append(d)

print(len(all_ip))

只撸了一下,就被封了,这也太配合了吧(再去刷新页面),如下图
在这里插入图片描述
在这里插入图片描述
8,上代理ip

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-27
import requests
from lxml import etree
import random


# 代理对应的代码
url = 'http://ip.ipjldl.com/index.php/api/entry?method=proxyServer.generate_api_url&packid=1&fa=0&fetch_key=&groupid=0&qty=5&time=1&pro=&city=&port=1&format=html&ss=5&css=&dt=1&specialTxt=3&specialJson=&usertype=15'

page_content = requests.get(url).text
tree = etree.HTML(page_content)
all_ip = tree.xpath('//body//text()')
https_ip = []
for ip in all_ip:
    dic = {
    
    
        'https': ip
    }
    https_ip.append(dic)
# print(https_ip)

# 用代理再次发起请求
url = 'https://www.kuaidaili.com/free/inha/%s/'
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54"
}
all_ip = []
for i in range(1,2):
    page_url = url % i
    # 加入代理IP
    page_content = requests.get(url=page_url, headers=headers, proxies=random.choice(https_ip)).text
    tree = etree.HTML(page_content)
    ip = tree.xpath('//*[@id="list"]/table')
    for d in ip:
        page = d.xpath('./tbody/tr/td[1]/text()')
        for d in page:
            all_ip.append(d)

print(len(all_ip))

在这里插入图片描述
回头再去刷新页面,依然无法访问,说明代理起作用了!

猜你喜欢

转载自blog.csdn.net/hpl980342791/article/details/115260693
今日推荐