失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python爬虫新浪微博_python爬虫抓取新浪微博数据

python爬虫新浪微博_python爬虫抓取新浪微博数据

时间:2020-10-12 20:45:21

相关推荐

python爬虫新浪微博_python爬虫抓取新浪微博数据

需求分析

微博主页

抓取的内容包括:微博发布的时间,正文(仅提取文字),转发数,评论数,点赞数

抓取的内容

数据是怎么加载的

新浪微博的数据是用ajax异步下拉加载的,在chrome的调试模式下可捕捉到相应的请求:

xhr请求

分析这些url的规律:

/api/container/getIndex?type=uid&value=1665372775&containerid=1076031665372775&page=2

/api/container/getIndex?type=uid&value=1665372775&containerid=1076031665372775&page=3

发现除了page参数的不同,其他都是一致的

数据的结构分析

json结构分析

返回的json数据结构中,我们需要的是以下字段:

data

cards

mblog

created_at # 发布时间

text # 正文

reposts_count # 转发数

comments_count # 评论数

attitudes_count # 点赞数

代码实现

首先确保安装了requests和pyquery库

pip install pyquery

pip install requests

具体代码解析:

import requests

from urllib.parse import urlencode

from pyquery import PyQuery as pq

host = ''

base_url = 'https://%s/api/container/getIndex?' % host

user_agent = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/0.7.0 MicroMessenger/6.3.9 Language/zh_CN webview/0'

headers = {

'Host': host,

'Referer': '/u/1665372775',

'User-Agent': user_agent

}

# 按页数抓取数据

def get_single_page(page):

params = {

'type': 'uid',

'value': 1665372775,

'containerid': 1076031665372775,

'page': page

}

url = base_url + urlencode(params)

try:

response = requests.get(url, headers=headers)

if response.status_code == 200:

return response.json()

except requests.ConnectionError as e:

print('抓取错误', e.args)

# 解析页面返回的json数据

def parse_page(json):

items = json.get('data').get('cards')

for item in items:

item = item.get('mblog')

if item:

data = {

'id': item.get('id'),

'text': pq(item.get("text")).text(), # 仅提取内容中的文本

'attitudes': item.get('attitudes_count'),

'comments': item.get('comments_count'),

'reposts': item.get('reposts_count')

}

yield data

if __name__ == '__main__':

for page in range(1, 10): # 抓取前十页的数据

json = get_single_page(page)

results = parse_page(json)

for result in results:

print(result)

运行结果

{'id': '4241354777389653', 'text': '【新书预售】\n\n我经常觉得生活就如同唐吉坷德,持一只长矛,去挑战一个个风车。你越是勇敢,你就越是可笑。我们必须正确认识自己,认识自己手里的兵器,也要认清我们要去挑战的是何种存在。\n\n这些风车有爱情,有亲情,有友谊,有远行,有阅读,亦有人性...我把自己跌跌撞撞挑战过的十八个风车,写成了 ...全文', 'attitudes': 646, 'comments': 509, 'reposts': 155}

{'id': '4276572205338096', 'text': '雪橇犬,鸟,鲸鱼,海豹,冰块,人(最后一张)。 格陵兰', 'attitudes': 35, 'comments': 18, 'reposts': 1}

{'id': '4276459473976711', 'text': '北极 微博视频', 'attitudes': 196, 'comments': 39, 'reposts': 12}

{'id': '4276308663690970', 'text': '真好看,魅力十足//@zhj居安:妈呀!太好看了吧!保持的真好,羡慕呀!', 'attitudes': 379, 'comments': 91, 'reposts': 191}

{'id': '4276172055838171', 'text': '在高铁渣男这件事上,我觉得乘警也必须要反思,如果不让座,必须强制执行。如果乘警不作为,个体的乘客如何能解决自己权益收到伤害的情形,难不成都要靠自己的拳头去解决问题?我们有些执法者的问题在于,该有善意的时候心狠,该心狠的时候又充满了没原则的善意。', 'attitudes': 3536, 'comments': 496, 'reposts': 601}

{'id': '4276152610951821', 'text': '恶心至极,不接受那虚伪的道歉,拉入高铁黑名单吧。//@刘力博士://@杨伯溆:太不可思议了//@芮法:唯物史观啊,哪有历史唯物主义史观之说。作者、编辑、刊物都太丢人了//@记录者老K:他还是学法律的 查看图片', 'attitudes': 407, 'comments': 287, 'reposts': 350}

如果觉得《python爬虫新浪微博_python爬虫抓取新浪微博数据》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。