python爬虫之使用bs4方法进行数据解析

news/2024/7/19 8:36:24 标签: python, 爬虫, 开发语言

2. 代码实现

python">import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
	# 一、网址分析
    # 对首页的页面数据进行爬取
    # 1. 模拟浏览器
    headers = {
        'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
    }
    # 2. 指定URL
    url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
    # 3. 发起请求
    #【response.content】不会解码,直接以二进制形式返回,常用于文本响应
    #【response.text】会自动根据http头部去推测网页的编码,解码并返回解码后的文本,常用于图片和视频
    # 注意:由于使用【response.text】时,会解码返回,但是解码后的文本与原网页编码不一致,从而导致【中文乱码】
    # 处理【中文乱码】三种方法:
    #(1)修改网页文本的获取方法,直接将response.text改为response.content
    #(2)手动指定文本编码;
    # response = requests.get(url)
    # response.encoding = response.apparent_encoding
    # page_text = response.text
    page_text = requests.get(url=url, headers=headers).content

    # 二、数据解析
    # 在首页中解析出章节的标题和详情页的URL
    # 使用bs4进行数据解析
    # 1. 实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中
    soup = BeautifulSoup(page_text,'lxml')
    # 2. 解析章节标题和详情页的URL
    # 根据select层级选择器,获取li标签中的所有a标签(获取章节标题)
    li_list = soup.select('.book-mulu > ul > li')
    # 持久化存储
    fp = open('./sanguo.txt', 'w', encoding='utf-8')

    # 获取li标签里的a标签
    for li in li_list:
        # 获取章节标题
        # 通过bs4方法直接获取a标签直系文本。string:只可以获取直系文本
        title = li.a.string
        # 对URL进行拼接,获取详情页的URL
        detail_url = 'https://www.shicimingju.com' + li.a['href']
        # 对详情页发起请求
        detail_page_text = requests.get(url=detail_url,headers=headers).content

        # 解析出详情页中相关的章节内容,重新实例化一个详情页bs对象,lxml解析器
        detail_soup = BeautifulSoup(detail_page_text,'lxml')
        # 定位class属性
        div_tag = detail_soup.find('div',class_='chapter_content')
        # 解析到了章节的内容,利用text方法获取
        content = div_tag.text
        # 持久化存储
        fp.write(title+':'+content+'\n')
        print(title,'爬取成功!!!')

http://www.niftyadmin.cn/n/5135449.html

相关文章

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库安装 IndexDB类库引入 localForage测试 新增数据、获取数据 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 大部分场景使用 LocalStore都…

前端打印表格功能+单号生成条形码

第一种打印方法:不需要下载任何插件 浏览器自带打印功能(不太推荐),原理是生成新的页面后被打印,当打印完成或者取消打印时,页面需要强制刷新,否则页面无法回显。 //打印功能 print() {var pr…

Jetpack Compose | State状态管理及界面刷新

我们知道Jetpack Compose(以下简称Compose)中的 UI 可组合项是通过Composable 声明的函数来描述的,如: Composable fun Greeting() {Text(text "init",color Color.Red,modifier Modifier.fillMaxWidth()) }上面的代…

C++设计模式_20_Composite 组合模式

Composite 组合模式和后面谈到的Iterator,Chain of Resposibility都属于“数据结构”模式。Composite 组合模式核心是通过多态的递归调用解耦内部和外部的依赖关系。 文章目录 1. “数据结构”模式1.1 典型模式 2. 动机( Motivation )3. 模式定义4. Composite 组合模…

Java体系性能测试进阶必须了解的知识点——Thread Dump

Thread Dump定义 Java Thread dump记录了线程在jvm中的执行信息,可以看成是线程活动的日志。Java线程转储文件有助于分析应用程序和死锁情况中的瓶颈。Thread Dump是非常有用的诊断Java应用问题的工具。它提供了当前活动线程的快照及JVM中所有Java线程的堆栈跟踪信…

python_PyQt5日周月K线纵向对齐显示_1_数据处理

目录 写在前面: 图形结果显示: 数据设计: 代码: 从日数据中计算周数据、月数据 生成图形显示需要的数据格式 写在前面: “PyQt5日周月K线纵向对齐显示”,将分三篇博文描述 1 数据处理。将数据处理成…

centos做个登录提醒

1.编辑脚本 sudo vim /usr/local/bin/login-notify.sh例如 login-notify.sh #!/bin/bash# 检查是否有一个原始SSH命令,并执行它 if [[ -n "$SSH_ORIGINAL_COMMAND" ]]; thenecho "SSH_ORIGINAL_COMMAND: $SSH_ORIGINAL_COMMAND" >> /va…

当下最火的共享茶室,共享娱乐室带来的经济收益是怎样的?

共享茶室和共享娱乐室是近年来兴起的共享经济产物,它们以方便、快捷、舒适的特点,逐渐受到年轻人的青睐。这些共享空间不仅提供了一个社交的平台,还可以满足用户的娱乐和办公需求。本文将详细介绍共享茶室、共享娱乐室带来的经济收益。 共享…