一,处理cookie模拟进行模拟登录
前面小编进行爬取的都是没设登录的网站,那么像QQ空间,17k小说网等众多网站,不先进行登录将无法进入个人主页的网站,是不是爬虫就束手无策了呢?
答案肯定是否定的,下面就来用代码模拟登录!!!
1,何为cookie?
cookie是储存在客户端的一组键值对。如下图QQ空间的cookie
2,cookie和爬虫之间有何关联?
sometimes,对一张网页进行请求时,假如要是在请求过程中不携带cookie值的话,那么我们将无法请求到页面正确的数据。
therefore,cookie是爬虫中一个常见且典型的反爬机制!
3,17k小说网例子
拿取登录对应的url地址(/ck/user/login)
# !/usr/bin/env python# -*- coding:utf-8 -*-# @Author:HePengLi# @Time:-03-27import requests# 创建一个session对象session = requests.Session()url1 = '/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 requestsimport json# 创建一个session对象session = requests.Session()url1 = '/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 = '/ck/author/shelf?page=1&appKey=2406394919'resp = requests.get(url=url2, headers=headers).textprint(resp){"status":{"code":10103,"msg":"用户登陆信息错误"},"time":1616827996000}
报错了,说明当我去拿页面内容时,如果没携带cookie,网站就觉得咱们没登录!
# 拿取我的书架上的书url2 = '/ck/author/shelf?page=1&appKey=2406394919'resp = session.get(url=url2, headers=headers).textprint(resp)
解析内容并持续化保存到本地
# !/usr/bin/env python# -*- coding:utf-8 -*-# @Author:HePengLi# @Time:-03-27import requestsimport json# 创建一个session对象session = requests.Session()url1 = '/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 = '/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地址:/
免费的代理实在是能把人心态玩崩,所以小编选择卖肾续费版的,如下图
练习使用一天3元人民币。小编尽管家徒四壁,但也能勉强接受!
购买完成后我们点击API提取,如下图
据小编体验,有效1~5分钟的IP实际有效时间只有两分钟左右
6,编写代码拿到代理的IP地址
# !/usr/bin/env python# -*- coding:utf-8 -*-# @Author:HePengLi# @Time:-03-27import requestsfrom lxml import etreeurl = '/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).texttree = 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
这个最好玩了,哈哈哈!看客朋友们千万不要学小编奥,我只为做个实例
对快代理(/free/inha)发起高频请求,使其封掉我的本机IP
import requestsfrom lxml import etreeurl = '/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 % ipage_content = requests.get(url=page_url, headers=headers).texttree = 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:-03-27import requestsfrom lxml import etreeimport random# 代理对应的代码url = '/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).texttree = 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 = '/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# 加入代理IPpage_content = requests.get(url=page_url, headers=headers, proxies=random.choice(https_ip)).texttree = 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))
回头再去刷新页面,依然无法访问,说明代理起作用了!