前言
2021.08.01弄完第五章。
第五章
1.模拟登录
- 模拟登录:
- 爬取基于某些用户的用户信息。
2.实战
①人人网模拟登录(src反爬待解决)
- 需求:对人人网进行模拟登录(人人网,注册不了,可以跳了)。
- 点击登录按钮之后会发起一个post请求;
- post请求中会携带登录之前录入的相关的登录信息(用户名、密码、验证码等);
- 验证码:每次请求都会变化;
- 编码流程:
- 1.验证码识别,获取验证码图片的文字数据
- 2.对post请求进行发送
- 3.对相应数据进行持久化存储
练习代码如下:
[备注:教程中目前不可使用或访问的部分已经进行了提换和修改,以下内容使用的是超级鹰进行图片识别]
# 编码流程:
# 1.验证码识别,获取验证码图片的文字数据
# 2.对post请求进行发送
# 3.对相应数据进行持久化存储
import requests
from lxml import html
etree = html.etree
from bs4 import BeautifulSoup
from CodeClass import Chaojiying_Client
# 1.对验证码图片进行捕获和识别
if __name__ == "__main__":
url = 'https://www.renren.com/login'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
# 这里图片的src为 data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/.../.../.../.../.../.../.../.../.../...
# 但是xpath解析到的数据为 data:image/jpg;base64,
# 逗号后面的数据都没有了,不知道是什么原因,所以这里我换一种方法
# code_img_src = tree.xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[3]/div/img/@src')[0]
soup = BeautifulSoup(page_text, 'lxml')
code_img_src = soup.find('div', class_='rr-login_code input')
# 好吧,人家验证码图片的src咱爬不全,不是解析的问题
# 以后如果能解决的话再回来改
print(code_img_src)
code_img_data = requests.get(url=code_img_src, headers=headers)
with open('./code.jpg', 'wb') as fp:
fp.write(code_img_data)
# 使用超级鹰提供的示例代码对验证码图片进行识别
chaojiying = Chaojiying_Client('qwq', 'qwq', 'qwq')
im = open('code.jpg', 'rb').read()
result = chaojiying.PostPic(im, 1902)
print(result)
# 以下代码正确性以及适用性未知
login_url = ''
data = {
}
response = requests.post(url=login_url, headers=headers, data=data)
print(response.status_code) # 如果是200,则请求成功
# login_page_text = requests.post(url=login_url, headers=headers, data=data).text
# with open('renren.html', 'w', encoding='utf-8') as fp:
# fp.write(login_page_text)
②爬取用户信息(咱没有人人网账号,代码仅供参考)
- 需求:爬取当前用户的相关用户信息(个人主页中显示的用户信息)
import requests
from lxml import html
etree = html.etree
from bs4 import BeautifulSoup
from CodeClass import Chaojiying_Client
# 1.对验证码图片进行捕获和识别
if __name__ == "__main__":
url = 'https://www.renren.com/login'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
code_img_src = tree.xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[3]/div/img/@src')[0]
code_img_data = requests.get(url=code_img_src, headers=headers)
with open('./code.jpg', 'wb') as fp:
fp.write(code_img_data)
# 使用超级鹰提供的示例代码对验证码图片进行识别
chaojiying = Chaojiying_Client('qwq', 'qwq', 'qwq')
im = open('code.jpg', 'rb').read()
result = chaojiying.PostPic(im, 1902)
print(result)
login_url = ''
data = {
}
response = requests.post(url=login_url, headers=headers, data=data)
print(response.status_code) # 如果是200,则请求成功
# 爬取当前用户的个人主页对应的页面数据
detail_url = 'http://www.renren.com/*********/profile'
detail_page_text = requests.get(url=detail_url, headers=headers).text
with open('detailPage.html', 'w', encoding='utf-8') as fp:
fp.write(detail_page_text)
3.模拟登录Cookie操作
- http/https协议特性:无状态。
- 没有请求到对应数据的原因:
- 发起的第二次基于个人主页页面请求的时候,服务器端并不知道该请求是基于登录状态下的请求。
- cookie:用来让服务器端记录客户端的相关状态。
- 处理cookie的形式:
- 手动处理:通过抓包工具获得cookie值,将该值封装到headers中(不推荐)
(通用性不强,处理麻烦;有的页面cookie是动态变化的,有的具有有效时长) - 自动处理:
- cookie值的来源是哪里?
- 模拟登录post请求后,由服务器端创建。
- session会话对象:
- 作用:
- 1.可以进行请求的发送
- 2.如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中
- 作用:
- 操作流程:
- 1.创建一个session对象:
session = requests.Session()
- 2.使用session对象进行模拟登录post请求发送(cookie会被存储在session中)
- 3.session对象对个人主页对应的get请求进行发送(携带了cookie)
- 1.创建一个session对象:
- cookie值的来源是哪里?
- 手动处理:通过抓包工具获得cookie值,将该值封装到headers中(不推荐)
爬取用户信息修改版(使用session对象):
import requests
from lxml import html
etree = html.etree
from bs4 import BeautifulSoup
from CodeClass import Chaojiying_Client
# ①创建一个session对象
session = requests.Session()
# 1.对验证码图片进行捕获和识别
if __name__ == "__main__":
url = 'https://www.renren.com/login'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
code_img_src = tree.xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[3]/div/img/@src')[0]
code_img_data = requests.get(url=code_img_src, headers=headers)
with open('./code.jpg', 'wb') as fp:
fp.write(code_img_data)
# 使用超级鹰提供的示例代码对验证码图片进行识别
chaojiying = Chaojiying_Client('qwq', 'qwq', 'qwq')
im = open('code.jpg', 'rb').read()
result = chaojiying.PostPic(im, 1902)
print(result)
login_url = ''
data = {
}
# ②使用session进行请求的发送
response = session.post(url=login_url, headers=headers, data=data)
print(response.status_code) # 如果是200,则请求成功
# 爬取当前用户的个人主页对应的页面数据
detail_url = 'http://www.renren.com/*********/profile'
# 手动cookie处理
# 通用性不强,处理麻烦
# 有的页面cookie是动态变化的,有的具有有效时长
# headers = {
# 'Cookie': '*****'
# }
# ③使用携带cookie的session进行get请求的发送
detail_page_text = session.get(url=detail_url, headers=headers).text
with open('detailPage.html', 'w', encoding='utf-8') as fp:
fp.write(detail_page_text)
4.代理
- 代理:破解封IP这种反爬机制。
- 什么是代理:
- 代理服务器。
- 代理的作用:
- 突破自身IP访问的限制。
- 隐藏自身真实的IP。
- 代理相关的网站:
- IP查询网站:
- 代理IP的类型:
- http:应用到http协议对应的url中
- https:应用到https协议对应的url中
- 代理IP的匿名度:
- 透明:服务器它知道该次请求使用了代理,也知道请求对应的真实IP
- 匿名:服务器它知道该次请求使用了代理,不知道请求对应的真实IP
- 高匿:服务器不知道该次请求使用了代理,不知道请求对应的真实IP
- 反爬机制:封IP
- 反反爬策略:使用代理进行请求发送
测试代码如下:
import requests
if __name__ == "__main__":
url = 'https://www.baidu.com/s?wd=ip'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
# page_text = requests.get(url=url, headers=headers, proxies={"https": '免费的代理暂时没找到好用的,付费的还没试,使用的时候把:后面的去掉'}).text
# page_text = requests.get(url=url, headers=headers, proxies={"https": ''}).text
page_text = requests.get(url=url, headers=headers).text
with open('ip.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
# 反爬机制:封IP
# 反反爬策略:使用代理进行请求发送