实现功能:爬取本人随手记账户中的记录,保存到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了什么参数,但是没有找到,只能用这种办法。

欢迎多多批评指正!

【爬虫】爬取个人随手记账户相关推荐

  1. python网络爬虫_Python网络爬虫——爬取视频网站源视频!

    原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...

  2. python java 爬数据_如何用java爬虫爬取网页上的数据

    当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...

  3. java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面

    使用Java爬虫爬取人民日报公众号页面图片 使用Java框架Jsoup和HttpClient实现,先看代码 爬取目标页面 1.使用Maven构建一个普通Java工程 加入依赖: org.jsoup j ...

  4. MATLAB爬虫爬取股票数据

    近年来,大数据盛行,有关爬虫的教程层次不穷.那么,爬虫到底是什么呢? 什么是爬虫? 百度百科是这样定义的: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种 ...

  5. 在当当买了python怎么下载源代码-python爬虫爬取当当网

    [实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...

  6. python如何爬虫网页数据-python网络爬虫爬取网页内容

    1.什么是网络爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自 ...

  7. python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例

    这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...

  8. python爬虫数据分析可以做什么-python爬虫爬取的数据可以做什么

    在Python中连接到多播服务器问题,怎么解决你把redirect关闭就可以了.在send时,加上参数allow_redirects=False 通常每个浏览器都会设置redirect的次数.如果re ...

  9. 爬虫python的爬取步骤-Python爬虫爬取数据的步骤

    爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多 ...

最新文章

  1. android 4.2 判断桌面快捷,Android 判断桌面是否快捷方式,不存在则创建
  2. TimerTask定时任务
  3. java 判断正负数_Java判断一个字符串为数字(正负、小数)
  4. linux mono运行c 1,不装mono,你的.NET程序照样可以在Linux上运行!
  5. Kava下一阶段Kava 5主网将于3月4日上线
  6. 能在手机播放的Flash代码
  7. flutter 人脸检测_Flutter - 通过指纹和人脸识别认证
  8. 达摩院实现自动驾驶核心技术突破,首次实现3D物体检测精度与速度的兼得
  9. ZOJ - 4114 Flipping Game
  10. 浅谈大学综合能源服务
  11. 实验2014051901:opencv操作摄像头
  12. Hbase篇(7)-Region的分裂
  13. flash基本操作二-库面板和元件创建
  14. 如何远程桌面局域网内计算机,如何使用远程桌面控制局域网中的另一台计算机...
  15. Sort of sort
  16. Android问题集锦(六)- adb不是内部或外部命令解决方法
  17. JAVA方法3-方法的重载
  18. Android studio的下载和安装
  19. 【XSY-Contest2618.Problem A】抢夺
  20. ubuntu更换镜像源——全面讲解

热门文章

  1. fragment android:onclick,Android Fragment的布局中使用android:onClick 属性时需要注意的问题...
  2. 怎么提取伴奏?有什么实用的提取软件?
  3. iOS 屏幕适配浅谈
  4. Dede URL优化拼音命名
  5. 悟透JavaScript(李站老师)-对象素描
  6. 深度学习之神经网络基础(1)——感知器,S型神经元,梯度下降法,神经网络架构
  7. 《神奇的数学》读后感_数学王国_奇妙的数学王国读后感10篇
  8. 基于 dev 分支创建新的分支
  9. win10系统遇到深色背景自动降低亮度解决方法、WIN10自动调节亮度、如何关闭WIN10自动调节亮度
  10. 【AI】VGG网络简介