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实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
Python中用sleep()方法操作时间的教程
May 22 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
浅析PHP与Python进行数据交互
May 15 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
Python守护进程实现过程详解
Feb 10 Python
解决python Jupyter不能导入外部包问题
Apr 15 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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
最新的php 文件上传模型,支持多文件上传
2009/08/13 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
Python代码需要缩进吗
2020/07/01 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
毕业证丢失证明
2014/01/15 职场文书
法学院方阵解说词
2014/01/29 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
python实现高效的遗传算法
2021/04/07 Python
整理Python中常用的conda命令操作
2021/06/15 Python