一,处理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))
回头再去刷新页面,依然无法访问,说明代理起作用了!