Python笔记:网络爬虫之模拟人人网登录及获取数据的过程详解

概述

  • 使用urllib模拟人人网的登录的过程
  • 使用urllib模拟人人网登录后获取个人数据的过程
  • 使用urllib模拟登录及获取个人数据的过程
  • 使用requests模拟登录及获取个人数据的过程
  • 重点了解其中用于状态维持和会话跟踪的技术
  • 此文档具有时效性, 只针对当前人人网有效;在代码中模拟的数据并非真实数据, 如要正确运行, 请替换成自己的数据
  • 此文档的目的:仅提供积累知识、运用相关库解决问题的思路分享

使用urllib库模拟人人网的登录的过程

# 模拟人人网登陆操作

from urllib import request, parse

# 经过浏览器分析,页面上提交地址为:http://www.renren.com/PLogin.do
# 真正提交地址为:
login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201980202238"

# 经过浏览器xhr请求分析,真正的提交参数为:
# 不确定哪些是必须提交的数据,可以模拟浏览器所有数据均提交
data = {
    'email': '15311111111', # 此处为你的手机号
    'icode': '',
    'origURL': 'http://www.renren.com/home',
    'domain': 'renren.com',
    'key_id': 1,
    'captcha_type': 'web_login',
    'password': '4566d0f4a94fyyz4f940abcd23f6a48f62589726a63106a2d7112ce194113cd1', # 此处是页面脚本加密后的密码
    'rkey': '00b732e6c4b8d408b75655e15dd43a82',
    'f': 'http%3A%2F%2Fwww.renren.com%2F111111111%2Fnewsfeed%2Fphoto'
}
data = parse.urlencode(data)
headers = {
    'Content-Length': len(data)
}
req = request.Request(login_url, data=bytes(data, encoding="utf-8"), headers=headers)
res = request.urlopen(req)

print(res.read().decode('utf-8')) # {"code":true,"homeUrl":"http://www.renren.com/home"} 此处表示登陆成功,将要跳转

使用urllib库模拟人人网登录后获取个人数据的过程

# 模拟人人网登陆操作

from urllib import request, parse
import gzip
import re

# 示例:req_url = "http://www.renren.com/11111111"
req_url = "http://www.renren.com/your-id"

# 经过浏览器xhr请求分析,因为不确定具体要提交哪些参数,以下是全部参数信息
headers = {
    'Host': 'www.renren.com',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': 1,
    'DNT': 1,
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'Referer': 'http://www.renren.com/SysHome.do',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Cookie': 'anonymid=k2jogzmy45d6g1; depovince=GW; _r01_=1; JSESSIONID=abcTX9kPXDXiC-MXhZT4w; ick_login=eda6bae3-1016-4b43-8653-c0b0e88bf6c1; ick=ef6c24f7-ccc8-4110-8c8d-e60fa7783869; XNESSESSIONID=367a0c8b5c12; Hm_lvt_668f5751b331d2a1eec31f2dc0253443=1567945461; first_login_flag=1; ln_uact=15311111111; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; wp_fold=0; jebecookies=34444812-0d3f-48b3-b7ca-01ae41fcf755|||||; Hm_lpvt_668f5751b331d2a1eec31f2dc0253443=1567947038; _de=57D139C64A11F200F1AEE8096E718C50; p=3e26031d8967cf591201ca56c7a2147d7; t=41388b62070609b8ad5462bac60219cd7; societyguester=41388b62070609b8ad5462bac60219cd7; id=772777777; xnsid=cc1b3f4c; loginfrom=syshome'
}

req = request.Request(req_url, headers=headers)
res = request.urlopen(req)
html = gzip.decompress(res.read()).decode('utf-8') # 因为请求头上支持gzip传输,此处在响应的时候要通过gzip来解压缩
#print(html)
print(re.findall(("(.*?)"), html)) # ['人人网 - 你的名字'] 此处会输出如下信息

使用urllib库模拟登录及获取个人数据的过程

'''
模拟人人网登录和获取个人主页数据的整个过程
通过cookie管理器,用于状态维持和会话跟踪技术
'''

# 模拟人人网登陆操作
from urllib import request, parse
import gzip
import re,time
from http import cookiejar # cookie管理模块

cookie = cookiejar.CookieJar() # 获取cookie对象
cookie_handler = request.HTTPCookieProcessor(cookie) # 返回一个cookie管理器
opener = request.build_opener(cookie_handler) # 获取一个带cookie的请求管理器, 用于状态维持和会话跟踪技术

# 登录函数
def doLogin():
    login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201980202238"
    data = {
        'email': '15311111111',
        'icode': '',
        'origURL': 'http://www.renren.com/home',
        'domain': 'renren.com',
        'key_id': 1,
        'captcha_type': 'web_login',
        'password': '4566d0f4a94fyyz4f940abcd23f6a48f62589726a63106a2d7112ce194113cd1',
        'rkey': '00b732e6c4b8d408b75655e15dd43a82',
        'f': 'http%3A%2F%2Fwww.renren.com%2F111111111%2Fnewsfeed%2Fphoto'
    }
    data = parse.urlencode(data)
    headers = {
        'Content-Length': len(data)
    }
    req = request.Request(login_url, data=bytes(data, encoding="utf-8"), headers=headers)
    res = opener.open(req)
    print(res.read().decode('utf-8')) # {"code":true,"homeUrl":"http://www.renren.com/home"} 此处表示登陆成功,将要跳转
    print('登录成功!')

# 获取个人数据
def getData():
    # 请求示例:http://www.renren.com/111111111
    req_url = "http://www.renren.com/your-id"
    req = request.Request(req_url)
    res = opener.open(req)
    html= res.read().decode('utf-8')
    print(re.findall(("(.*?)"), html)) # ['人人网 - 你的名字'] 此处会输出如下信息

if __name__ == "__main__":
    # 登录
    print("登录中...")
    doLogin() # 登录操作
    # 此处用于模拟,应该在回调中实现获取个人数据
    time.sleep(2) # 此处仅作模拟, 延迟2s的时间
    getData() # 获取个人数据

使用requests库模拟登录及获取个人数据的过程

'''
模拟人人网登录和获取个人主页数据的整个过程
通过cookie管理器,用于状态维持和会话跟踪技术
'''

# 模拟人人网登陆操作
import requests
import gzip
import re,time

ses = requests.Session() # 获取可以维持会话状态的请求对象

# 登录函数
def doLogin():
    login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201980202238"
    data = {
        'email': '15311111111',
        'icode': '',
        'origURL': 'http://www.renren.com/home',
        'domain': 'renren.com',
        'key_id': 1,
        'captcha_type': 'web_login',
        'password': '4566d0f4a94fyyz4f940abcd23f6a48f62589726a63106a2d7112ce194113cd1',
        'rkey': '00b732e6c4b8d408b75655e15dd43a82',
        'f': 'http%3A%2F%2Fwww.renren.com%2F111111111%2Fnewsfeed%2Fphoto'
    }
    ses.post(login_url, data=data)
    print('登录成功!')

# 获取个人数据
def getData():
    # 请求示例:http://www.renren.com/111111111
    req_url = "http://www.renren.com/your-id"
    res = ses.get(req_url)
    html = res.content.decode('utf-8')
    print(re.findall(("(.*?)"), html)) # ['人人网 - 你的名字'] 此处会输出如下信息

if __name__ == "__main__":
    # 登录
    print("登录中...")
    doLogin() # 登录操作
    # 此处用于模拟,应该在回调中实现获取个人数据
    time.sleep(2) # 此处仅作模拟, 延迟2s的时间
    getData() # 获取个人数据

你可能感兴趣的:(Python,python,网络爬虫,urllib,requests,状态维持/会话跟踪)