需求分析

因朋友需求,需要删除在微博上的一些非法转发,故给出链接的根节点,只查询根节点的第一层节点,并删除第一层节点的所有转发。

本人python初学者,有什么写的不好的地方,请指出,与大家一起学习交流。
文章结尾附上完整代码,同时还有详细的说明文档,请自行下载。

  • 前期准备
    安装python3x
    导入requests、bs4等必须的库

导入命令

pip install requests
pip install bs4
  • 网页分析
    需要在简易版微博上爬取
    验证微博登录的cookie
    爬取所有转发的人的id(每个人的id是固定的)和文章号(同一篇文章每个人会生成不同的文章号)

代码分析

  1. 登录cookie存储
    打开网址:https://weibo.cn/pub
    点击登录
    打开调试工具,即按F12,同时调到Network
    输入帐号密码点击登录
    在调试工具中找到weibo.cn,复制cookie

  2. 获取单个页面的所有转发链接

def getComment(url,file):"""获取单个链接页面中的转发连接:param url:评论页面链接:param file: 文件对象"""try:html = requests.get(url, cookies=cook).contentsoup = BeautifulSoup(html, "html.parser")r = soup.findAll('div', attrs={"class": "c"})for e in r:size = 0name = ''uid = ''article = ''for item in e.find_all('a',href=re.compile("/u")):size = size + 1name = item.textuid = item.get('href').split("/")[2];for item in e.find_all('span',attrs={"class":"cc"}):size = size + 1str = item.find('a').get("href").split("/")article = str[2]if size == 2:link = 'https://weibo.com' + '/' + uid + '/' + articletry:file.write(link + '\n')except IOError:print("存入目标文件有误,请重新选择文件")raise IOError("存入目标文件有误,请重新选择文件")except Exception as e:print("**********请求连接失败**********")raise Exception()
  1. 得到一个根节点的所有转发页面链接,即获取共多少页转发(一篇微博可能有几十页的转发量)
def getUrlList(url):"""获取一个根的所有的转发页面链接:param url: 主页面链接:return: 所有评论链接"""form_action = urlurl = comment_page + urlhtml = requests.get(url, cookies=cook).contentsoup = BeautifulSoup(html, "html.parser")list = []form = soup.find("form", attrs={"action": "/repost/" + form_action})a = form.find('a').get('href')b = a[0:len(a)-1] #页面的第一部分c = form.find("div").text.split("/")[1]d = len(c) -1e = c[0:d]for i in range(1,int(e) + 1):list.append(page + b + str(i))return list
  1. main函数

在任意地方创建input.txt,每一行是一个根文章的文章号

input.txt
Fnp688CaA
Fnp688CaA
Fnp688CaA

创建或不创建output.txt都可以指定输出文件名和路径即可


if __name__ == '__main__':use_reading()input_file_name = r"C:\Users\syl\Desktop\input.txt"output_file_name = r"C:\Users\syl\Desktop\output.txt"getTreeComment(input_file_name,output_file_name)

使用文档说明,点这里下载

完整代码如下

# -*- coding: utf-8 -*-
import codecs
import requests
from bs4 import BeautifulSoup
import re
import time
import os
import traceback# ***********基本信息请谨慎更改**********
page = 'https://weibo.cn' # 简易版微博首页地址
main_page = 'https://weibo.com' # 正式版微博首页地址
comment_page = 'https://weibo.cn/repost/' #简易版微博评论页面地址
##请登录帐号查找自己的cookie填入此处
cook = {"Cookie":"请自行更换"} #放入你的cookie信息。
# ***************************************def getUrlList(url):"""获取一个根的所有的转发页面链接:param url: 主页面链接:return: 所有评论链接"""form_action = urlurl = comment_page + urlhtml = requests.get(url, cookies=cook).contentsoup = BeautifulSoup(html, "html.parser")list = []form = soup.find("form", attrs={"action": "/repost/" + form_action})a = form.find('a').get('href')b = a[0:len(a)-1] #页面的第一部分c = form.find("div").text.split("/")[1]d = len(c) -1e = c[0:d]for i in range(1,int(e) + 1):list.append(page + b + str(i))return listdef getComment(url,file):"""获取单个链接页面中的转发连接:param url:评论页面链接:param file: 文件对象"""try:html = requests.get(url, cookies=cook).contentsoup = BeautifulSoup(html, "html.parser")r = soup.findAll('div', attrs={"class": "c"})for e in r:size = 0name = ''uid = ''article = ''for item in e.find_all('a',href=re.compile("/u")):size = size + 1name = item.textuid = item.get('href').split("/")[2];for item in e.find_all('span',attrs={"class":"cc"}):size = size + 1str = item.find('a').get("href").split("/")article = str[2]if size == 2:link = 'https://weibo.com' + '/' + uid + '/' + articletry:file.write(link + '\n')except IOError:print("存入目标文件有误,请重新选择文件")raise IOError("存入目标文件有误,请重新选择文件")except Exception as e:print("**********请求连接失败**********")raise Exception()def getAllComment(list,filename):"""获取一个根节点的所有评论链接:param list: 评论页面集合"""file = codecs.open(filename, "w", "utf-8")for link in list:try:getComment(link, file)except Exception as e:print("**********请重新运行程序**********")breaktime.sleep(1)file.close()def readFile(filename):"""获取根节点:param filename:根节点所在的文件:return: 根节点集合"""list = []if not os.path.isfile(filename):print("*******************文件不存在请检查文件是否存在*******************")raise Exception("*******************文件不存在请检查文件是否存在*******************")returnfile = open(filename)lines = file.readlines()  # 调用文件的 readline()方法for line in lines:if len(line) != 0:a = line.strip()list.append(a)return listdef getTreeComment(input_file_name,output_file_name):"""获取文件中所有连接的转发链接:param input_file_name:读取文件:param output_file_name:输入文件"""start = time.time()print("-----------计时开始-----------")output_file_name = path_change(output_file_name)i = 0tree_list = readFile(input_file_name)for link in tree_list:i = i + 1print("**********************写入第" + str(i) + "个文件,请耐心等待***************************")getAllComment(getUrlList(link),output_file_name + str(i) + '.txt')print("**********************第" + str(i) + "个文件,写入完毕*********************************")total_time = time.time() - startprint(u"-----------总共耗时:%f 秒-----------" % total_time)
def path_change(filename):str = filename[0:len(filename)-4]return str
def use_reading():print("******************************************************************************")print("*                                使用必读                                    *")print("*                                一般来说每写入100个链接大约耗时18s            *")print("*                                如果转发链接大于1w条,请耐心等待            *")print("*                                使用前请耐心阅读使用文档                    *")print("*****************************************************************************")if __name__ == '__main__':use_reading()input_file_name = r"C:\Users\syl\Desktop\main.txt"output_file_name = r"C:\Users\syl\Desktop\douban.txt"getTreeComment(input_file_name,output_file_name)

爬取一条微博的所有转发链接相关推荐

  1. Python 爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?

    作者 | 朱小五 责编 | 屠敏 封图 | CSDN 付费下载自东方 IC 最近又火了一部国产剧:<隐秘的角落>. 如果你没看过,那可能会对朋友圈里大家说的"一起去爬山" ...

  2. Python 爬取 201865 条《隐秘的角落》弹幕数据,发现看剧不如爬山?

    Python 爬取 201865 条<隐秘的角落>弹幕数据,发现看剧不如爬山? 本文不涉及剧透!请放心食用 最近又火了一步国产剧:<隐秘的角落> 如果你没看过,那可能会对朋友圈 ...

  3. scrapy 爬取新浪微博 的微博列表及微博内容

    代码地址:GitHub 参考:博客 通过scrapy框架爬取指定账号的信息和微博 截止到目前(2019年01月15日)的微博账号粉丝排名: 爬取方法:提取网页版的微博接口 1.重写start_requ ...

  4. Pyppeteer爬取移动端微博评论区简单案例

    在简单学习了Pyppeteer之后,就想利用其来实现一个爬取实战来巩固知识,也是为了做点东西,让学的东西不那么空洞. 然后选取了微博评论区进行爬取. 但是在复制网页端的微博的节点的Selector并进 ...

  5. python爬取微博评论并做词频分析_爬取李子柒微博评论并分析

    爬取李子柒微博评论并分析 微博主要分为网页端.手机端和移动端.微博网页版反爬太厉害,因此选择爬取手机端. 1 需求 爬取李子柒微博中视频的评论信息,并做词频分析. 2 方法 2.1 运行环境 运行平台 ...

  6. Python爬取44130条用户观影数据,分析挖掘用户与电影之间的隐藏信息!

    1.前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习 ...

  7. python爬取客流数据_Python爬取南京地铁微博发布客流数据并进行分析

    Python爬取南京地铁微博发布客流数据并进行分析 之前在网上看到了分析北京地铁客流数据的开源项目,就想试着分析一下南京地铁的客流数据,可是找了很久没有找到可以获得南京地铁客流数据的接口,就去南京地铁 ...

  8. Python爬取南京地铁微博发布客流数据并进行分析

    Python爬取南京地铁微博发布客流数据并进行分析 之前在网上看到了分析北京地铁客流数据的开源项目,就想试着分析一下南京地铁的客流数据,可是找了很久没有找到可以获得南京地铁客流数据的接口,就去南京地铁 ...

  9. 爬取李子柒微博评论并分析

    爬取李子柒微博评论并分析 微博主要分为网页端.手机端和移动端.微博网页版反爬太厉害,因此选择爬取手机端. 微博手机端地址:https://m.weibo.cn 1 需求 爬取李子柒微博中视频的评论信息 ...

最新文章

  1. Redis 笔记(08)— 事务(一次执行多条命令、命令 watch/multi/exec/discard、错误处理)
  2. linux检查是否有D进程,Linux内核调试技术——进程D状态死锁检测
  3. c语言 sdk,适用于 C 语言的 Azure IoT 设备 SDK
  4. VASP_INCAR参数及其含义
  5. DSOFramer的类别和安装
  6. android获取键值对,Android应用开发android中的键值对实例讲解
  7. c语言编译器uwp版,哔哩哔哩UWP最新版下载 - 哔哩哔哩UWP版免费版(32位64位win10)安装下载v1.3.10.0 - QT软件园...
  8. 联想 Thinkserver TS250服务器RAID1 重建测试
  9. android投屏小米盒子,Mibox S 小米盒子国际版:可能是 2019 新年最值的原生 AndroidTV...
  10. svm 10折交叉验证 matlab,怎么用10折交叉验证程序?
  11. bscroll.js
  12. 奔图P3305DN安装官网windows驱动 打印乱码解决方法
  13. 如何把word文件转换成PDF格式?
  14. 刻度如果数据比较大的情况下会溢出
  15. lol服务器位置2017,LOL怎么转区 LOL转区方法 LOL转区系统2017最新教程
  16. SpringBoot启动代表出现Process finished with exit code 0
  17. Text-CNN 文本分类
  18. java无参_Java——类的无参、带参方法
  19. 超级全的免费杂志索取汇总~ 希望加精 不收集怎知不容易啊 奉献出来
  20. DL4J中文文档/分布式深度学习/操作指南

热门文章

  1. 网站程序有漏洞用waf可以防护吗?如何防护?
  2. [附源码]计算机毕业设计JAVA汽车租赁管理系统论文
  3. React官方中文文档【安装】
  4. C#---- VS 打包成 exe.
  5. 【问底】徐汉彬:大规模网站架构的缓存机制和几何分形学
  6. mybatis控制台打印日志
  7. 预则立,约则达,车检预约制,车检行业大趋势
  8. js时间戳转换为日期字符串
  9. 【微信小程序】实现广告轮播图
  10. ryzen linux 搭配显卡,R5-1500X配什么显卡?AMD锐龙Ryzen5 1500X搭配显卡推荐