python模拟支付宝扫码登录_Python爬虫模拟登录支付宝并获取订单信息
Last updated on
本文仅学习交流使用,记录学习用webdriver模拟登录支付宝保存cookie,再用requests.session()加载cookie并用Xpath获取订单信息,将订单存储到MySQL数据库中的过程。
本机主要运行环境及库Arch Linux
webdriver(Chrome或者FireFox)
Python3.6
selenium 库
json 库
requests 库
lxml 库
MySQLdb 库
确保本机具有或类似的运行条件,webdriver 安装方法在selenium模拟登录163邮箱中已经提到。
selenium、json、requests、lxml库都可以通过python的包管理工具PyPI安装。
Python2.x 的版本通过pip安装mysql-python 来连接MySQL数据库,Python3.x则需要通过pip安装mysqlclient来实现Python和MySQL的连接。
获取cookie
我们用webdriver登录支付宝来获取cookie,并用json使数据持久化。
首先获取支付宝登录页面的URL:
https://auth.alipay.com/login/index.htm?goto=https%3A%2F%2Flab.alipay.com%2Fuser%2Fi.htm
通过Chrome开发者工具获取用户名文本框的id属性、密码文本框的name属性、和登录按钮的id属性
部分代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14driver = webdriver.Firefox()
driver.maximize_window()
driver.get('https://auth.alipay.com/login/index.htm?goto=https%3A%2F%2Fmy.alipay.com%2Fportal%2Fi.htm')
time.sleep(2)
driver.find_element_by_id('J-input-user').send_keys('你的支付宝用户名') # 输入用户名
driver.find_element_by_name('password_rsainput').send_keys('你的支付宝密码') # 输入密码
driver.find_element_by_id('J-login-btn').click() # 点击登录按钮
# 获取cookie,并保存到本地
cookies = driver.get_cookies()
with open('cookies','w') as f:
json.dump(cookies, f)
f.close()
driver.close()
设置cookie
要用requests.session()请求网页进行爬取,所以我们就直接加载本地的cookie来请求网页
部分代码如下:1
2
3
4
5
6with ('cookies', 'r') as f:
cookies= json.load(f)
for cookie in cookies:
c = {cookie['name']: cookie['value']}
session.cookies.update(c)
获取数据
采用lxml来解析网页,然后通过xpath来找到相应的数据,最后存储到各自list中,为的是之后存储到数据库方便
部分代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# 获取交易记录界面
html = self.session.get('https://consumeprod.alipay.com/record/standard.htm')
# 用lxml解析html
selector= etree.HTML(html.text)
# 获取最近20个交易数据
for i in range(1,21):
# 获取流水号
number = selector.xpath('//*[@id="J-tradeNo-'+str(i)+
number_list.append(number[0].strip())
# 获取交易时间
time = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[2]/p[1]/text()')
time_list.append(time[0].strip())
# 获取具体内容
try:
# 交易成功的内容
content = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[3]/p[1]/a/text()')
content_list.append(content[0].strip())
except:
# 交易失败的内容
content = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[3]/p[1]/text()')
content_list.append(content[0].strip())
# 获取金额变动
money = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[4]/span/text()')
money_list.append(money[0].strip())
# 获取交易状态
state = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[6]/p[1]/text()')
state_list.append(state[0].strip())
存储数据
将存储到list中的数据,存储到mysql中
部分代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 连接数据库
db = MySQLdb.connect('localhost', 'root', '数据库密码', '数据库')
# 获取游标
cursor = db.cursor()
for i in range(20):
# sql 插入语句,插入到alipay表中
sql = "INSERT IGNORE INTO alipay(NUMBER,DATE,CONTENT,MONEY,STATE) VALUES ('%s','%s','%s','%s','%s')" % (number_list[i],time_list[i],content_list[i],money_list[i],state_list[i])
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库
db.commit()
except:
# 失败回滚
db.rollback()
# 关闭数据库连接
db.close()
完整代码
将代码进行了封装,增加了对加载cookie后登录状态的确认
完整代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123# -*- coding=utf-8 -*-
from selenium import webdriver
import time
import json
import requests
from lxml import etree
import MySQLdb
class AlipaySpider(object):
def __init__(self):
self.headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'}
self.session = requests.Session()
self.session.headers = self.headers
self.number_list = []
self.time_list = []
self.content_list = []
self.money_list = []
self.state_list = []
# 用webdriver 获取cookie
def save_cookies(self):
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('https://auth.alipay.com/login/index.htm?goto=https%3A%2F%2Fmy.alipay.com%2Fportal%2Fi.htm')
# 等待2秒
time.sleep(2)
driver.find_element_by_id('J-input-user').send_keys('你的支付宝用户名')
driver.find_element_by_name('password_rsainput').send_keys('你的支付宝密码')
driver.find_element_by_id('J-login-btn').click()
# 获取cookie,并保存到本地
cookies = driver.get_cookies()
with open('cookies','w') as f:
json.dump(cookies, f)
f.close()
driver.close()
# 设置cookie
def set_cookies(self):
# 从文件中获取cookie
with open('cookies', 'r') as f:
cookies = json.load(f)
# 将json存储的cookie 转化为dict,并更新session的coookie
for cookie in cookies:
c = {cookie['name']: cookie['value']}
self.session.cookies.update(c)
# 判断是否已经登录
def aready_login(self):
self.set_cookies()
html_code = self.session.get('https://custweb.alipay.com/account/index.htm',allow_redirects=False).status_code
if html_code == 200:
return True
else:
return False
# 获取数据
def get_data(self):
# 获取交易记录界面
html = self.session.get('https://consumeprod.alipay.com/record/standard.htm')
# 用lxml解析html
selector= etree.HTML(html.text)
# 获取最近20个交易数据
for i in range(1,21):
# 获取流水号
number = selector.xpath('//*[@id="J-tradeNo-'+str(i)+
self.number_list.append(number[0].strip())
# 获取交易时间
time = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[2]/p[1]/text()')
self.time_list.append(time[0].strip())
# 获取具体内容
try:
# 交易成功的内容
content = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[3]/p[1]/a/text()')
self.content_list.append(content[0].strip())
except:
# 交易失败的内容
content = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[3]/p[1]/text()')
self.content_list.append(content[0].strip())
# 获取金额变动
money = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[4]/span/text()')
self.money_list.append(money[0].strip())
# 获取交易状态
state = selector.xpath('//*[@id="J-item-'+str(i)+'"]/td[6]/p[1]/text()')
self.state_list.append(state[0].strip())
# 存储数据
def save_data(self):
# 连接数据库
db = MySQLdb.connect('localhost', 'root', '密码', '数据库')
# 获取游标
cursor = db.cursor()
for i in range(20):
# sql 插入语句,插入到alipay表中
sql = "INSERT IGNORE INTO alipay(NUMBER,DATE,CONTENT,MONEY,STATE) VALUES ('%s','%s','%s','%s','%s')" % (self.number_list[i],self.time_list[i],self.content_list[i],self.money_list[i],self.state_list[i])
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库
db.commit()
except:
# 失败回滚
db.rollback()
# 关闭数据库连接
db.close()
def total_crawl(self):
self.save_cookies() # 保存cookie
self.set_cookies() # 设置cookie
self.get_data() # 爬取数据
self.save_data() # 保存数据
def crawl(self):
self.get_data() # 爬取数据
self.save_data() # 保存数据
if __name__ == "__main__":
spider = AlipaySpider()
if spider.aready_login() == True:
spider.crawl()
else:
spider.total_crawl()
总结
通过本次的学习,有2点不足之处。有时由于多次访问支付宝页面,导致登录页面有验证码,这样获取到的cookie就不成功了,需要再次请求,直到没有验证码,才能获取到cookie
数据爬取时,只能爬取到最近的20笔交易记录
遗留问题会在学习更多之后解决
python模拟支付宝扫码登录_Python爬虫模拟登录支付宝并获取订单信息相关推荐
- 支付宝扫码验签实例php,PHP 支付宝支付,支付宝回调
下载官方SDK:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=PHP 在支付宝所创建的应用中添加" 电脑网站支付. ...
- python微信公众号推送_python爬虫_微信公众号推送信息爬取的实例
问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...
- python教程app 小米应用商店_Python爬虫过程解析之多线程获取小米应用商店数据...
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于IT共享之家 ,作者IT共享者 前言 小米应用商店给用户发现最好的安卓应用和游戏,安 ...
- python 12306登录_python爬虫--模拟12306登录
模拟12306登录 超级鹰: #!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Ch ...
- python爬取学校教务管理系统_python爬虫模拟登陆学校教务处
最近在学python爬虫,我想教务处官网可能是每个学生第一个自己动手爬取的网站吧.而且很多学校的教务处没有验证码,很适合初学者练手. 环境准备 本次模拟登陆用到的库除了requests外还有lxml, ...
- python爬取京东手机参数_python爬虫——分页爬取京东商城商品信息(手机为例)...
1.最近刚开始学习python 写了个爬虫练习,感觉主要是得会用F12查询网站结构代码.还涉及到反爬虫,每个网站都不一样,拿到的解析出的json数据格式也不同.得有些Web知识的基础才行. htt ...
- C# Winform窗体实现支付宝扫码支付
C# Winform窗体项目实现支付宝扫码支付 一.内容介绍 啪嗒!( 搬好小板凳 ) 大家好,本次学习的内容是在博主大一winform窗体项目中实现的一个功能--支付宝扫码支付: 主要功能通过支付宝 ...
- 支付宝扫码支付模式平台介绍
互联网在逐渐普及过程中,智能手机逐渐成为人们日常生活内主要电子设备.互联网支付在逐渐普及过程中,移动支付也逐渐出现在人们日常生活工作内,互联网支付企业也逐渐参与到线下支付行列内.第三方支付企业在为社会 ...
- 支付宝扫码跳转小程序并传参
支付宝扫码跳转小程序并传参 1. 打开支付宝开放平台 支付宝开放平台 打开支付宝开放平台,进入自己的小程序详情页面.点击小程序码>关联普通二维码>添加按钮 2. 输入业务域名 这里我们选择 ...
- 利用Python实现MOOC扫码登录
利用Python实现MOOC扫码登录 1.基本原理 访问网站扫码登录页,网站给浏览器返回一个二维码和一个唯一标志KEY 浏览器开启定时轮询服务器,确认KEY对应的扫码结果 用户使用app扫码二维码,a ...
最新文章
- 在服务器上处理gis文件,云服务器处理gis
- myisam怎么读_耗时半年,我成功“逆袭”,拿下美团offer(刷面试题+读源码+项目准备)...
- R语言-时间日期函数
- TcxComboBox控件说明
- Linux 下定时文件crontab配置
- 百度地图InfoWindow弹窗圆角
- 专家思维模型之马太效应
- xy坐标正负方向_xy坐标分别代表什么
- Dango 之 Xadmin
- (全网首发)谢惠民答案------谢惠民上下册习题解析
- MySQL索引(详细,1万字长文)
- 图像数据的特征提取方法
- Python实现AI变脸
- eeplat中遇到日期先后校验问题的解决
- 中标麒麟系统u盘安装_U盘安装中标麒麟Linux桌面版的方法
- 大数据相关总结(待续)
- 开放银行潜在风险不可忽视,看F5如何应对?
- mysql的exists与inner join 和 not exists与 left join 性能差别惊人
- 美化WinForm第三方框架DevExpress
- 操作系统同步问题:有一个没有限量的大盘子,爸爸只往里面放苹果,妈妈只往里面放桔子,儿子只拿苹果吃,女儿只拿桔子吃,请写出能描述4个人行为的同步方案
热门文章
- 前端实现导入(excel文件)导出(word)文件
- Vue+elementUI导出xlsl表格,支持复杂表头,自动合拼单元格。xlsx+file-saver插件
- 树莓派python扫描蓝牙
- 计算机公式固定数值符号,【2人回答】Excel如何锁定,如何Excel某计算公式中锁定其中一个数值?-3D溜溜网...
- 使用正片和负片为何会得到效果相同的PCB?
- MySQL视图创建与管理(实验五)
- android rtsp传输,android-ndk – 使用FFMpeg在Android客户端上进行RTSP流式传输
- Windows下cwRsync搭建步骤
- 科研论文检索方法入门(计算机领域)
- Idea起服务报错java heap space,GC overhead limit exceeded,Information:javac 1.8.0_181 was used to comp解决办法