python爬取微博评论的实例讲解


Posted in Python onJanuary 15, 2021

python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手。python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无论是python新入手的小白,还是已经熟练掌握的程序员,可以拿来练手。本文介绍python爬取微博评论的代码实例。

一、爬虫微博

与QQ空间爬虫类似,可以爬取新浪微博用户的个人信息、微博信息、粉丝、关注和评论等。

爬虫抓取微博的速度可以达到 1300万/天 以上,具体要视网络情况。

难度程度排序:网页端>手机端>移动端。微博端就是最好爬的微博端。

二、python爬虫爬取微博评论

第一步:确定评论用户的id

# -*- coding:utf-8 -*-
import requests
import re
import time
import pandas as pd
urls = 'https://m.weibo.cn/api/comments/show?id=4073157046629802&page={}'
headers = {'Cookies':'Your cookies',
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}

第二步:找到html标签

tags = re.compile('</?\w+[^>]*>')

第三步:设置提取评论function

def get_comment(url):
j = requests.get(url, headers=headers).json()
comment_data = j['data']['data']
for data in comment_data:
try:

第四步:利用正则表达式去除文本中的html标签

comment = tags.sub('', data['text']) # 去掉html标签
reply = tags.sub('', data['reply_text'])
weibo_id = data['id']
reply_id = data['reply_id']
comments.append(comment)
comments.append(reply)
ids.append(weibo_id)
ids.append(reply_id)

第五步:爬取评论

df = pd.DataFrame({'ID': ids, '评论': comments})
df = df.drop_duplicates()
df.to_csv('观察者网.csv', index=False, encoding='gb18030')

实例扩展:

# -*- 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 相关文章推荐
python获取外网ip地址的方法总结
Jul 02 Python
python实现Floyd算法
Jan 03 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
Pycharm以root权限运行脚本的方法
Jan 19 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
keras之权重初始化方式
May 21 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
pycharm 复制代码出现空格的解决方式
Jan 15 #Python
pycharm 实现复制一行的快捷键
Jan 15 #Python
pycharm 快速解决python代码冲突的问题
Jan 15 #Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 #Python
Pycharm 解决自动格式化冲突的设置操作
Jan 15 #Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 #Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
Jan 15 #Python
You might like
一个简单php扩展介绍与开发教程
2010/08/19 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
pip install urllib2不能安装的解决方法
2018/06/12 Python
python format 格式化输出方法
2018/07/16 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
简单叙述一下MYSQL的优化
2016/05/09 面试题
会计专业毕业生自荐信范文
2013/12/20 职场文书
单位委托书范本
2014/04/04 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL
Golang连接并操作MySQL
2022/04/14 MySQL