python 爬虫网页登陆的简单实现

下面是关于“python 爬虫网页登陆的简单实现”的完整攻略:

1. 背景介绍

爬虫一般需要模拟登陆才能爬取需要登录后才能获取的信息,例如淘宝、京东等电商类网站。Python作为一门较为流行的语言之一,它提供了许多优秀的库和模块用于爬虫操作,其中最为著名的是requests模块。本文将以requests模块为例,介绍如何利用Python实现网页登陆。

2. 实现步骤

针对网站登陆,一般需要以下几个步骤:

2.1 获取网站的Cookie值

使用requests模块访问网站时,网站会自动对你的浏览器设置Cookie,以此来识别你的身份。因此,首先需要获取网站的Cookie值。可以通过Chrome浏览器的开发者工具,在“网络”选项卡中查看到Cookie值。

2.2 构造headers

requests模块需要一个包含User-Agent、Cookie等信息的字典来模拟浏览器发送请求。User-Agent是模拟浏览器时必须设置的一个关键信息,Cookie则可以在之前获取。

例如,代码如下:

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.37',
    'Cookie':'xxxxxxx'
}

2.3 模拟登陆

接下来可以使用requests模块向网站发送post请求,模拟登陆操作。

例如,假设需要登陆的网站是https://example.com,登陆接口为https://example.com/login,用户名为username,密码为password,那么代码如下:

import requests

login_url = 'https://example.com/login'
data = {'username': 'xxxxx', 'password': 'xxxxx'}
session = requests.Session()
session.post(login_url, headers=headers, data=data)

这里通过requests.Session()创建了一个session对象,调用post方法向登陆接口发送请求。headers参数携带了之前获取到的Cookie值。

2.4 验证登陆是否成功

登陆之后,可以进一步请求需要登陆后才能访问的页面,验证登陆是否成功。如果登陆成功,响应内容应该包含用户昵称、用户订单等信息;如果登陆失败,则会提示“登录失败”等信息。

3. 示例说明

下面,我们来通过两个网站的具体实现,进一步说明入门级爬虫模拟登陆流程。

3.1 豆瓣网

模拟登陆豆瓣网需要提交的信息有关键词wd、账号form_email以及密码form_password,因此请求参数如下:

payload = {'wd': keyword, 'form_email': username, 'form_password':password}

完整代码如下:

import requests

# 登陆接口
login_url = 'https://accounts.douban.com/j/mobile/login/basic'
# 构造headers
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.37',
    'Cookie':'xxxxxxx'
}
# 请求登陆接口
payload = {'wd': keyword, 'form_email': username, 'form_password':password}
session = requests.Session()
session.post(login_url, headers=headers, data=payload)
# 验证登陆
response = session.get('https://www.douban.com/people/xxxxxx/')
if response.status_code == 200:
    print('登陆成功')
else:
    print('登陆失败')

3.2 网易163邮箱

网易邮箱模拟登陆场景稍微复杂一些,需要发送一次get请求,获取一些参数,再将这些参数加密,最后提交post请求登陆。完整代码如下:

import requests
import re
import time
import hashlib

# 用户名和密码
username = 'xxxxx'
password = 'xxxxx'

# 登陆获取cookie和参数
session = requests.session()
url = 'https://mail.163.com/'
res = session.get(url)
pattern1 = 'window\.location\.replace\("(.*?)"\);'
targetUrl = re.findall(pattern1, res.text)[0]
res = session.get(targetUrl)
pattern2 = 'name="savelogin"\s*value="(\w+)"'
savelogin = re.findall(pattern2, res.text)[0]
pattern3 = 'name="nonce"\s*id=".*?"\s*value="(\w+)"'
nonce = re.findall(pattern3, res.text)[0]
pattern4 = 'name="rsa"\s*value="(\w+)"'
rsa = re.findall(pattern4, res.text)[0]

# 登陆参数加密
tm = int(time.time()*1000)
rsaValue = str(tm) + '\t' + nonce + '\n' + password
keyUtil = ''
keyUtil += '00' 
keyUtil += '02' 
keyUtil += '03'*(64 - len(rsaValue)//16) 
keyUtil += chr(16- len(rsaValue)%16)*16
cipher = ''
key = rsa.encode('utf-8')
for i in range(0, len(rsaValue), 64):
    if(i == 0):
        ibyte = key + int(keyUtil.encode('utf-8'), 16).to_bytes(64, 'big')
    else:
        ibyte = rsaValue[i - 64:i] + int(keyUtil.encode('utf-8'), 16).to_bytes(64, 'big')
    text = int.from_bytes(ibyte, 'big')
    cipher = cipher + pow(text, 65537, int('010001', 16)).to_bytes(256, 'big').hex()

# 构造请求参数并发起post请求
data = {
    'username': username,
    'savelogin': savelogin,
    'url2': 'http://mail.163.com/errorpage/error163.htm',
    'password': '',
    'lightweight': 'true',
    'product': 'mail163',
    'type': '4',
    'iframe': '1',
    'stylename': 'mail163',
    'd': str(tm),
    'topURL': 'http://mail.163.com/',
    'rtid': '',
    'login_email': '',
    'login_password': '',
    'auto_login': "0",
    'show_name': '',
    'authtype': '',
    'mail_psc': '',
    'nav': '',
    'css': '',
    'id_cryptotool_password': cipher
}
response = session.post('https://mail.163.com/entry/cgi/ntesdoor?', headers=headers, data=data)

# 验证登陆
if response.status_code == 200:
    print('登陆成功')
else:
    print('登陆失败')

以上就是本文的全部内容,希望对初学者能有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 爬虫网页登陆的简单实现 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python线程的几种创建方式详解

    我来详细讲解一下“Python线程的几种创建方式详解”的攻略。 简介 Python线程是指在一个程序内部,同时执行多个不同的线程以完成不同任务的一种机制。使用线程能够提高程序的运行效率,因为它可以同时执行多个任务,使得程序可以在某些任务被阻塞时,继续执行其他任务。 Python线程的创建方式有以下几种: 使用threading.Thread类创建线程对象 继…

    python 2023年5月19日
    00
  • Redis 如何设置过期时间?

    以下是详细讲解 Redis 如何设置过期时间的完整使用攻略。 Redis 设置过期时间简介 在 Redis 中,可以使用 expire 命令来设置 key 的过期时间。过期时间可以是一个整数,表示 key 在少后过期;也可以是一个时间戳,表示 key 在指定的时间点过期。当 key 过期时,Redis 会自动将其删除。 Redis 设置过期时间的基本操作 以…

    python 2023年5月12日
    00
  • 小白学Python之实现OCR识别

    小白学Python之实现OCR识别攻略 简介 OCR(Optical Character Recognition)是一种将图片或扫描文档中的文本转换成可编辑和搜索的文本的技术。Python作为一种强大的编程语言,有许多 OCR 库和工具可以用于实现 OCR 功能。在本文中,我们将通过几个简单的步骤,介绍如何使用Python实现OCR识别。 步骤 步骤1:安装…

    python 2023年5月18日
    00
  • 详解Python中键盘鼠标的相关操作

    详解Python中键盘鼠标的相关操作 Python提供了丰富的第三方库,用于控制键盘和鼠标的操作。这些库通常被称为“GUI测试工具”(GUI Testing Tools),可以用于自动化测试、模拟用户操作、脚本自动化等场景。下面将介绍两个用于控制键盘和鼠标操作的Python库。 PyAutoGUI PyAutoGUI是一个纯Python的GUI自动化工具,可…

    python 2023年5月13日
    00
  • Python random模块(获取随机数)常用方法和使用例子

    Python random模块(获取随机数)常用方法和使用例子 随机数在计算机编程中被广泛应用,Python语言提供了random模块来生成随机数,可用于实现随机数组成、密码生成、数据加密、游戏开发等内容。 常用方法 Python的random模块提供了多种用于生成随机数的函数,常用的有以下几种: random() 此函数返回一个[0, 1)的随机浮点数。即…

    python 2023年5月14日
    00
  • Python3并发写文件与Python对比

    Python是一门非常强大的编程语言,除了能够处理各种数据类型,还拥有强大的并发处理能力。在并发写文件方面,Python3提供了多种实现方式,同时可以与Python2进行比较。下面我将详细讲解“Python3并发写文件与Python对比”的完整攻略: 一、Python3并发写文件 1.1 使用多线程 Python3中的多线程是一种轻量级的并发处理方式,通过使…

    python 2023年5月19日
    00
  • python语言中pandas字符串分割str.split()函数

    介绍pandas字符串分割str.split()函数之前,先简单介绍一下pandas库。pandas是基于numpy构建的,一种用于数据分析、数据操作和数据可视化的Python库。pandas提供了大量的数据操作函数,这些函数基于numpy的函数进行扩展和优化,利用pandas处理数据可以大大提高效率,方便快捷地进行数据统计建模等工作。 str.split(…

    python 2023年6月3日
    00
  • python实现数据图表

    下面我将详细讲解“Python实现数据图表”的完整攻略。 准备工作 在使用Python实现数据图表之前,需要安装一些必要的库: numpy:用于数据处理和统计分析; pandas:用于数据处理和数据分析; matplotlib:用于绘制各种类型的图表。 在安装完成这些库之后,你就可以开始使用Python实现数据图表了。 绘制折线图 绘制折线图是数据可视化中最…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部