吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 2833|回复: 59
收起左侧

[Python] python爬虫-把微博某用户的所有微博存下来防止和谐

  [复制链接]
英雄初本涩 发表于 2022-4-14 09:05
本帖最后由 英雄初本涩 于 2022-4-19 18:01 编辑

作为币圈韭菜 想看一下关注的大神每天发送了什么微博,之前已经写了一个微博更新推送到微信
为了防止他的微博删除或者被系统和谐,就写了一个把他的微博存到本地的...,当然只存的文字,图片觉得没必要就没处理,需要的话可以加上。这里就以我选的“赚不完亏得完Ryu,uid:6367430139”

2022年4月19日更新:增加图片下载,插入到word文档,图片下载的是高清图,可能会比较大,不想要高清图的请自己修改下图加粗字体的字段item['mblog']['pics']

import requests
import json
import time
import docx
from docx.shared import Inches
s = requests.Session()
page = 1
headers = {
    "user-agent": "'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'",
}

weekdict = {
    'Mon':'星期一',
    'Tue':'星期二',
    'Wed':'星期三',
    'Thu':'星期四',
    'Fri':'星期五',
    'Sat':'星期六',
    'Sun':'星期日',
}
mondict = {
    'Jan':'01',
    'Feb':'02',
    'Mar':'03',
    'Apr':'04',
    'May':'05',
    'Jun':'06',
    'Jul':'07',
    'Aug':'08',
    'Sep':'09',
    'Oct':'10',
    'Nov':'11',
    'Dec':'12',
}
file = docx.Document()  # 创建内存中的word文档对象
def getList(since_id=None):
    global page
    while True:
        url = 'https://m.weibo.cn/api/container/getIndex?type=uid&value=6367430139&containerid=1076036367430139&since_id={}'.format(since_id)
        res = s.get(url,headers=headers)
        r = json.loads(res.text)
        since_id = r['data']['cardlistInfo']['since_id']
        list = r['data']['cards']

        for item in list:
            img_url_list = []
            if item['mblog']['isLongText']:
                if item['mblog']['pic_num']>0:
                    img_url_list = [b]item['mblog']['pics']
                getLongText(file,item['mblog']['id'],item['mblog']['created_at'],img_url_list)
            else:
                if item['mblog']['pic_num']>0:
                    img_url_list = item['mblog']['pics']
                txt = item['mblog']['text'].replace('<br />', '\n')
                writeFile(file,item['mblog']['created_at'], txt,img_url_list)
        page = page + 1
        time.sleep(2)
        file.save("wb.docx")

# 获取全文
def getLongText(file,id,date,imglist):
    url = 'https://m.weibo.cn/statuses/extend?id={}'.format(id)
    res = s.get(url)
    try:
        r = json.loads(res.text)
        txt = r['data']['longTextContent'].replace('<br />','\n')
        writeFile(file,date,txt,imglist)
        print(r['data']['longTextContent'])
        print('写入成功,{}'.format(url))
    except:
        print('写入文件出错,跳过···{}'.format(url))
    time.sleep(2)
def fotmatDate(s):
    list = s.split(' ')
    date = '{}-{}-{} {} {}'.format(list[-1], mondict[list[1]], list[2], list[3], weekdict[list[0]])
    return date

def writeFile(file,date,data,imglist):
    # with open('微博mobile.txt','a',encoding='utf-8') as f:
    #     f.write('\n\n')
    #     f.write(fotmatDate(date))
    #     f.write('\n')
    #     f.write(data)

    file.add_heading(fotmatDate(date),level=1)
    para = file.add_paragraph(data)
    run = para.add_run('')
    run.add_break()
    for item in imglist:
        img = s.get(item['large']['url']).content
        with open('img.jpg','wb') as f:
            f.write(img)
            run.add_picture('img.jpg', width=Inches(2))

if __name__ == '__main__':
    getList()

回复几个问题:
1.containerid哪里来的?
微博翻页的方法很多种,可以自己去网页打开F12去network查看
2.数据还没下载完就停了?
这个原因我也不知道,如果后面没有微博就没有since_id 这时候会停止。我下载的时候也是下载到2020年的就停了,或许可以调大sleep周期试试是否触发微博风控

图片

图片

运行信息

运行信息
文件.png
3.png

免费评分

参与人数 13吾爱币 +17 热心值 +9 收起 理由
RoundQAQ + 1 + 1 谢谢@Thanks!
XMQ + 1 用心讨论,共获提升!
hyy_hf52 + 1 谢谢@Thanks!
aero + 1 + 1 鼓励转贴优秀软件安全工具和文档!
hhxx52 + 1 谢谢@Thanks!
laobj + 1 谢谢@Thanks!
LuciusQuinto + 1 + 1 谢谢@Thanks!
omgfengsha + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zsfox + 1 + 1 谢谢@Thanks!
oO梦中梦Oo + 1 热心回复!
q-147483 + 1 + 1 楼主人真的很好,我什么也不会帮我弄了推送 感谢
Tauruslsj + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xglys 发表于 2022-4-14 09:33
,学习一下。
感谢分享
 楼主| 英雄初本涩 发表于 2022-4-14 13:59
# 下面的t是微博的原始时间格式,created_at字段名
t = "Fri Apr 01 00:40:03 +0800 2022"
def fotmatDate(s):
    list = s.split(' ')
    date = '{}-{}-{} {}'.format(list[-1], mondict[list[1]], list[2], list[3])
    return date

def format_to_time_stamp(s):
    t = time.mktime(time.strptime(s, "%Y-%m-%d %H:%M:%S"))
    return t
# 这是要输入的月份
month = '2022-04'
start = '{}-01 00:00:00'.format(month)
end = '{}-30 23:59:59'.format(month)
date = fotmatDate(t)
date_timestamp = format_to_time_stamp(date)
start_timestamp = format_to_time_stamp(start)
end_timestamp = format_to_time_stamp(end)
if date_timestamp >start_timestamp and date_timestamp < end_timestamp:
    print('范围内,写入文件')
    # writeFile(file,date,txt) 写入文件之前判断一下date是否在范围内
chinguy 发表于 2022-4-14 09:06
february 发表于 2022-4-14 09:14
感谢分享源码,正好在学py
kivendeng 发表于 2022-4-14 09:16
这个不错,学习一下。
zzz1233456 发表于 2022-4-14 09:31
感谢分享源码,学习一波
Tauruslsj 发表于 2022-4-14 09:37
学习学习
zqzess 发表于 2022-4-14 09:41
感谢,有一份可以参考的源码
马了顶大 发表于 2022-4-14 09:41
学习一下
我今天是大佬 发表于 2022-4-14 09:43
鸡精股票就等着被割韭菜吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2022-6-28 10:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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