1.模拟登陆:爬取基于某些用户的用户信息。
2.需求:对人人网进行模拟登陆。
- ①点击登陆按钮之后会发起一个post请求
- ②post请求中会携带登陆之前录入的相关的登陆信息(用户名,密码,验证码…)
- ③验证码:每次请求都会动态变化
3.需求:爬取当前用户的相关的用户信息(个人主页中显示的用户信息)
4.http/https协议特性:无状态。
5.没有请求到对应页面数据的原因:发起的第二次基于个人主页页面请求的时候,服务器端并不知道此请求时基于登录状态下的请求
6.cookie:用来让服务器端记录客户端的相关状态。
7.代理:破解ip这种反爬机制
① 什么是代理:代理服务器
② 代理的作用:突破自身ip访问的限制;可以隐藏自身真实ip免受攻击
③ 代理ip的类型:-http:应用到http协议对应的url中; -https:应用到https协议对应的url中
④代理ip的匿名度:
透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip
匿名:知道使用了代理,不知道真实ip
高匿:不知道使用了代理,更不知道真实的ip
import requests
from lxml import etree
from CodeClass import Chaojiying_Client
def getCodeText(imgPath, codeType):
chaojiying = Chaojiying_Client('用户名', '密码', '软件ID') # 用户中心>>软件ID 生成一个替换 96001
im = open(imgPath, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
return chaojiying.PostPic(im, codeType) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加())
#1.对验证码图片进行捕获和识别
url = 'http://www.renren.com/SysHome.do'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0',
}
page_text = requests.get(url = url,headers=headers).text
tree = etree.HTML(page_text)
code_img_src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
code_img_data = requests.get(url=code_img_src,headers=headers).content
with open('./code.jpg','wb') as fp:
fp.write(code_img_data)
#使用超级鹰所提供的的实例代码对验证码图片进行识别
result = getCodeText('code.jpg',1005)
#post请求的发送(模拟登陆)
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2021361636545'
data = {
'email': '用户名',
'icode':result,
'origURL': 'http://www.renren.com/home',
'domain': 'renren.com',
'key_id': 1,
'captcha_type': 'web_login',
'password': '',
'rkey': 'd0cf42c2d3d337f9e5d14083f2d52cb2',
'f': 'http%3A%2F%2Fwww.renren.com%2F976568404%2Fprofile'
}
response = requests.post(url = login_url,headers = headers,data=data)
print(response.status_code)
login_page_text = response.text
with open('renren.html','w',encoding = 'utf-8') as fp:
res = fp.write(login_page_text)
#编码流程:
#1 验证码的识别,获取验证码图片的文字数据
#2 对post请求进行发送(处理请求参数)
#3 对相应数据进行持久化存储
import requests
from lxml import etree
form CodeClass import Chaojiying_Client
def getCodeText(imgPath,codeType):
chaojiying = Chaojiying_Client('用户名', '密码', '软件ID') # 用户中心>>软件ID 生成一个替换 96001
im = open(imgPath, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
return chaojiying.PostPic(im, codeType) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加())
#创建一个session对象
session = requests.Session()
#1 对验证码图片进行捕获和识别
url = 'http://www.renren.com/SysHome.do'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0',
}
page_text = requests.get(url=url,headers=headers).text
tree =etree.HTML(page_text)
code_img_src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
code_img_data = requests.get(url=code_img_src,headers=headers).content
with open('./code.jpg','wb') as fp:
fp.write(code_img_data)
#使用超级鹰所提供的示例代码对验证码图片进行识别
result = getCodeText('code.jpg',1005)
#post请求的发送(模拟登陆)
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2021361636545'
data = {
'email': '用户名',
'icode':result,
'origURL': 'http://www.renren.com/home',
'domain': 'renren.com',
'key_id': 1,
'captcha_type': 'web_login',
'password': '',
'rkey': 'd0cf42c2d3d337f9e5d14083f2d52cb2',
'f': 'http%3A%2F%2Fwww.renren.com%2F976568404%2Fprofile'
}
#使用session进行post请求的发送
response = session.post(url=login_url,headers=headers,data=data)
print(response.status_code)
#爬取当前用户的个人主页对应的页面数据
detail_url = 'http://www.renren.com/976568404/profile'
#手动cookie处理(通用性不强)
#headers = {‘cookis’:''}
#使用携带cookie的session进行get请求的发送
detail_page_text = session.get(url=detail_url,headers=headers).text
with open('jj.html','w',encoding='utf-8') as fp:
fp.write(detail_page_text)
文件库名称CodeClass
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {
'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()