微博签到数据爬取,请问一下各位,为什么爬取微博签到页面返回的数据是重复的,而且有时有数据有时没数据?
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 生成】
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']
请改写以上内容并结合prevent代码,以便ChatGPT可以更好地理解和回答。
为了解决爬取微博签到页面返回重复数据和时有时无数据的问题,可以采取以下步骤:
unique_ids
用于存储已经获取到的微博用户的id,以便后续判断是否重复。unique_ids
列表中,则跳过当前卡片数据的处理,避免重复数据。continue
跳过当前循环,继续下一个页面的爬取。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&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()
# 检查数据是否为空
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)
请注意,上述代码仅解决了重复数据和时有时无数据的问题,如果还有其他需要解决的问题,请提供更多细节,以便我能够更准确地帮助你。
【相关推荐】
引用 皆我百晓生 小程序回复内容作答:
微博签到页面返回数据重复且有时有数据有时没有,可能有以下几个原因导致:
请求参数问题:你使用了参数since_id
来指定页面,但是并没有确定起始的since_id
值,可能导致重复数据的出现。建议使用其他更加准确的参数来确定请求页面,比如使用时间戳来确定发表时间。
页面加载机制:微博的页面是动态加载的,可能在你发送请求之后,数据还没有完全加载出来就返回了,导致缺少部分数据。可以使用工具或技术,如Selenium或Scrapy等,来模拟浏览器行为,确保页面完全加载后再进行数据的提取。
数据筛选问题:在提取数据时,你使用了range(16)
来循环遍历16个数据,但是并没有判断返回的数据是否确实有16个,如果实际数据不足16个,则会出现重复数据。建议在提取数据时,先判断返回的数据长度,再进行遍历。
其他原因:由于没有具体的错误信息和网络环境,还有可能是其他问题导致的。可以在代码中添加异常处理,记录错误信息,帮助查找问题所在。
希望以上提供的建议能帮助解决问题。如果问题仍然存在,请提供更多详细的信息和错误日志,以便进一步分析。