Python实现爬取马云的微博功能示例


Posted in Python onFebruary 16, 2019

本文实例讲述了Python实现爬取马云的微博功能。分享给大家供大家参考,具体如下:

分析请求

我们打开 Ajax 的 XHR 过滤器,然后一直滑动页面加载新的微博内容,可以看到会不断有Ajax请求发出。

我们选定其中一个请求来分析一下它的参数信息,点击该请求进入详情页面,如图所示:

Python实现爬取马云的微博功能示例

可以发现这是一个 GET 请求,请求的参数有 6 个:display、retcode、type、value、containerid 和 page,观察这些请求可以发现只有 page 在变化,很明显 page 是用来控制分页的。

分析响应

如图所示:

Python实现爬取马云的微博功能示例

它是一个 Json 格式,浏览器开发者工具自动为做了解析方便我们查看,可以看到最关键的两部分信息就是 cardlistInfo 和 cards,将二者展开,cardlistInfo 里面包含了一个比较重要的信息就是 total,经过观察后发现其实它是微博的总数量,我们可以根据这个数字来估算出分页的数目。

Python实现爬取马云的微博功能示例

发现它又有一个比较重要的字段,叫做 mblog,继续把它展开,发现它包含的正是微博的一些信息。比如 attitudes_count 赞数目、comments_count 评论数目、reposts_count 转发数目、created_at 发布时间、text 微博正文等等,得来全不费功夫,而且都是一些格式化的内容,所以我们提取信息也更加方便了。

这样我们可以请求一个接口就得到 10 条微博,而且请求的时候只需要改变 page 参数即可。这样我们只需要简单做一个循环就可以获取到所有的微博了。

实战演练

在这里我们就开始用程序来模拟这些 Ajax 请求,将马云的所有微博全部爬取下来。

首先我们定义一个方法,来获取每次请求的结果,在请求时page 是一个可变参数,所以我们将它作为方法的参数传递进来,代码如下:

from urllib.parse import urlencode
import requests
base_url = 'https://m.weibo.cn/api/container/getIndex?'
headers = {
  'Host': 'm.weibo.cn',
  'Referer': 'https://m.weibo.cn/u/2145291155',
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
  'X-Requested-With': 'XMLHttpRequest',
}
def get_page(page):
  params = {
    'display': '0',
    'retcode': '6102',
    'type': 'uid',
    'value': '2145291155',
    'containerid': '1076032145291155',
    '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)

首先在这里我们定义了一个 base_url 来表示请求的 URL 的前半部分,接下来构造了一个参数字典,其中 display、retcode、 type、value、containerid 是固定的参数,只有 page 是可变参数,接下来我们调用了 urlencode() 方法将参数转化为 URL 的 GET请求参数,即类似于display=0&retcode=6102&type=uid&value=2145291155&containerid=1076032145291155&page=2 这样的形式,随后 base_url 与参数拼合形成一个新的 URL,然后我们用 Requests 请求这个链接,加入 headers 参数,然后判断响应的状态码,如果是200,则直接调用 json() 方法将内容解析为 Json 返回,否则不返回任何信息,如果出现异常则捕获并输出其异常信息。

随后我们需要定义一个解析方法,用来从结果中提取我们想要的信息,比如我们这次想保存微博的 正文、赞数、评论数、转发数这几个内容,那可以先将 cards 遍历,然后获取 mblog 中的各个信息,赋值为一个新的字典返回即可。

from pyquery import PyQuery as pq
def parse_page(json):
  if json:
    items = json.get('cards')
    for item in items:
      item = item.get('mblog')
      weibo = {}
      weibo['微博内容:'] = pq(item.get('text')).text()
      weibo['转发数'] = item.get('attitudes_count')
      weibo['评论数'] = item.get('comments_count')
      weibo['点赞数'] = item.get('reposts_count')
      yield weibo

在这里我们借助于 PyQuery 将正文中的 HTML 标签去除掉。

最后我们遍历一下 page,将提取到的结果打印输出即可。

if __name__ == '__main__':
  for page in range(1, 50):
    json = get_page(page)
    results = parse_page(json)
    for result in results:
      print(result)

另外我们还可以加一个方法将结果保存到 本地 TXT 文件中。

def save_to_txt(result):
  with open('马云的微博.txt', 'a', encoding='utf-8') as file:
    file.write(str(result) + '\n')

代码整理

import requests
from urllib.parse import urlencode
from pyquery import PyQuery as pq
base_url = 'https://m.weibo.cn/api/container/getIndex?'
headers = {
  'Host': 'm.weibo.cn',
  'Referer': 'https://m.weibo.cn/u/2145291155',
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
  'X-Requested-With': 'XMLHttpRequest',
}
max_page = 50
def get_page(page):
  params = {
    'display': '0',
    'retcode': '6102',
    'type': 'uid',
    'value': '2145291155',
    'containerid': '1076032145291155',
    'page': page
  }
  url = base_url + urlencode(params)
  try:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
      return response.json(), page
  except requests.ConnectionError as e:
    print('Error', e.args)
def parse_page(json, page: int):
  if json:
    items = json.get('data').get('cards')
    for index, item in enumerate(items):
      if page == 1 and index == 1:
        continue
      else:
        item = item.get('mblog')
        weibo = {}
        weibo['微博内容:'] = pq(item.get('text')).text()
        weibo['转发数:'] = item.get('attitudes_count')
        weibo['评论数:'] = item.get('comments_count')
        weibo['点赞数:'] = item.get('reposts_count')
        yield weibo
def save_to_txt(result):
  with open('马云的微博.txt', 'a', encoding='utf-8') as file:
    file.write(str(result) + '\n')
if __name__ == '__main__':
  for page in range(1, max_page + 1):
    json = get_page(page)
    results = parse_page(*json)
    for result in results:
      print(result)
      save_to_txt(result)

最后结果为:

{'微博内容:': '公安部儿童失踪信息紧急发布平台,现在有了阶段性成果。上线两年时间,发布3053名儿童失踪信息,找回儿童2980名,找回率97.6%……失踪儿童信息会触达到几乎每一个有手机的用户,这对拐卖儿童的犯罪分子更是巨大的震慑!\n为找回孩子的家长欣慰,为这个“互联网+打拐”平台的创建而感动,也 ...全文', '转发数:': 82727, '评论数:': 9756, '点赞数:': 18091}
{'微博内容:': '#马云乡村教师奖#说个喜事:马云乡村教师奖的获奖老师丁茂洲,元旦新婚,新娘也是一名教师。丁老师坦白,他是2015年得了乡村教师奖以后,才被现在的女朋友给“瞄上的”。其实马云乡村教师奖,不光女朋友喜欢,重要的是丈母娘也喜欢!\n丁老师的学校,陕西安康市三星小学,在一个贫困 ...全文', '转发数:': 37030, '评论数:': 8176, '点赞数:': 3931}
{'微博内容:': '双十一结束了,想对300万快递员、对所有物流合作伙伴说声谢谢!你们创造了世界商业的奇迹!双十一的三天里产生了10亿多个包裹,菜鸟网络用了一周的时间送完,抵达世界各个角落,这是世界货运业的奇迹,更是商业世界协同合作的奇迹。10年前,我们不敢想象中国快递 ...全文', '转发数:': 85224, '评论数:': 21615, '点赞数:': 5044}
{'微博内容:': '今晚11.11,准备好了吗?注意休息,开心快乐。姑娘们,今晚是你们的节日。男人们,反正钱是用来花的,花钱不心疼的日子只有今天!', '转发数:': 76803, '评论数:': 22068, '点赞数:': 4773}

本文参考崔庆才的《python3 网络爬虫开发实战》。

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
简单学习Python多进程Multiprocessing
Aug 29 Python
浅谈Python中的私有变量
Feb 28 Python
Python callable()函数用法实例分析
Mar 17 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
如何清空python的变量
Jul 05 Python
对Python3 * 和 ** 运算符详解
Feb 16 #Python
Python docx库用法示例分析
Feb 16 #Python
Python中整数的缓存机制讲解
Feb 16 #Python
Python实现的爬取百度文库功能示例
Feb 16 #Python
对Python3 序列解包详解
Feb 16 #Python
对Python3 pyc 文件的使用详解
Feb 16 #Python
Python父目录、子目录的相互调用方法
Feb 16 #Python
You might like
一个简单php扩展介绍与开发教程
2010/08/19 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
详解python3中zipfile模块用法
2018/06/18 Python
3分钟学会一个Python小技巧
2018/11/23 Python
python游戏地图最短路径求解
2019/01/16 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python爬虫之遍历单个域名
2019/11/20 Python
python中加背景音乐如何操作
2020/07/19 Python
python两种注释用法的示例
2020/10/09 Python
详解pandas映射与数据转换
2021/01/22 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
销售自我评价
2013/10/22 职场文书
大学毕业后的十年规划
2014/01/07 职场文书
办理退休介绍信
2014/01/09 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
见习报告的格式
2014/10/31 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers