爬虫之模拟登陆

模拟登陆

  • 模拟登陆
    • 笔记
  • 实战
    • 模拟登陆人人网
    • 爬取人人网当前用户的个人详情页数据
  • 附件
    • 超级鹰代码

模拟登陆

笔记

1.模拟登陆:爬取基于某些用户的用户信息。
2.需求:对人人网进行模拟登陆。
- ①点击登陆按钮之后会发起一个post请求
- ②post请求中会携带登陆之前录入的相关的登陆信息(用户名,密码,验证码…)
- ③验证码:每次请求都会动态变化

3.需求:爬取当前用户的相关的用户信息(个人主页中显示的用户信息)

4.http/https协议特性:无状态。

5.没有请求到对应页面数据的原因:发起的第二次基于个人主页页面请求的时候,服务器端并不知道此请求时基于登录状态下的请求

6.cookie:用来让服务器端记录客户端的相关状态。

  • 手动处理:通过抓包工具获取cookie值,将该值封装到headers中(不建议)
  • 自动处理:
  • cookie值的来源是哪里?
    • 模拟登陆post请求后,由服务器端创建
    • session会话对象:
      • ①作用:1.可以进行请求的发送;2.如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中
      • ②创建一个session对象:session=requests.Session()
      • ③使用session对象进行模拟登陆post请求进行发送(cookie就会被存储在session中)
      • ④session对象对个人主页对应的get请求进行发送(携带了cookie)

7.代理:破解ip这种反爬机制
① 什么是代理:代理服务器
② 代理的作用:突破自身ip访问的限制;可以隐藏自身真实ip免受攻击
③ 代理ip的类型:-http:应用到http协议对应的url中; -https:应用到https协议对应的url中
④代理ip的匿名度:
透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip
匿名:知道使用了代理,不知道真实ip
高匿:不知道使用了代理,更不知道真实的ip

实战

模拟登陆人人网

爬虫之模拟登陆_第1张图片
爬虫之模拟登陆_第2张图片

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()

你可能感兴趣的:(爬虫入门)