注:2021/7/30做

效果

运行结果

模板中免费的部分

excel已简单处理,可以根据顺序大致找到页码。

一共有43个免费模板,其中39个可用,4个损坏。

损坏的模板

▽ 我以为我捡了个漏



▽ 实际上

小彩蛋

▽ “限时免费”的林丹模板

代码

# author: shandianchengzi
# description: get templates of qq diary, saving as "qq日志模板.xlsx". Result: 43 free, 4 damaged.
# status: complete
import json
import requests
import pandas as pd
import re
from time import sleep
url="https://h5.qzone.qq.com/proxy/domain/mall.qzone.qq.com/cgi-bin/v3/cgi_get_letter_paper"
headers={
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Content-Type': 'application/json; charset=utf-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.56',
}
headers['Cookie']="" #不需要填
params={
'mallIds':'',
'keyWord':'',
'vip':0,
'g_tk':'1002114705',
'pageNum':3,
'pageCount':5,
}
datalist = [] #用来存储爬取的网页信息
byYourself={
'number':5, #一次爬取的个数,建议5个,否则得到的数据会对不上
} def LoadJson(JSON):
try:
return json.load(JSON)
except:
#找到"({"作为开始标志 和"})"作为结束标志之间的所有信息[jsonp格式]
return json.loads(re.match(".*?({.*}).*",JSON,re.S).group(1))
def AddData(content):
for i in content['data']['items']:
i['name']=i['mall']['name']
i['attr']=i['mall']['attr']
datalist.append(i)
#print(i)
def export_excel(export):
try:
#将字典列表转换为DataFrame
pf = pd.DataFrame(list(export))
#指定生成的Excel表格名称
file_path = pd.ExcelWriter('qq日志模板.xlsx')
#替换空单元格
pf.fillna(' ', inplace=True)
#输出
pf.to_excel(file_path, encoding='utf-8', index=False)
#保存表格
file_path.save()
print('保存成功!')
except Exception as e:
print("[-] Error = "+str(e))
print('无法导出为excel,请检查是否未关闭同名excel文件。正在重试……')
sleep(2)
export_excel(export) def getData(total):
try:
params['pageCount']=byYourself['number']
pageTotal=int(total/byYourself['number'])+2
print('一共要加载',pageTotal,'页,请耐心等待:')
for i in range(1,pageTotal):
params['pageNum']=i
print('第',i,'页,',end='')
res = requests.get(url, params=params, headers=headers)
content=LoadJson(res.text)
AddData(content)
except Exception as e:
print("[-] Error = "+str(e))
print(res.text)
print(len(datalist))
export_excel(datalist) def myFunc():
datalist.clear()
res = requests.get(url, params=params, headers=headers)
#找到"({"作为开始标志 和"})"作为结束标志之间的所有信息[jsonp格式]
content=LoadJson(res.text)
total=content['data']['total']
print(total)
getData(total)
myFunc()

问题及解决方式

1. 返回数据_callback({})而非json

这种数据返回格式,使我们无法直接使用json.load(res.text)解析。

问题根源在于JSONP这种数据传输格式

ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

比如,可用script标签直接指向不同域下的js脚本,在js脚本中加入这个函数。

本例中的_callback({})便是JSONP的典型应用。

解决方式:正则去掉_callback({})

参考https://blog.csdn.net/weixin_38208912/article/details/104208785

def LoadJson(JSON):
try:
return json.load(JSON)
except:
#找到"({"作为开始标志 和"})"作为结束标志之间的所有信息[jsonp格式]
return json.loads(re.match(".*?({.*}).*",JSON,re.S).group(1))

2. 获取封面图链接

封面图的链接格式:

https://qzonestyle.gtimg.cn/qzone/space_item/pre/14/108942_1.gif

找了一下规律,明显是位置+ id + _1.gif。

可惜https://qzonestyle.gtimg.cn/qzone/space_item/pre/后面的14不是固定的值,我暂时没有去管它的生成规律,免费的只有39个,全部点一遍都比找出生成规律划算。因此该问题没有解决方案。

【记录】Python爬虫|爬取空间PC版日志模板的更多相关文章

  1. 使用python爬虫爬取链家潍坊市二手房项目

    使用python爬虫爬取链家潍坊市二手房项目 需求分析 需要将潍坊市各县市区页面所展示的二手房信息按要求爬取下来,同时保存到本地. 流程设计 明确目标网站URL( https://wf.lianjia ...

  2. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  3. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  4. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  5. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  6. python爬虫爬取内容中,-xa0,-u3000的含义

    python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310

  7. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  8. python爬虫—爬取英文名以及正则表达式的介绍

    python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...

  9. 一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...

  10. python爬虫-爬取百度图片

    python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...

随机推荐

  1. 15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用

    15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用 @ 目录 15. Docker容器监控之(CAdvisor+InfluxDB+Granfan ...

  2. 如何在JMeter中配置断言,将非200状态码视为测试成功

    如何在JMeter中配置断言,将非200状态码视为测试成功 引言 在接口测试中,HTTP响应状态码是判断请求是否成功的重要依据.通常情况下,状态码200表示请求成功,而其他状态码则可能表示各种类型的错 ...

  3. Typecho防黑安全加固-修改后台路径

    删除安装文件 成功安装后删除install.php文件.install/文件夹. 修改后台地址 把admin修改为黑客猜不到的名字,例如pipixia,防止黑客穷举密码. 修改admin文件夹名称 修 ...

  4. C#中对面向standard2.0、standard2.1的项目进行单元测试

    单元测试项目的目标框架 (TargetFramework或TargetFrameworks) 不能是standard2.0或standard2.1. 这是因为.NET Standard只是一个规范,它 ...

  5. 【ABAQUS 二次开发笔记】读入TXT分析结果&输出csv文件

    abaqus分析之后,很多结果可以输出dat,msg,sta等文件中.可以用记事本.notpad++.editplus等软件打开编辑. 但是往往无法直接用excel.origin等软件打开,比如对结构 ...

  6. python3 ModuleNotFoundError: No module named 'CommandNotFound'

    前言 python3 报错:ModuleNotFoundError: No module named 'CommandNotFound' 这是 linux 安装多版本 python 时的一个遗留问题, ...

  7. 如何编写正确高效的Dockerfile

    Dockerfile是什么 Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像.拷贝文件.运行脚本等等,RUN, COPY, ADD指令都会生成一个 Lay ...

  8. OpenHarmony 开源鸿蒙北向开发——hdc工具安装

    ​ hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHar ...

  9. The surprising impact of mask-head architecture on novel class segmentation精讲

    目录 Mask RCNN Problem Definition Key idea Only Mask Head Code Summary Refer 大家好,这是我今天要讲的论文,它是2021年发表在 ...

  10. Spring Boot的常用注解

    在Spring Boot中,注解(Annotation)是核心特性之一,广泛用于配置和简化开发.以下是Spring Boot中一些常用的注解及其示例: 1. @SpringBootApplicatio ...