python爬虫爬取微博评论案例详解


Posted in Python onMarch 27, 2019

前几天,杨超越编程大赛火了,大家都在报名参加,而我也是其中的一员。

在我们的项目中,我负责的是数据爬取这块,我主要是把对于杨超越 的每一条评论的相关信息。

数据格式:{"name":评论人姓名,"comment_time":评论时间,"comment_info":评论内容,"comment_url":评论人的主页}

以上就是我们需要的信息。

爬虫前的分析:

python爬虫爬取微博评论案例详解

以上是杨超越的微博主页,这是我们首先需要获取到的内容。

因为我们需要等到这个主页内这些微博详情页 的链接,但是我们向下刷新,会发现微博的主页信息是ajax动态加载出来的,

python爬虫爬取微博评论案例详解

这张图片就是我们向下刷新获取到 的新的链接,这个就是我们需要获取到的信息页面信息。

接下来 就是获取详情页面的信息,详情页中含有评论的相关信息,通过向下刷新,我们也会发现,相关的评论信息也是通过ajax加载出来的 ,

python爬虫爬取微博评论案例详解

ok,以上就是我们针对整个流程大致的一个分析过程。

具体操作流程:

我们首相将主页获取完成以后,我们就会发现,其中 的内容带有相关的反爬措施,获取到的源码中的信息含有很多的转义符“\”,并且其中的相关“<”和“>”是通过html的语言直接编写的,这样会导致我们的页面解析出现一定的问题,我们可以用replace方法直接将这些转义符全部去掉,然后我们就可以对这个页面进行正则处理,同时我也尝试过用其他的解析方法,但是其中遇到了很多 的问题,所以我就不过多的介绍了。

当我们获取到了每一篇微博的链接以后,还需要获取一个很关键的值  id   ,这个值有什么用呢,其主要的作用就是在评论页面的ajax页面的拼接地址上需要使用到。接下来就是需要寻找出我们找到的这两个ajax的url有什么特点或者是规律:

当我们从这些ajax中找到规律以后,不难发现,这个爬虫差不多大功告成了。

下面我就展示一下我的代码:

 注意:请在headers中添加自己的cookie

# -*- coding: utf-8 -*-
# Created : 2018/8/26 18:33
# author :GuoLi
 
import requests
import json
import time
from lxml import etree
import html
import re
from bs4 import BeautifulSoup
 
 
class Weibospider:
  def __init__(self):
    # 获取首页的相关信息:
    self.start_url = 'https://weibo.com/u/5644764907?page=1&is_all=1'
 
    self.headers = {
      "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
      "accept-encoding": "gzip, deflate, br",
      "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
      "cache-control": "max-age=0",
      "cookie": 使用自己本机的cookie,
      "referer": "https://www.weibo.com/u/5644764907?topnav=1&wvr=6&topsug=1",
      "upgrade-insecure-requests": "1",
      "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36",
    }
    self.proxy = {
      'HTTP': 'HTTP://180.125.70.78:9999',
      'HTTP': 'HTTP://117.90.4.230:9999',
      'HTTP': 'HTTP://111.77.196.229:9999',
      'HTTP': 'HTTP://111.177.183.57:9999',
      'HTTP': 'HTTP://123.55.98.146:9999',
    }
 
  def parse_home_url(self, url): # 处理解析首页面的详细信息(不包括两个通过ajax获取到的页面)
    res = requests.get(url, headers=self.headers)
    response = res.content.decode().replace("\\", "")
    # every_url = re.compile('target="_blank" href="(/\d+/\w+\?from=\w+&wvr=6&mod=weibotime)" rel="external nofollow" ', re.S).findall(response)
    every_id = re.compile('name=(\d+)', re.S).findall(response) # 获取次级页面需要的id
    home_url = []
    for id in every_id:
      base_url = 'https://weibo.com/aj/v6/comment/big?ajwvr=6&id={}&from=singleWeiBo'
      url = base_url.format(id)
      home_url.append(url)
    return home_url
 
  def parse_comment_info(self, url): # 爬取直接发表评论的人的相关信息(name,info,time,info_url)
    res = requests.get(url, headers=self.headers)
    response = res.json()
    count = response['data']['count']
    html = etree.HTML(response['data']['html'])
    name = html.xpath("//div[@class='list_li S_line1 clearfix']/div[@class='WB_face W_fl']/a/img/@alt") # 评论人的姓名
    info = html.xpath("//div[@node-type='replywrap']/div[@class='WB_text']/text()") # 评论信息
    info = "".join(info).replace(" ", "").split("\n")
    info.pop(0)
    comment_time = html.xpath("//div[@class='WB_from S_txt2']/text()") # 评论时间
    name_url = html.xpath("//div[@class='WB_face W_fl']/a/@href") # 评论人的url
    name_url = ["https:" + i for i in name_url]
    comment_info_list = []
    for i in range(len(name)):
      item = {}
      item["name"] = name[i] # 存储评论人的网名
      item["comment_info"] = info[i] # 存储评论的信息
      item["comment_time"] = comment_time[i] # 存储评论时间
      item["comment_url"] = name_url[i] # 存储评论人的相关主页
      comment_info_list.append(item)
    return count, comment_info_list
 
  def write_file(self, path_name, content_list):
    for content in content_list:
      with open(path_name, "a", encoding="UTF-8") as f:
        f.write(json.dumps(content, ensure_ascii=False))
        f.write("\n")
 
  def run(self):
    start_url = 'https://weibo.com/u/5644764907?page={}&is_all=1'
    start_ajax_url1 = 'https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100406&is_all=1&page={0}&pagebar=0&pl_name=Pl_Official_MyProfileFeed__20&id=1004065644764907&script_uri=/u/5644764907&pre_page={0}'
    start_ajax_url2 = 'https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100406&is_all=1&page={0}&pagebar=1&pl_name=Pl_Official_MyProfileFeed__20&id=1004065644764907&script_uri=/u/5644764907&pre_page={0}'
    for i in range(12): # 微博共有12页
      home_url = self.parse_home_url(start_url.format(i + 1)) # 获取每一页的微博
      ajax_url1 = self.parse_home_url(start_ajax_url1.format(i + 1)) # ajax加载页面的微博
      ajax_url2 = self.parse_home_url(start_ajax_url2.format(i + 1)) # ajax第二页加载页面的微博
      all_url = home_url + ajax_url1 + ajax_url2
      for j in range(len(all_url)):
        print(all_url[j])
        path_name = "第{}条微博相关评论.txt".format(i * 45 + j + 1)
        all_count, comment_info_list = self.parse_comment_info(all_url[j])
        self.write_file(path_name, comment_info_list)
        for num in range(1, 10000):
          if num * 15 < int(all_count) + 15:
            comment_url = all_url[j] + "&page={}".format(num + 1)
            print(comment_url)
            try:
              count, comment_info_list = self.parse_comment_info(comment_url)
              self.write_file(path_name, comment_info_list)
            except Exception as e:
              print("Error:", e)
              time.sleep(60)
              count, comment_info_list = self.parse_comment_info(comment_url)
              self.write_file(path_name, comment_info_list)
            del count
            time.sleep(0.2)
 
        print("第{}微博信息获取完成!".format(i * 45 + j + 1))
 
 
if __name__ == '__main__':
  weibo = Weibospider()
  weibo.run()
 

以上所述是小编给大家介绍的python爬虫爬取微博评论详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python写的创建文件夹自定义函数mkdir()
Aug 25 Python
浅谈对yield的初步理解
May 29 Python
解决PyCharm中光标变粗的问题
Aug 05 Python
Python3处理HTTP请求的实例
May 10 Python
和孩子一起学习python之变量命名规则
May 27 Python
手写一个python迭代器过程详解
Aug 27 Python
Python传递参数的多种方式(小结)
Sep 18 Python
Python 定义只读属性的实现方式
Mar 05 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
python中sympy库求常微分方程的用法
Apr 28 Python
Python中相见恨晚的技巧
Apr 13 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 #Python
详解python中@的用法
Mar 27 #Python
详解python列表生成式和列表生成式器区别
Mar 27 #Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 #Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
Mar 27 #Python
python模块之subprocess模块级方法的使用
Mar 26 #Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 #Python
You might like
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
PHP类型约束用法示例
2016/09/28 PHP
php文件上传类的分享
2017/07/06 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
python开发之文件操作用法实例
2015/11/13 Python
python交互式图形编程实例(三)
2017/11/17 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
大学生作弊检讨书
2014/02/19 职场文书
实习推荐信
2014/05/10 职场文书
党员读书活动心得体会
2016/01/14 职场文书
SQLServer常见数学函数梳理总结
2022/08/05 MySQL