本文是我在使用网易云课堂学习日月光华老师讲的“Python爬虫零基础入门到进阶实战”课程所做的笔记,如果大家觉得不错,可以去看一下老师的视频课,讲的还是很棒的。
一、了解如何保持用户登录状态
二、学会使用cookies登录网站
1.网站保持登录机制
cookies登录网站后,网站会把登录信息以加密的形式存储于本地浏览器中(本地端)。用以判断登陆状态。session
登陆网站后,网站把登录信息加密后放在服务器端,给本地端一个session id写于cookies。用以判断登陆状态。session也需要cookies,用以保存session id。
使用cookies登录豆瓣网址
登录豆瓣,F12查看自己登陆后的cookie代码中,请求的时候加入cookies
import requestscookie = '豆瓣网登录后拷贝下来的cookies'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}url = '/'def deal_cookie(cookie):"""处理cookie成为字典形式:param cookie: 原版cookie:return: 处理后的cookie"""coo = {}for item in cookie.split(';'):k, v = item.split('=', 1)coo[k.strip()] = v.replace('"','')return coocookies = deal_cookie(cookie)response = requests.get(url, headers=headers, cookies=cookies)print('KaiSarH' in response.text)
执行效果图:
由此可见已经登录。
2.会话对象可以保持登录状态
import requests# 初始化会话对象,Session可以跨请求保持cookiess = requests.Session()# 设置cookies.get('/cookies/set/sessioncookie/12345678900')print(s.cookies)# 返回携带cookies.get('/cookies')print(s.get('/cookies').text)
执行结果:
3.使用request直接登录一个网站
找到跳转的网页,找到提交的数据集。构造data,使用post登录。
4.下载验证码图片
import requestsfrom PIL import Image# 使用ByteIO把二进制图片读取进来from io import BytesIOs = requests.Session()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}login_pic_url = 'http://yjsy.:8080/pyxx/PageTemplate/NsoftPage/yzm/IdentifyingCode.aspx'pic = requests.get(login_pic_url)pic_img = Image.open(BytesIO(pic.content))# 获取当前验证码并显示pic_img.show()pic_text = input('请输入验证码:')
5.验证码处理——光学字符识别
使用Tesseract引擎
pip install pytesseract安装tesseract-ocr
下载地址:提取码:ahll添加环境变量
①用户变量中添加
②系统变量中添加
③系统变量的Path中添加
添加完毕后,即可进行简单图片识别。
from PIL import Image, ImageOps# 打开后是一个二进制文件img = open('test.jpg', 'rb')# 使用Image读取i = Image.open(img)def init_table(threshold=8):table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)return table# 改变颜色为灰度值im = i.convert('L')binaryImage = im.point(init_table(), '1')im1 = binaryImage.convert('L')im2 = ImageOps.invert(im1)im3 = im2.convert('1')im4 = im3.convert('L')# 对图像进行放大处理out = im4.resize((120, 38))print(pytesseract.image_to_string(out))### 识别能力很差