【记录】Python爬虫|爬取空间PC版日志模板

打印 上一主题 下一主题

主题 579|帖子 579|积分 1737

目录

注:2021/7/30做
效果

运行结果


模板中免费的部分


excel已简单处理,可以根据顺序大致找到页码。
一共有43个免费模板,其中39个可用,4个损坏。
损坏的模板

▽ 我以为我捡了个漏

▽ 实际上

小彩蛋

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

代码
  1. # author: shandianchengzi
  2. # description: get templates of qq diary, saving as "qq日志模板.xlsx". Result: 43 free, 4 damaged.
  3. # status: complete
  4. import json
  5. import requests
  6. import pandas as pd
  7. import re
  8. from time import sleep
  9. url="https://h5.qzone.qq.com/proxy/domain/mall.qzone.qq.com/cgi-bin/v3/cgi_get_letter_paper"
  10. headers={
  11.     'Accept': '*/*',
  12.     'Accept-Encoding': 'gzip, deflate, br',
  13.     'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  14.     'Content-Type': 'application/json; charset=utf-8',
  15.     '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',
  16. }
  17. headers['Cookie']="" #不需要填
  18. params={
  19.     'mallIds':'',
  20.     'keyWord':'',
  21.     'vip':0,
  22.     'g_tk':'1002114705',
  23.     'pageNum':3,
  24.     'pageCount':5,
  25. }
  26. datalist = []  #用来存储爬取的网页信息
  27. byYourself={
  28.     'number':5, #一次爬取的个数,建议5个,否则得到的数据会对不上
  29. }
  30. def LoadJson(JSON):
  31.     try:
  32.         return json.load(JSON)
  33.     except:
  34.         #找到"({"作为开始标志 和"})"作为结束标志之间的所有信息[jsonp格式]
  35.         return json.loads(re.match(".*?({.*}).*",JSON,re.S).group(1))
  36. def AddData(content):
  37.     for i in content['data']['items']:
  38.         i['name']=i['mall']['name']
  39.         i['attr']=i['mall']['attr']
  40.         datalist.append(i)
  41.         #print(i)
  42. def export_excel(export):
  43.     try:
  44.         #将字典列表转换为DataFrame
  45.         pf = pd.DataFrame(list(export))
  46.         #指定生成的Excel表格名称
  47.         file_path = pd.ExcelWriter('qq日志模板.xlsx')
  48.         #替换空单元格
  49.         pf.fillna(' ', inplace=True)
  50.         #输出
  51.         pf.to_excel(file_path, encoding='utf-8', index=False)
  52.         #保存表格
  53.         file_path.save()
  54.         print('保存成功!')
  55.     except Exception as e:
  56.         print("[-] Error = "+str(e))
  57.         print('无法导出为excel,请检查是否未关闭同名excel文件。正在重试……')
  58.         sleep(2)
  59.         export_excel(export)
  60.         
  61. def getData(total):
  62.     try:
  63.         params['pageCount']=byYourself['number']
  64.         pageTotal=int(total/byYourself['number'])+2
  65.         print('一共要加载',pageTotal,'页,请耐心等待:')
  66.         for i in range(1,pageTotal):
  67.             params['pageNum']=i
  68.             print('第',i,'页,',end='')
  69.             res = requests.get(url, params=params, headers=headers)
  70.             content=LoadJson(res.text)
  71.             AddData(content)
  72.     except Exception as e:
  73.         print("[-] Error = "+str(e))
  74.         print(res.text)
  75.     print(len(datalist))
  76.     export_excel(datalist)
  77. def myFunc():
  78.     datalist.clear()
  79.     res = requests.get(url, params=params, headers=headers)
  80.     #找到"({"作为开始标志 和"})"作为结束标志之间的所有信息[jsonp格式]
  81.     content=LoadJson(res.text)
  82.     total=content['data']['total']
  83.     print(total)
  84.     getData(total)
  85. 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
  1. def LoadJson(JSON):
  2.     try:
  3.         return json.load(JSON)
  4.     except:
  5.         #找到"({"作为开始标志 和"})"作为结束标志之间的所有信息[jsonp格式]
  6.         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个,全部点一遍都比找出生成规律划算。因此该问题没有解决方案。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表