爬虫之爬取百度贴吧

2023-05-16

爬虫之爬取百度贴吧

直接示例代码:

import requests
# from lxml import html
# etree = html.etree
from lxml import etree
class Tieba(object):
    def __init__(self, name):
        self.url = f'https://tieba.baidu.com/f?kw={name}'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
            # 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) '     #  低端浏览器没有被<!--  -->注释掉
        }

    def get_data(self, url):
        response = requests.get(url, headers=self.headers)
        #  把浏览器响应的内容保存到本地,以便查看响应的源码
        # with open('tieba.html', 'wb') as f:
        #     f.write(response.content)
        return response.content

    def parse_data(self, data):
        #  创建element对象
        data = data.decode().replace("<!--", "").replace("-->", "")   #  高端浏览器会把一些内容给注释掉的
        el_html = etree.HTML(data)
        el_list = el_html.xpath('//*[@id="thread_list"]/li/div/div[2]/div[1]/div[1]/a')  #  此处输出的是对象
        print(len(el_list))
        data_list = []
        for el in el_list:
            tmp = {}
            tmp['title'] = el.xpath('./text()')[0]    #  此处xpath取出的数据是列表,所以加上索引[0]
            tmp['href'] = 'http://tieba.com' + el.xpath('./@href')[0]      #  此处取出的索引是相对路径,所以前面还要拼接字符串
            data_list.append(tmp)
        print(data_list)
        try:
            # next_url = 'https' + el_html.xpath('//a[@class="next pagination-item "]/@href')
            next_url = 'https:' + el_html.xpath('//a[contains(text(),"下一页")]/@href')[0]
        except:
            next_url = None
        return data_list, next_url

    def save_data(self, data_list):
        for data in data_list:
            print(data)

    def run(self):
        #  url
        #  headers
        next_url = self.url
        while True:
            #  发送请求,获取响应
            data = self.get_data(next_url)
            #  从响应中提取数据(数据和翻页用的url)
            data_list, next_url = self.parse_data(data)
            self.save_data(data_list)
            #  判断是否终结
            if next_url == None:
                break


if __name__ == '__main__':
    tieba = Tieba('上海大学')
    tieba.run()

运行效果:

难点部分分析截图:

 将在百度贴吧爬取的数据爬取下来并写进csv文件中。

示例代码:

import requests
# from lxml import html
# etree = html.etree
import csv
from lxml import etree


class Tieba(object):

    def __init__(self, name):
        self.url = f'https://tieba.baidu.com/f?kw={name}'
        self.headers = {
            # 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
            'User-Agent': '/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
            # 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) '     #  低端浏览器没有被<!--  -->注释掉
        }
        self.f = open('上海理工大学吧.csv', 'w', encoding='utf-8-sig', newline="")
        self.csv_write = csv.writer(self.f)

    def get_data(self, url):
        response = requests.get(url, headers=self.headers)
        #  把浏览器响应的内容保存到本地,以便查看响应的源码
        # with open('tieba.html', 'wb') as f:
        #     f.write(response.content)
        return response.content

    def parse_data(self, data):
        #  创建element对象
        data = data.decode().replace("<!--", "").replace("-->", "")  # 高端浏览器会把一些内容给注释掉的
        el_html = etree.HTML(data)
        # el_list = el_html.xpath('//*[@id="thread_list"]/li/div/div[2]/div[1]/div[1]/a')  #  此处输出的是对象
        el_list = el_html.xpath('//*[@id="thread_list"]/li/div')  # 此处输出的是对象
        print(len(el_list))
        # exit()
        data_list = []
        for el in el_list:
            tmp = {}
            tmp['title'] = el.xpath('./div[2]/div[1]/div[1]/a/text()')[0]  # 此处xpath取出的数据是列表,所以加上索引[0]
            tmp['href'] = 'http://tieba.com' + el.xpath('./div[2]/div[1]/div[1]/a/@href')[0]  # 此处取出的索引是相对路径,所以前面还要拼接字符串
            try:
                tmp['author'] = el.xpath('./div[2]/div[1]/div[2]/span[1]/span[1]/a/text()')[0]
            except:
                tmp['author'] = el.xpath('./div[2]/div[1]/div[2]/span[1]/span[1]/a/text()')
            try:
                tmp['reviewer'] = el.xpath('./div[2]/div[2]/div[2]/span[1]/a/text()')[0]
            except:
                tmp['reviewer'] = el.xpath('./div[2]/div[2]/div[2]/span[1]/a/text()')
            try:
                tmp['last_comment_time'] = el.xpath('./div[2]/div[2]/div[2]/span[2]/text()')[0]
            except:
                tmp['last_comment_time'] = el.xpath('./div[2]/div[2]/div[2]/span[2]/text()')
            try:
                tmp['comment'] = el.xpath('./div[2]/div[2]/div[1]/div/text()')[0]
            except:
                tmp['comment'] = el.xpath('./div[2]/div[2]/div[1]/div/text()')
            data_list.append(tmp)
        # print(data_list)

        #  获取csv他属性值
        a = []
        dict = data_list[0]
        for headers in sorted(dict.keys()):  # 把字典的键取出来
            a.append(headers)
        header = a  # 把列名给提取出来,用列表形式呈现
        print(a)
        self.csv_write.writerow(['title', 'href', 'author', 'reviewer', 'last_comment_time', 'comment'])
        # self.csv_write.writerow(a)

        try:
            # next_url = 'https' + el_html.xpath('//a[@class="next pagination-item "]/@href')
            next_url = 'https:' + el_html.xpath('//a[contains(text(),"下一页")]/@href')[0]
        except:
            next_url = None
        return data_list, next_url, header

    def save_data(self, data_list, header):

        for data in data_list:
            print(data)
            try:
                data['last_comment_time'] = data['last_comment_time'].replace('\r', '').replace('\n', '').strip()
                data['comment'] = data['comment'].strip().replace('\r', '').replace('\n', '')
            except:
                print('list')
            self.csv_write.writerow(
                [data['title'], data['href'], data['author'], data['reviewer'], data['last_comment_time'],
                 data['comment']])

    def run(self):
        #  url
        #  headers
        next_url = self.url
        while True:
            #  发送请求,获取响应
            data = self.get_data(next_url)
            #  从响应中提取数据(数据和翻页用的url)
            data_list, next_url, a = self.parse_data(data)
            self.save_data(data_list, a)
            #  判断是否终结
            if next_url == None:
                break


if __name__ == '__main__':
    tieba = Tieba('上海理工大学')
    tieba.run()

运行效果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫之爬取百度贴吧 的相关文章

  • STM8S电源管理-重点活跃停机模式

    http blog sina com cn s blog 542bad910101qkru html
  • 多态的定义

    多态是什么 xff1f 多态 polymorphism 是面向对象编程 OOP object oriented programming 的一个重要特征 xff0c 顾名思义为多种形态 xff0c 详细解释为一个接口 xff0c 多种实现 x
  • 虚函数实现多态的原理

    1 C 43 43 中如何实现多态 基类中先声明一个虚函数至少有一个继承该基类的子类 2 虚函数实现多态的原理 当一个类中出现虚函数或着子类继承了虚函数时 xff0c 就会在该类中产生一个虚函数表 xff08 virtual table x
  • 停车场车牌识别项目

    停车场车牌识别项目 简介开发环境技术栈1 Sqlite2 TTS3 摄像头使用教程 实现效果图源码 简介 该项目的应用场景为停车场 xff0c 记录车辆的进出时间 xff0c 对车辆进行收费 开发环境 Windows 下的 QT 技术栈 Q
  • STM32串口输出字符串

    目录 串口步骤1 确定 IO 口并初始化2 初始化 UATR3 UART 中断配置4 编写 UART 中断服务函数5 1 方法一 xff1a 重定向 fputc 5 2 方法二 xff1a 将字符串分割成一个一个字符发送出去 效果附源码 串
  • 常用Linux命令

    目录 Shell常用Shell命令1 目录操作类2 文本操作类3 用户管理4 文件权限类5 磁盘管理类6 网络操作类7 控制终端类8 开关机类 Shell小技巧 Shell shell是一个应用程序 xff0c 作为用户与内核信息传递的桥梁
  • VSCode与Keil联合开发STM32

    目录 1 为什么要联合开发2 配置VSCode的环境1 安装c c 43 43 2 安装Embedded IDE3 设置编译工具4 导入 STM32 工程5 配置编译器选项6 烧录工具选择 3 附 1 为什么要联合开发 Keil容易出现中文
  • 8.类的继承

    目录 1 继承的定义2 继承的作用3 继承的语法4 类继承成员属性的访问权限5 利用参数列表 xff0c 初始化父类的私有成员6 继承中的构造函数与析构函数7 总结共继承的权限问题8 类中的隐藏问题9 类中的多继承10 类中多级继承11 菱
  • 14.数据成员属性

    目录 1 静态属性 xff1a 2 类中的静态成员 xff1a 3 类中的静态函数 xff1a 4 类中的const成员5 类中的常量成员6 类中的常量函数 xff1a 7 常量对象 xff1a 1 静态属性 xff1a 回顾C语言的静态变
  • 15.异常处理

    目录 1 为什么需要异常处理 xff1f 2 在c 43 43 中异常处理的方法 xff1f xff1f 3 异常的抛出4 异常的类型捕捉5 系统预定义的异常类型6 异常的再抛出 1 为什么需要异常处理 xff1f 用 new 运算符动态分
  • 我的创作纪念日

    一周年纪念
  • SD卡无法格式化怎么办的解决方法

    SD卡无法格式化怎么办的解决方法 http www upantool com jiaocheng neicunka 5399 html 每次SD卡受损都要格卡的朋友 xff0c 一大堆游戏 相片 视频 xff0c 还有导航地图要重新上传 x
  • cmake --Cannot specify link libraries for target" XX" which is not built by this project.

    cmake Cannot specify link libraries for target 34 XX 34 which is not built by this project 原CMakeLists txt内容 xff1a find
  • cmake & CMakeLists.txt

    文章目录 前言先从体验开始1 一个最简单的例子 xff1a 2 例子升级 xff0c 将hello c生成为一个库 xff1a 3 例子升级 xff0c 将源代码和库分开放 xff1a 4 让可执行文件在 bin 目录 xff0c 库文件在
  • 配置Jetson XAVIER NX串口通信,不使用union传递浮点数

    下载minicom span class token function sudo span span class token function apt get span span class token function install s
  • C语言实现大写字母与小写字母之间的互转

    思路 咋一看 xff0c 好像没什么思路 其实我们只需要知道ASCII值就行 xff0c 65和97这两个数字作为程序员必须牢记于心 xff0c 因为这两个数字分别是ASCII表中字母 a 和 A 的十进制值 xff01 xff01 xff
  • 实时显示电脑当前网速和CPU利用率等信息 && 设置软件开机自启动

    相信不少朋友在平时看实时网速时 xff0c 用的都是360那个悬浮窗 xff0c 或者其它杀毒软件提供的 而今天就介绍一款绿 xff08 逼 xff09 色 xff08 格 xff09 更高的用于显示当前网速 CPU及内存利用率的桌面悬浮窗
  • Win10只能安装GPT磁盘的解决办法

    最近帮同事重装系统时 xff0c 遇到了之前没遇到过的问题 无论是微软官方的U盘制作工具还是MSDN下载的镜像加上rufus都无法解决的问题 xff0c 那就是在选择安装磁盘时会提示无法安装 xff0c 点击错误详细会出现下面的提示框 xf
  • C语言中常用运算符

    C语言中常用到的运算符主要有算数运算符 逻辑运算符 位运算发 关系运算符和其它的 一 算数运算符 主要是我们在数学运算中使用的一些加减乘除运算符 xff0c 但是有几个运算符与我们数学中的不 太一样 xff08 以下会说明 xff09 xf
  • 如何下载Ubuntu 20.04并运行在VM虚拟机上

    第一步 下载Ubuntu镜像文件 下载Ubuntu的镜像 xff0c 我们首先想到的就是去官网下载 xff0c 但是由于服务器在国外 xff0c 下载速度可能只有几KB S 甚至压根就下载不了 其实我们有更好的选择 那就是选择我们国内的一些

随机推荐

  • Unbutntu18.04 caffe在make编译时出现对‘cv::imread(cv::String const&, int)’未定义的引用 解决方案

    在CAFFE编译时会出现如下错误 xff1a CXX LD o build release tools caffe bin build release lib libcaffe so xff1a 对 cv imread cv String
  • yolov5返回坐标

    yolov5返回坐标 yolov5目前已更新到v6版 xff0c 上面up主的文章是以前的版本 xff0c 代码对应不上 xff0c 所以特地在此更新一下 xff1a 参考链接 xff1a https blog csdn net weixi
  • ISD9160学习笔记02_搭建NuMicro开发环境

    http blog csdn net iotisan article details 53166357 所谓学习笔记 xff0c 不能免俗地总会讲到开发环境 嵌入式这一行就是这样 xff0c 每做一个新方案 xff0c 就得学习它的CPU
  • RS232不能通信的问题

    RS232不能通信 xff0c 根据PCB图检查了硬件电路是否导通 xff0c 短路状态使用串口工具发送消息收到消息可以收发 xff0c 编程方面大概率无误 由原理图可见 xff0c 地 TXD和RXD设计错误 xff0c 没有反着接 用杜
  • NRF24L01+实现一对一数据双向传输

    NRF24L01 43 实现一对一数据双向传输 目录说明带负载数据ACK的双向通信配置NRF24L01 43 的收发程序收发双方数据的处理测试代码和结果 目录 说明 最近在diy四轴飞行器的时候 xff0c 需要实现四轴和遥控器之间的双向通
  • RT-Thread开启串口.中断和DMA接收(手把手教学)

    1 串口介绍 串口是指数据一位一位地顺序传送 xff0c 其特点是通讯线路简单 xff0c 只要一对传输线就可以实现双向通信 xff08 可以直接利用电话线作为传输线 xff09 xff0c 从而大大降低了成本 xff0c 特别适用于远距离
  • stm32使用MPU6050读取温度值验证I2C

    通过MPU6050测温来进行I2C的验证学习 关于MPU6050寄存器相关可以参考https blog csdn net he yuan article details 76559569 I2C时序很多 xff0c 我是直接以原子I2C的程
  • String的长度限制

    String的长度 是有限制的 String存储 String其实是使用的一个char类型的数组来存储字符串中的字符的 看看字符串返回长度的方法 返回值类型是int类型 其长度最大限制为2 31 1 xff0c 那么说明了数组的长度是0 2
  • 通过isapi协议抓拍图片

    PC端通过isapi协议抓拍摄像头图片 说明 xff1a 1 isapi协议类似于http协议 2 通过isapi协议抓拍图片要经过这几个步骤 2 1 先创建socket xff0c 再连接服务器 xff08 也就是摄像机 xff09 co
  • yolo|使输出的结果txt含目标的四个坐标信息及类别置信度

    最近参加的智能船舶挑战赛对结果的格式要求 xff1a 包含目标边界框从左上角开始的顺时针标注点坐标 xff0c 目标类别以及目标类别分数 xff0c 并用空格分开 如下图所示 xff1a 故对yolov5的detect py进行修改 xff
  • 平台开发——安装海康摄像头(2402系列球机)并实现对其RTSP的推流

    本次购入了一台海康2402系列球机 xff08 DS 2DC2402IW D3 W xff09 xff0c 对设备进行了激活 设置及简要操作 xff0c 在服务器上对其进行了推流 购买摄像头 本次购买了海康威视DS 2DC2402IW D3
  • TIPS:Ubuntu 系统python版本切换

    1 查看 xff08 1 xff09 查看系统中存在的python版本 xff1a ls usr bin python xff08 2 xff09 查看系统默认版本 xff1a python version 2 修改 xff08 1 xff
  • 报错:CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘.

    新安装anaconda xff0c 输入 conda activate 报错 终端输入 xff1a source activate source deactivate conda activate
  • Windows下C++调用Http接口

    1 WininetHttp h span class token macro property span class token directive keyword pragma span once span span class toke
  • ubuntu系统 PyImport_ImportModule 返回 NULL

    原因 xff1a 1 python文件出错 2 python文件路径出错 在PyImport ImportModule命令前添加语句 PyRun SimpleString 34 import sys 34 PyRun SimpleStrin
  • ModuleNotFoundError:No module named

    经典报错 xff1a ModuleNotFoundError No module named XXX 但通过conda list 可以发现相关第三方包 在程序中添加路径 import sys sys path append 39 三方包路径
  • Iterator迭代器

    1 迭代器的概述 迭代器 是一种通用的遍历集合 取出集合中元素的方式 迭代器由来 集合有很多种 每种集合的数据结构是不同的 数组 链表 哈希表 集合取出元素的方式也不同 我们不可能为每种集合都定义一种取出元素的方式 浪费 所以我们就可以使用
  • strcat函数将两个字符串拼接在一起

    span class token macro property span class token directive keyword include span span class token string 34 pch h 34 span
  • 4、C语言结构体使用---链表

    结构体 1 掌握结构体的概念和用法 2 掌握结构体数组和结构体指针 3 掌握包含结构体的结构体 4 掌握结构体搭建链表方法 5 掌握结构体及链表在产品应用场景 结构体的概念 比如说学生的信息 xff0c 包含了学生名称 学号 性别 年龄等信
  • 爬虫之爬取百度贴吧

    爬虫之爬取百度贴吧 直接示例代码 xff1a import requests from lxml import html etree 61 html etree from lxml import etree class Tieba obje