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

yizhihongxing

下面是关于“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自带性能强悍的标准库itertools

    浅析Python自带性能强悍的标准库itertools 什么是itertools itertools是Python中一个非常强大的标准库,设计目的是为了高效地处理迭代器和可迭代对象。它包含了大量的能够高效处理迭代对象的工具函数。 有了itertools,我们可以在Python中非常方便地进行许多常见的操作,比如创建各种组合、排列和迭代器等。 itertool…

    python 2023年6月3日
    00
  • 在Python中用三维数组的系数评估点(x, y)的二维切比雪夫级数

    首先需要了解什么是二维切比雪夫级数,它是关于一点的级数展开,以更多项的序列逼近函数。在二维空间中,切比雪夫级数的求和项是通过求解二维空间中任意两点之间的最大距离来计算的。 因此,在Python中用三维数组的系数评估点(x, y)的二维切比雪夫级数,需要进行以下步骤: 定义数组 定义一个三维数组,第一维表示级数的数量,第二维表示点的x坐标,第三维表示点的y坐标…

    python-answer 2023年3月25日
    00
  • python 3.7.0 下pillow安装方法

    下面是Python 3.7.0下安装Pillow的完整攻略: 安装前准备 在开始安装过程前,需要先确认一下以下几点: 电脑中已经安装好了Python 3.7.0版本,可以通过命令行输入python –version或python3 –version来确认版本号。 已经安装pip,可以通过输入pip –version来检测pip是否已经正确安装。 确认了…

    python 2023年5月14日
    00
  • Python xml、字典、json、类四种数据类型如何实现互相转换

    转换Python数据类型之间的过程可以使用标准库中的 xml,json 模块实现。此外,Python自带的字典和类也可以进行互相转换。下面将详细介绍四种数据类型的转换方法: 1. XML与Python之间的转换 将Python数据类型转换成XML 使用xml.etree.ElementTree模块中Element 类中的方法tostring(),可以将Pyt…

    python 2023年5月31日
    00
  • Python爬虫必备技巧详细总结

    Python爬虫是一种非常常见的数据获取方式,但是在实际操作中,我们经常会遇到一些问题,例如反爬虫、数据清洗等。本文将详细讲解Python爬虫必备技巧,帮助大家更好地编写爬虫。 技巧1:使用User-Agent伪装浏览器 在爬取网页时,我们经常遇到反爬虫机制,例如网站会检测请求头中的User-Agent字段,如果发现是爬虫程序,则会拒绝请求。为避免这种情况,…

    python 2023年5月14日
    00
  • 使用Python实现tail的示例代码

    使用Python实现tail命令的功能,就是实时查看文件的末尾几行。下面是实现这个功能的示例代码和攻略。 Step 1:打开文件 首先,我们需要先打开文件,以便后面读取文件内容。在Python中,可以使用open()函数打开文件。这个函数需要指定文件名和打开文件的模式,比如只读模式(’r’)、二进制只读模式(’rb’)等。 with open(‘file.t…

    python 2023年5月19日
    00
  • 详解Pycharm第三方库的安装及使用方法

    Pycharm第三方库的安装及使用方法 Pycharm是一款流行的Python集成开发环境,可以方便地安装和使用第三方库。本文将详细讲解Pycharm第三方库的安装及使用方法,包括如何使用Pycharm的包管理器、如何手动安装第三方库、如何使用第三方库等。 使用Pycharm的包管理器 Pycharm的包管理器可以方便地安装和管理第三方库。以下是一个示例,演…

    python 2023年5月15日
    00
  • numpy排序与集合运算用法示例

    下面我将为大家详细讲解“numpy排序与集合运算用法示例”的完整攻略。 一、numpy排序用法示例 1.1 排序数组 在numpy中,可以使用sort()方法对数组进行排序,其默认排序方式为升序排序。下面是一个示例: import numpy as np arr = np.array([1, 5, 3, 9, 7]) arr.sort() print(arr…

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