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爬虫

【以下回答由 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)

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



【相关推荐】



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

引用 皆我百晓生 小程序回复内容作答:
微博签到页面返回数据重复且有时有数据有时没有,可能有以下几个原因导致:

  1. 请求参数问题:你使用了参数since_id来指定页面,但是并没有确定起始的since_id值,可能导致重复数据的出现。建议使用其他更加准确的参数来确定请求页面,比如使用时间戳来确定发表时间。

  2. 页面加载机制:微博的页面是动态加载的,可能在你发送请求之后,数据还没有完全加载出来就返回了,导致缺少部分数据。可以使用工具或技术,如Selenium或Scrapy等,来模拟浏览器行为,确保页面完全加载后再进行数据的提取。

  3. 数据筛选问题:在提取数据时,你使用了range(16)来循环遍历16个数据,但是并没有判断返回的数据是否确实有16个,如果实际数据不足16个,则会出现重复数据。建议在提取数据时,先判断返回的数据长度,再进行遍历。

  4. 其他原因:由于没有具体的错误信息和网络环境,还有可能是其他问题导致的。可以在代码中添加异常处理,记录错误信息,帮助查找问题所在。

希望以上提供的建议能帮助解决问题。如果问题仍然存在,请提供更多详细的信息和错误日志,以便进一步分析。