用python3爬取微博的数据和图片 您所在的位置:网站首页 微博照片怎么保存格式 用python3爬取微博的数据和图片

用python3爬取微博的数据和图片

2024-07-05 23:31| 来源: 网络整理| 查看: 265

如何用python爬取微博的数据 这又是我正在学习崔庆才大佬的爬虫文章学习和体会到的啦,,, 正文

当我们浏览微博时,会发现微博网页下面都有下拉下载更多的选项,初始的页面只有几个微博的内容,当我们到最后再向下滑动时此时会出现一个加载的标志,然后会出现新的微博内容,根据Ajax网页的特性可发现这是一个用Ajax方式渲染的网页。整个页面并没有刷新,所以可以明白这是页面在原有的基础上发送Ajax请求数据更新网页的过程。所以我们可以得到一点爬取的思路啦

知道请求是发向哪里的请求包含哪些参数请求是怎么发送的 知道了这些,我们就可以得到包含我们数据的网页啦。然后再解析这些网页数据那一部分是我们想要的,然后直接用.json的解析和正则解析来提取我们想要的数据,话不多直接开整。

这里以作者崔庆才的微博为例(对不住了,我没有微博–)首先进入作者的微博首页,进入XHR选项卡过滤请求,并且选中一个看起来像是加载数据的请求点击去看看。在这里插入图片描述 然后看一下这个请求的url:https://m.weibo.cn/api/container/getIndex?type=uid&value=2830678474&containerid=1005052830678474 根据一点点的英语水平可以发现这就是数据请求的url啊,然后继续下话加载更多的数据,再用一个刚刚刷新出来的请求url比较一下Request URL: https://m.weibo.cn/api/container/getIndex?type=uid&value=2830678474&containerid=1076032830678474&page=2 经过简单的对比可以发现,这个网址请求就是向下加载请求数据的地址,然后发现里面请求的参数有四个 type, value, containerid, page,然后变化的就只有page再根据小学英语分析可得这是一个控制分页的参数,也就是说,我们只要改变这个参数就可以得到新的数据啦。 然后我们分析一下这个请求的响应内容以便得到我们想要的数据,点进去浏览器的 preview 选项,由于Ajax请求到的是json格式的,我们的浏览器为我们做了解析,其中点开data选项,有两个分节点 cardlistinfo饱含着一些当前card内容的标识信息,和一些微博用户的总体信息,然后重要的是 card 里面包含着很多的信息,这里面就有我们要的信息,他是一个列表,包含着十个元素,点开一个观察可以发现里面就是微博的内容,其中比较重要的字段是 mblog 字段,我们要的信息都在这里面。在这里插入图片描述 所以经过上面的分析可得我们只要做一个简单的循环改变requet的 page 的值就可以得到所有的微博数据啦。下面附上代码

from pyquery import PyQuery as pq from urllib.parse import urlencode import requests import json base_url = 'https://m.weibo.cn/api/container/getIndex?' headers = { 'Host': 'm.weibo.cn', 'Referer': 'https://m.weibo.cn/u/2830678474', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', } def get_page(page): params = { 'type': 'uid', 'value': '2830678474', 'containerid': '1076032830678474', '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('error', e.args) def parse_page(json): if json: items = json.get('data').get('cards') for index, item in enumerate(items): ###########为什么要加上 index??????????? index是索引,items是一个字典,取出来的时候要用索引一起 item = item.get('mblog', {}) weibo = {} weibo['id'] = item.get('id') weibo['text'] = pq(item.get('text')).text() weibo['attitudes'] = item.get('attitudes_count') weibo['comments'] = item.get('comments_count') weibo['reposts'] = item.get('reposts_count') yield weibo if __name__ == '__main__': for page in range(1, 10): json = get_page(page) results = parse_page(json) for result in results: print(result)

这里没有包括下载图片的板块,需要的可以在评论下告诉我。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有