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使用win32com在百度空间插入html元素示例
Feb 20 Python
跟老齐学Python之集成开发环境(IDE)
Sep 12 Python
Python中str.format()详解
Mar 12 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
wxPython实现窗口用图片做背景
Apr 25 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python实现局域网内实时通信代码
Dec 22 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
python 实现德洛内三角剖分的操作
Apr 22 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验证码(支持中文)
2007/02/14 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
Python群发邮件实例代码
2014/01/03 Python
35个Python编程小技巧
2014/04/01 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
python实现简易学生信息管理系统
2020/04/05 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
Python基于execjs运行js过程解析
2020/11/27 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
欧舒丹英国官网:购买欧舒丹护手霜等明星产品
2017/01/17 全球购物
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
项目采购员岗位职责
2014/04/15 职场文书
代理人委托书
2014/09/16 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
科技馆观后感
2015/06/08 职场文书
法律讲堂观后感
2015/06/11 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android