这个部分主要是账单信息的获取, 文笔和语法可能都有点差,大家包涵
最近想给自己的网站接入支付和自动发货系统,踩了一些坑, 其中用到一些爬虫技术,放在这里和大家分享一下。
支付宝对个人用户太不友好了,自己网站想接入支付宝支付的话,必须要签约, 签约得要营业执照。总之各种蛋疼。这不,我想出了一个「折衷的解决办法」。
整个处理流程效率十分低下,但总比我手动发货好那么一点。 再次吐槽坑爹的支付宝,不开放接口!!!
一开始的思路是,通过 POST 数据登录支付宝 web 版。 后来尝试了一下,发现。支付宝关闭了 POST。 想要登录获取信息的话, 那么只剩下一条路了: 通过『 cookies 』登录
手动登录支付宝 web 版本, 打开 chrome 开发工具,找到 cookies, 复制出来。
上述步骤很我们在 爬取螺纹钢数据 这篇文章里已经详细的描述过了, 我就不过多介绍了。
我就说一个将字符串快速转换为字典类型的技巧
# 将复制到 cookies 转换为字典,方便调用
raw_cookies = 'JSESSIONID=RZ13thOM1d 后面省略了,调式的话用自己的 '
cookie = SimpleCookie(raw_cookies)
cookies = {i.key: i.value for i in cookie.values()}
得到了 cookies,我们就能在登录状态下获取数据了。
主要用到的是: requests 模块的 session
下面就看看 v1 版本的整体代码吧
整体代码:
'''
尝试登录支付宝
并获账单记录
'''
import requests
from http.cookies import SimpleCookie
from bs4 import BeautifulSoup
# 自定义 headers
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
'Referer': 'https://consumeprod.alipay.com/record/advanced.htm',
'Host': 'consumeprod.alipay.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Connection': 'keep-alive'
}
# 将复制到 cookies 转换为字典,方便调用
raw_cookies = 'JSESSIONID=RZ13thOM1dM5K05460101"; 中间省略了 one=RZ250AATO/mr4CZ1cRnxgFmVR'
cookie = SimpleCookie(raw_cookies)
cookies = {i.key: i.value for i in cookie.values()}
# 尝试使用面向对象的方式来造爬虫
class Alipay_Bill_Info(object):
'''支付宝账单信息'''
def __init__(self, headers, cookies):
'''
类的初始化
headers:请求头
cookies: 持久化访问
info_list: 存储账单信息的列表
'''
self.headers = headers
self.cookies = cookies
# 利用 requests 库构造持久化请求
self.session = requests.Session()
# 将请求头和 cookies 添加到缓存之中
self.session.headers = self.headers
self.session.cookies.update(self.cookies)
self.info_list = []
def login_status(self):
'''判断登录状态'''
status = self.session.get(
'https://consumeprod.alipay.com/record/standard.htm', timeout=5, allow_redirects=False).status_code
print(status)
if status == 200:
return True
else:
return False
def get_data(self):
'''
利用 bs4 库解析 html
并抓取数据,
数据以字典格式保存在列表里
'''
status = self.login_status()
url = 'https://consumeprod.alipay.com/record/standard.htm'
if status:
html = self.session.get(url).text
soup = BeautifulSoup(html, 'lxml')
# 抓取前五个交易记录
trades = soup.find_all('tr', class_='J-item ')[:5]
for trade in trades:
# 做一个 try except 避免异常中断
try:
# 分别找到账单的 时间 金额 以及流水号
time = trade.find('p', class_='text-muted').text.strip()
amount = trade.find(
'span', class_='amount-pay').text.strip()
code = trade.find(
'a', class_='J-tradeNo-copy J-tradeNo')['title']
self.info_list.append(
dict(time=time, amount=amount, code=code))
except:
self.info_list.append({'error': '出现错误,请加站长支付宝好友获取充值码'})
else:
self.info_list.append({'error': '出现错误,请加站长支付宝好友获取充值码'})
# 测试一下:
test = Alipay_Bill_Info(HEADERS, cookies)
test.get_data()
print(test.info_list)
'''
OUT:
200
[{'time': '07:34', 'amount': '- 3.00', 'code': '2017081521001004100329637047'},
{'time': '07:08', 'amount': '- 100.00', 'code': '2017081521001004100329622812'},
{'time': '05:37', 'amount': '+ 0.14', 'code': '20170815344111650101'},
{'time': '01:08', 'amount': '+ 10.00','code': '20170815200040011100040078948930'},
{'time': '22:23', 'amount': '+ 10.00', 'code': '20170814200040011100060079678223'}]
'''
可以看到 我需要的前 5 个订单记录的 时间,流水,金额都已经出来了。 来对比一下网页版截图:
上面那个爬虫虽然实现了爬取账单信息的功能,
但实际上,完全没有用有没有?
因为 每次都得我们手动输入 cookies
那这个爬虫完全没有存在的 意义了!
当然,这是夸张的说法, 通过上面那个爬虫,我们实践证明了爬取账单的可能性。
剩下的只需要想办法 自动获取 cookies 就行了!
如何自动获取 cookies 呢?
想出的一个比较笨的方法:
说起来很简单有没有?
但实际上我整整调试了一个下午才成功啊!!!
你觉得是为啥呢?
当然是支付宝坑爹的认证机制:
说多了都是辛酸泪,大家调试的时候,注意点就好。
下面给出获取 cookies 的代码片段
def wait_input(self, ele, str):
'''减慢账号密码的输入速度'''
for i in str:
ele.send_keys(i)
time.sleep(0.5)
def get_cookies(self):
'''获取 cookies'''
# 初始化浏览器对象
sel = webdriver.PhantomJS()
sel.maximize_window()
sel.get(Login_Url)
sel.implicitly_wait(3)
# 找到用户名字输入框
uname = sel.find_element_by_id('J-input-user')
uname.clear()
print('正在输入账号.....')
self.wait_input(uname, self.user)
time.sleep(1)
# 找到密码输入框
upass = sel.find_element_by_id('password_rsainput')
upass.clear()
print('正在输入密码....')
self.wait_input(upass, self.passwd)
# 截图查看
# sel.save_screenshot('1.png')
# 找到登录按钮
butten = sel.find_element_by_id('J-login-btn')
time.sleep(1)
butten.click()
# sel.save_screenshot('2.png')
print(sel.current_url)
# 跳转到账单页面
print('正在跳转页面....')
sel.get(Bill_Url)
sel.implicitly_wait(3)
# sel.save_screenshot('3.png')
# 获取 cookies 并转换为字典类型
cookies = sel.get_cookies()
cookies_dict = {}
for cookie in cookies:
if 'name' in cookie and 'value' in cookie:
cookies_dict[cookie['name']] = cookie['value']
return cookies_dict
# 关闭浏览器
sel.close()
def set_cookies(self):
'''将获取到的 cookies 加入 session'''
c = self.get_cookies()
self.session.cookies.update(c)
print(self.session.cookies)
这个部份主要是利用了 selenuim 模拟 PhanomJS 来模拟浏览器,登录支付宝账号密码 最后获取 cookies,并格式化。
有详细的注释,详细都能看懂的吧!
对于浏览器模拟爬虫不熟悉的,可以看我以前写的文章:
可以看到,我们已经可以完全自动化的查询账单信息了。
剩下的就是后台支付系统的把编写了, 由于不涉及到爬虫的相关技术 我就不 pull 上来啦~
'''
尝试登录支付宝
并获取账单记录
通过 seleium 登录支付宝,
获取 cookies
'''
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import time
# 登录 url
Login_Url = 'https://auth.alipay.com/login/index.htm?goto=https%3A%2F%2Fwww.alipay.com%2F'
# 账单 url
Bill_Url = 'https://consumeprod.alipay.com/record/standard.htm'
# 登录用户名和密码
USERNMAE = ''
PASSWD = ''
# 自定义 headers
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
'Referer': 'https://consumeprod.alipay.com/record/advanced.htm',
'Host': 'consumeprod.alipay.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Connection': 'keep-alive'
}
class Alipay_Bill_Info(object):
'''支付宝账单信息'''
def __init__(self, headers, user, passwd):
'''
类的初始化
headers:请求头
cookies: 持久化访问
info_list: 存储账单信息的列表
'''
self.headers = headers
# 初始化用户名和密码
self.user = user
self.passwd = passwd
# 利用 requests 库构造持久化请求
self.session = requests.Session()
# 将请求头添加到缓存之中
self.session.headers = self.headers
# 初始化存储列表
self.info_list = []
def wait_input(self, ele, str):
'''减慢账号密码的输入速度'''
for i in str:
ele.send_keys(i)
time.sleep(0.5)
def get_cookies(self):
'''获取 cookies'''
# 初始化浏览器对象
sel = webdriver.PhantomJS()
sel.maximize_window()
sel.get(Login_Url)
sel.implicitly_wait(3)
# 找到用户名字输入框
uname = sel.find_element_by_id('J-input-user')
uname.clear()
print('正在输入账号.....')
self.wait_input(uname, self.user)
time.sleep(1)
# 找到密码输入框
upass = sel.find_element_by_id('password_rsainput')
upass.clear()
print('正在输入密码....')
self.wait_input(upass, self.passwd)
# 截图查看
# sel.save_screenshot('1.png')
# 找到登录按钮
butten = sel.find_element_by_id('J-login-btn')
time.sleep(1)
butten.click()
# sel.save_screenshot('2.png')
print(sel.current_url)
# 跳转到账单页面
print('正在跳转页面....')
sel.get(Bill_Url)
sel.implicitly_wait(3)
# sel.save_screenshot('3.png')
# 获取 cookies 并转换为字典类型
cookies = sel.get_cookies()
cookies_dict = {}
for cookie in cookies:
if 'name' in cookie and 'value' in cookie:
cookies_dict[cookie['name']] = cookie['value']
return cookies_dict
# 关闭浏览器
sel.close()
def set_cookies(self):
'''将获取到的 cookies 加入 session'''
c = self.get_cookies()
self.session.cookies.update(c)
print(self.session.cookies)
def login_status(self):
'''判断登录状态'''
# 添加 cookies
self.set_cookies()
status = self.session.get(
Bill_Url, timeout=5, allow_redirects=False).status_code
print(status)
if status == 200:
return True
else:
return False
def get_data(self):
'''
利用 bs4 库解析 html
并抓取数据,
数据以字典格式保存在列表里
'''
status = self.login_status()
if status:
html = self.session.get(Bill_Url).text
soup = BeautifulSoup(html, 'lxml')
# 抓取前五个交易记录
trades = soup.find_all('tr', class_='J-item ')[:5]
for trade in trades:
# 做一个 try except 避免异常中断
try:
# 分别找到账单的 时间 金额 以及流水号
time = trade.find('p', class_='text-muted').text.strip()
amount = trade.find(
'span', class_='amount-pay').text.strip()
code = trade.find(
'a', class_='J-tradeNo-copy J-tradeNo')['title']
self.info_list.append(
dict(time=time, amount=amount, code=code))
except:
self.info_list.append({'error': '出现错误,请加站长支付宝好友获取充值码'})
else:
self.info_list.append({'error': '出现错误,请加站长支付宝好友获取充值码'})
return self.info_list
# test:
test = Alipay_Bill_Info(HEADERS, USERNMAE, PASSWD)
data = test.get_data()
print(data)
每天的学习记录都会 同步更新到: 微信公众号:findyourownway
知乎专栏: https://zhuanlan.zhihu.com/Ehco-python
blog:www.ehcoblog.ml
Github: https://github.com/Ehco1996/Python-crawler
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.