2301_79105264 2023-08-29 11:25 采纳率: 0%
浏览 12

python爬虫数据爬取

微博签到数据爬取,请问一下各位,为什么爬取微博签到页面返回的数据是重复的,而且有时有数据有时没数据?

import requests
import json
import jsonpath
import pprint
import re
import datetime
import csv
datas=[]
for pagenum in range(2,50):
    url='https://m.weibo.cn/api/container/getIndex?containerid=1008087e040aa9cb2ec494b0a4d52c147e682c_-_lbs&lcardid=frompoi&extparam=frompoi&luicode=10000011&lfid=100103type=1&q=广州'
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
    parme={'since_id': pagenum}
    response=requests.get(url=url,headers=headers,params=parme).json()
    for i in range(16):
        id =response['data']['cards'][0]['card_group'][i]['mblog']['user']['id']
        b=response['data']['cards'][0]['card_group'][i]['mblog']['created_at']
        GMT_FORMAT = '%a %b %d %H:%M:%S +0800 %Y'
        timeArray = datetime.datetime.strptime(b, GMT_FORMAT)
        time = timeArray.strftime("%Y-%m-%d %H:%M:%S")
        c=response['data']['cards'][0]['card_group'][i]['mblog']['text']
        d =response['data']['cards'][0]['card_group'][i]['scheme']
        if '全文' in c:
            e = re.findall(r'[^\/][\w]+(?=\?)', d)[0]
            url1 = 'https://m.weibo.cn/statuses/extend?id=' + e
            text = requests.get(url=url1, headers=headers).json()
            content = text['data']['longTextContent']
            address1 = re.findall(r'</span><span class="surl-text">(.+?)</span>', content)
        else:
            content=c
            address1=re.findall(r'</span><span class="surl-text">(.+?)</span>', c)
        datas.append(['id',id, '时间', time, '文本', content,'地点',address1])
with open("paquweiboqiandao.csv", mode='a',errors='ignore') as f:
    csvwriter = csv.writer(f)
    csvwriter.writerows(datas)
python爬虫

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-29 14:31
    关注

    【以下回答由 GPT 生成】

    问题标题: 怎样解决爬取微博签到页面返回的重复数据和时有时无数据的问题?

    问题内容: 我正在使用Python编写一个微博签到数据爬虫程序,但是在爬取微博签到页面时遇到了两个问题:1. 返回的数据出现重复;2. 有时候返回的数据有,有时候没有。请问如何解决这些问题?以下是我的爬虫代码:

    import requests
    import json
    import jsonpath
    import pprint
    import re
    import datetime
    import csv
    
    datas = []
    
    for pagenum in range(2, 50):
        url = 'https://m.weibo.cn/api/container/getIndex?containerid=1008087e040aa9cb2ec494b0a4d52c147e682c_-_lbs&amp;lcardid=frompoi&amp;extparam=frompoi&amp;luicode=10000011&amp;lfid=100103type=1&amp;q=广州'
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
        parme = {'since_id': pagenum}
        response = requests.get(url=url, headers=headers, params=parme).json()
    
        for i in range(16):
            id = response['data']['cards'][0]['card_group'][i]['mblog']['user']['id']
            b = response['data']['cards'][0]['card_group'][i]['mblog']['created_at']
            GMT_FORMAT = '%a %b %d %H:%M:%S +0800 %Y'
            timeArray = datetime.datetime.strptime(b, GMT_FORMAT)
            time = timeArray.strftime("%Y-%m-%d %H:%M:%S")
            c = response['data']['cards'][0]['card_group'][i]['mblog']['text']
            d = response['data']['cards']
    

    请改写以上内容并结合prevent代码,以便ChatGPT可以更好地理解和回答。


    为了解决爬取微博签到页面返回重复数据和时有时无数据的问题,可以采取以下步骤:

    1. 添加一个列表 unique_ids 用于存储已经获取到的微博用户的id,以便后续判断是否重复。
    2. 使用循环遍历每个卡片数据,并在获取微博用户id前进行重复性判断。如果已经存在于 unique_ids 列表中,则跳过当前卡片数据的处理,避免重复数据。
    3. 在获取数据之前,检查返回的卡片数据是否为空。如果数据为空,说明暂时没有数据可供获取,这时可以使用 continue 跳过当前循环,继续下一个页面的爬取。
    4. 将获取到的数据存储到 datas 列表中,以便后续处理或存储。

    改进后的代码示例如下:

    import requests
    import json
    import jsonpath
    import pprint
    import re
    import datetime
    import csv
    
    datas = []
    unique_ids = []
    
    for pagenum in range(2, 50):
        url = 'https://m.weibo.cn/api/container/getIndex?containerid=1008087e040aa9cb2ec494b0a4d52c147e682c_-_lbs&amp;lcardid=frompoi&amp;extparam=frompoi&amp;luicode=10000011&amp;lfid=100103type=1&amp;q=广州'
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
        parme = {'since_id': pagenum}
        response = requests.get(url=url, headers=headers, params=parme).json()
    
        # 检查数据是否为空
        if not response.get('data') or not response['data'].get('cards'):
            continue
    
        for i in range(16):
            card = response['data']['cards'][0]['card_group'][i]['mblog']
    
            # 获取微博用户id,并判断是否重复
            user_id = card['user']['id']
            if user_id in unique_ids:
                continue
    
            b = card['created_at']
            GMT_FORMAT = '%a %b %d %H:%M:%S +0800 %Y'
            timeArray = datetime.datetime.strptime(b, GMT_FORMAT)
            time = timeArray.strftime("%Y-%m-%d %H:%M:%S")
            c = card['text']
            d = response['data']['cards']
    
            # 将数据存储到列表中
            datas.append({
                'user_id': user_id,
                'time': time,
                'text': c
            })
    
            # 将用户id添加到已有列表中,用于去重
            unique_ids.append(user_id)
    
    # 打印获取到的数据
    pprint.pprint(datas)
    

    请注意,上述代码仅解决了重复数据和时有时无数据的问题,如果还有其他需要解决的问题,请提供更多细节,以便我能够更准确地帮助你。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月29日

悬赏问题

  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有