欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 22:13:51
...

如何用python爬取微博的数据

这又是我正在学习崔庆才大佬的爬虫文章学习和体会到的啦,,,

正文

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

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

这里以作者崔庆才的微博为例(对不住了,我没有微博)首先进入作者的微博首页,进入XHR选项卡过滤请求,并且选中一个看起来像是加载数据的请求点击去看看。用python3爬取微博的数据和图片
然后看一下这个请求的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 字段,我们要的信息都在这里面。用python3爬取微博的数据和图片
所以经过上面的分析可得我们只要做一个简单的循环改变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)

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