【爬虫】爬取个人随手记账户
实现功能:爬取本人随手记账户中的记录,保存到word文档,包括:日期,分类,说的话和图片
具体步骤如下:
一、登陆账户
首先要访问随手记,需要登陆才能看到详细记录,之前考虑浏览器填写表单,POST给服务器,但是抓取了几次POST数据后,发现每次POST的密码都进行了某种加密,每次都不一样,如图所示:
没有做过这方面的研究,不知道如何POST,(期待大神指教!),只好作罢,这里利用COOKIE登陆。
def Login(cookie_str):#浏览器登录后得到的cookie,一定要是Response Header里 status为200 OK的那个数据里的cookie
# cookie_str = cookie#把cookie字符串处理成字典,以便接下来使用cookies = {}for line in cookie_str.split(';'):key, value = line.split('=', 1)cookies[key] = value#设置请求头headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}#在发送get请求时带上请求头和cookies#resp = requests.get(url, headers = headers, cookies = cookies) #用get方法,得到的实际是https://www.sui.com/tally/new.do的结果,没有需要的数据resp = requests.get(url,headers = headers, cookies = cookies)#检查是否登录成功 if re.compile(r"个人中心").search(resp.text):print('Login Success')return (cookies,1)else:print('Login failed')return (cookies,0)
这里需要注意的是:
1.并不是F12开发者工具截获的每个消息的COOKIE都可以用,必须选择Response Header里 status为200 OK的那个数据里的cookie
2.具体requests用get 方法还是post方法,需要针对获得的数据进行分析,看浏览器是执行了哪种操作,爬虫也执行相应的操作即可,这里判断是否登录成功,用get方法即可得到正确的结果,也可以利用status=200作为判断依据。
二、获取本月的记录总共几页
def getPageNum(cookies,beginDate,endDate):headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}payload = {'opt':'list2','beginDate':beginDate,'endDate':endDate,'cids':'0','bids':'0','sids':'0','pids':'0','memids':'0','order':'','isDesc':'0','page':1,'note':'','mids':'0'}resp = requests.post(url,headers = headers, cookies = cookies, data = payload)data = json.loads(resp.text)#print(type(data)) 8个元素的dictpageCount = data['pageCount']return pageCount
这里的payload是从F12抓到的post的各个字段,每个都照抄下来,利用requests的post方法,即可抓取到需要的内容。
另外,注意到我们需要抓取的数据是在F12开发者工具的network里的XHR一项中,也就是动态加载得到的,那么我们得到的数据也需要json.load方法进行加载。然后在对加载后的数据进行分析,到底是多少个元素的列表还是字典之类的,直到解析到我们需要的数据。
三、具体爬取
def spider(doc,cookies,beginDate,endDate,pageNum): headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}for page in range(1,pageNum+1):payload = {'opt':'list2','beginDate':beginDate,'endDate':endDate,'cids':'0','bids':'0','sids':'0','pids':'0','memids':'0','order':'','isDesc':'0','page':page,'note':'','mids':'0'}resp = requests.post(url,headers = headers, cookies = cookies, data = payload)# print(resp.text)data = json.loads(resp.text)#print(type(data)) 8个元素的dictgroups = data['groups']#['list']#print(type(groups)) 10个元素的list,每个元素是一个dictfor n in range(0,len(groups)):#遍历多条记录group = groups[n] item_list = group['list'] # 具体内容都在这个list下,类型:列表中具体几个元素,要看记录了几条for m in range(0,len(item_list)):item = item_list[m] # item 包含各个标签下的数据,为一个字典date_dic = item['date']year = date_dic['year'] + 1900month = date_dic['month'] + 1day = date_dic['date']categoryName = item['categoryName']memo = item['memo']image_url = item['url']date = '{}年{}月{}日'.format(str(year),str(month),str(day))print(date)
# print(categoryName,memo,image_url)if m == 0: #日期标题只输出一次heading = doc.add_heading()title = heading.add_run(date)title.font.bold = Truetable = doc.add_table(rows= 1,cols=2)cells = table.rows[0].cellscells[0].text = categoryNamecells[1].text = memoparagraph = doc.add_paragraph(image_url)
# table.cell(m,2).text = image_urlif image_url and re.compile(r"http").search(image_url):response = requests.get(image_url)img = response.contentbinary_img = BytesIO(img) doc.add_picture(binary_img, width=Inches(2))doc.save('D:/Code/python/Suispider/secret.doc')
1.本部分程序,将抓取到的记录保存到word文档中,传递给本函数的就有名称为doc的实例,后续将抓取到的结果保存到文档中,这里doc部分采用了python-docs包,包括添加标题add_heading, 添加表格 add_table,添加段落add_paragraph,等,具体用法可以参考https://python-docx.readthedocs.io/en/latest/。安装后调用的时候我记得报错了,后来安装对应的whl文件,才解决
2.另外,对于抓到的图片网址,像保存到word中,需要BytesIO方法将Bytes类型的图片数据直接保存到word,而不用下载到本地再弄到word中,这里参考了https://stackoverflow.com/questions/24341589/python-docx-add-picture-from-the-web
四、总的代码
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 22 16:25:49 2018
创建爬取随手记记录的爬虫
@author: Jzz
"""
import requests
import sys
from bs4 import BeautifulSoup
import re
import json
import calendar #为了确定终止时间是在某个月的几号
from docx import Document
from docx.shared import Inches
import io
import timedef Login(cookie_str):#浏览器登录后得到的cookie,一定要是Response Header里 status为200 OK的那个数据里的cookie
# cookie_str = cookie#把cookie字符串处理成字典,以便接下来使用cookies = {}for line in cookie_str.split(';'):key, value = line.split('=', 1)cookies[key] = value#设置请求头#headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}#在发送get请求时带上请求头和cookies#resp = requests.get(url, headers = headers, cookies = cookies) #用get方法,得到的实际是https://www.sui.com/tally/new.do的结果,没有需要的数据resp = requests.get(url,headers = headers, cookies = cookies)#检查是否登录成功 if re.compile(r"个人中心").search(resp.text):print('Login Success')return (cookies,1)else:print('Login failed')return (cookies,0)def getPageNum(cookies,beginDate,endDate):headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}payload = {'opt':'list2','beginDate':beginDate,'endDate':endDate,'cids':'0','bids':'0','sids':'0','pids':'0','memids':'0','order':'','isDesc':'0','page':1,'note':'','mids':'0'}resp = requests.post(url,headers = headers, cookies = cookies, data = payload)data = json.loads(resp.text)#print(type(data)) 8个元素的dictpageCount = data['pageCount']return pageCountdef spider(doc,cookies,beginDate,endDate,pageNum): headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}for page in range(1,pageNum+1):payload = {'opt':'list2','beginDate':beginDate,'endDate':endDate,'cids':'0','bids':'0','sids':'0','pids':'0','memids':'0','order':'','isDesc':'0','page':page,'note':'','mids':'0'}resp = requests.post(url,headers = headers, cookies = cookies, data = payload)# print(resp.text)data = json.loads(resp.text)#print(type(data)) 8个元素的dictgroups = data['groups']#['list']#print(type(groups)) 10个元素的list,每个元素是一个dictfor n in range(0,len(groups)):#遍历多条记录group = groups[n] item_list = group['list'] # 具体内容都在这个list下,类型:列表中具体几个元素,要看记录了几条for m in range(0,len(item_list)):item = item_list[m] # item 包含各个标签下的数据,为一个字典date_dic = item['date']year = date_dic['year'] + 1900month = date_dic['month'] + 1day = date_dic['date']categoryName = item['categoryName']memo = item['memo']image_url = item['url']date = '{}年{}月{}日'.format(str(year),str(month),str(day))print(date)
# print(categoryName,memo,image_url)if m == 0: #日期标题只输出一次heading = doc.add_heading()title = heading.add_run(date)title.font.bold = Truetable = doc.add_table(rows= 1,cols=2)cells = table.rows[0].cellscells[0].text = categoryNamecells[1].text = memoparagraph = doc.add_paragraph(image_url)
# table.cell(m,2).text = image_urlif image_url and re.compile(r"http").search(image_url):response = requests.get(image_url)img = response.contentbinary_img = BytesIO(img) doc.add_picture(binary_img, width=Inches(2))doc.save('D:/Code/python/Suispider/secret.doc')#登录后才能访问的网页
url = 'https://www.sui.com/tally/new.rmi'
# 遍历不同账本,需要用不同的cookie即可实现,没有多余post参数cookie_str = r'输入自己的cookie'
login_result = Login(cookie_str)
cookies = login_result[0]
set_year = 2018
doc = Document()if login_result[1] == 1:for month in range(11,10,-1):
# month = 11last_day = calendar.monthrange(set_year,month)[1] #确定最后一天是几号beginDate = '{}.{}.01'.format(str(set_year),str(month))endDate = '{}.{}.{}'.format(str(set_year),str(month),str(last_day))page_num = getPageNum(cookies,beginDate,endDate) #获取这个月记录了几页spider(doc,cookies,beginDate,endDate,page_num)time.sleep(5)
另外,如果有多个账本,想都爬取下来,只用使用不同的cookie即可,之前考虑是POST了什么参数,但是没有找到,只能用这种办法。
欢迎多多批评指正!
【爬虫】爬取个人随手记账户相关推荐
- python网络爬虫_Python网络爬虫——爬取视频网站源视频!
原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...
- python java 爬数据_如何用java爬虫爬取网页上的数据
当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...
- java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面
使用Java爬虫爬取人民日报公众号页面图片 使用Java框架Jsoup和HttpClient实现,先看代码 爬取目标页面 1.使用Maven构建一个普通Java工程 加入依赖: org.jsoup j ...
- MATLAB爬虫爬取股票数据
近年来,大数据盛行,有关爬虫的教程层次不穷.那么,爬虫到底是什么呢? 什么是爬虫? 百度百科是这样定义的: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种 ...
- 在当当买了python怎么下载源代码-python爬虫爬取当当网
[实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...
- python如何爬虫网页数据-python网络爬虫爬取网页内容
1.什么是网络爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自 ...
- python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例
这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...
- python爬虫数据分析可以做什么-python爬虫爬取的数据可以做什么
在Python中连接到多播服务器问题,怎么解决你把redirect关闭就可以了.在send时,加上参数allow_redirects=False 通常每个浏览器都会设置redirect的次数.如果re ...
- 爬虫python的爬取步骤-Python爬虫爬取数据的步骤
爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多 ...
最新文章
- android 4.2 判断桌面快捷,Android 判断桌面是否快捷方式,不存在则创建
- TimerTask定时任务
- java 判断正负数_Java判断一个字符串为数字(正负、小数)
- linux mono运行c 1,不装mono,你的.NET程序照样可以在Linux上运行!
- Kava下一阶段Kava 5主网将于3月4日上线
- 能在手机播放的Flash代码
- flutter 人脸检测_Flutter - 通过指纹和人脸识别认证
- 达摩院实现自动驾驶核心技术突破,首次实现3D物体检测精度与速度的兼得
- ZOJ - 4114 Flipping Game
- 浅谈大学综合能源服务
- 实验2014051901:opencv操作摄像头
- Hbase篇(7)-Region的分裂
- flash基本操作二-库面板和元件创建
- 如何远程桌面局域网内计算机,如何使用远程桌面控制局域网中的另一台计算机...
- Sort of sort
- Android问题集锦(六)- adb不是内部或外部命令解决方法
- JAVA方法3-方法的重载
- Android studio的下载和安装
- 【XSY-Contest2618.Problem A】抢夺
- ubuntu更换镜像源——全面讲解
热门文章
- fragment android:onclick,Android Fragment的布局中使用android:onClick 属性时需要注意的问题...
- 怎么提取伴奏?有什么实用的提取软件?
- iOS 屏幕适配浅谈
- Dede URL优化拼音命名
- 悟透JavaScript(李站老师)-对象素描
- 深度学习之神经网络基础(1)——感知器,S型神经元,梯度下降法,神经网络架构
- 《神奇的数学》读后感_数学王国_奇妙的数学王国读后感10篇
- 基于 dev 分支创建新的分支
- win10系统遇到深色背景自动降低亮度解决方法、WIN10自动调节亮度、如何关闭WIN10自动调节亮度
- 【AI】VGG网络简介