python使用bs模块爬取小说数据

news/2024/11/28 13:36:57/

目录

一、BS模块介绍        

二、分析页面架构

三、代码实现

四、结果展示

五、总结思路


一、BS模块介绍        

        Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

详细的BS模块介绍(参考网友):

Python中BeautifulSoup库的用法_阎_松的博客-CSDN博客_python beautifulsoup

业务需求:通过BS模块来抓取某小说里面的数据内容

二、分析页面架构

        通过bs模块可以抓取到网站源代码的数据,然后分析抓取网站代码架构。首先可以看到网站每一章的标签都是div class="book-mulu"标签下面,只要搜索到标签值就可以抓到里面数据。

         第二是内容的url是藏在a href标签里面的数据, 每个章节的sanguoyanyi/x.html来代替,x是章节数。通过一个for循环可以把数据赋值到每个列表中,在通过get方法抓取每个url中的内容,刚好每个章节的内容藏在chapter_content的标签下面,用select模块就可以抓到标签下面内容。

 三、代码实现

        每个代码详细功能写在注释里面了,不懂留言沟通。

# -*- coding:UTF-8 -*-
import requests
import json
from bs4 import BeautifulSoup
import cchardet#字符编码格式化模块包
if __name__ == "__main__":#浏览器请求标识符headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}#爬取url的地址url='http://www.shicimingju.com/book/sanguoyanyi.html'#使用requests方法抓取书page_test = requests.get(url=url,headers=headers)#用cchardet的detect方法将content编码化page_test_coding = cchardet.detect(page_test.content)['encoding']#print(page_test.content.decode(page_test_coding))#给一个变量赋值到抓取下来的内容new_page_test = page_test.content.decode(page_test_coding)#使用bs模块的lxml方法进行解析soup = BeautifulSoup(new_page_test,'lxml')# print(soup)#用select方法搜索book-mulu标签下ul标签下li标签li_list= soup.select('.book-mulu > ul > li')#新建对象保存fp = open('./sanguo.txt','w',encoding='utf-8')for li in li_list:#标题用string字符串保存title = li.a.string#内容方面的urldetail_url = 'http://www.shicimingju.com'+li.a['href']#继续抓取内容url的赋值detai_page_text = requests.get(url=detail_url,headers=headers).content#创建对象,括号中的参数是html文档(可以打开外部存储html文档的文件BeautifulSoup(open("index.html")),或者直接使用当前文件中的html字符串对象)和解析器名称detail_soup = BeautifulSoup(detai_page_text,'lxml')#查找标签chapter_content的内容div_tag = detail_soup.find('div',class_='chapter_content')#将内容使用text方法赋予新对象content = div_tag.text#写入文本中title和content加换行符fp.write(title+':'+content+'\n')#打印爬取结果print(title,'爬取成功!')

四、结果展示

        编译结果显示正常,每个章节都抓取到了数据。

 查看保存的text文档

​​​​​​​

 五、总结思路

        requests抓取下来的数据是有带.content或者.text标签的数据,尝试了很多用.text标签抓下来的数据是乱码。后面怎么用utf-8格式变通都不行,原来response.text这个是str的数据(unicode),是requests库将response.content进行解码后的字符串。(而我们在解码的时候需要指定一个编码方式,requests在进行自动解码的时候需要猜测编码的方式,所以避免不了判断失误,就会导致解码产生乱码.)后面用content就可以行的通了。为了以防万一,使用cchardet模块来解决编码问题。Python requests乱码的五种解决办法_小龙在山东的博客-CSDN博客_python requests 乱码)

参考文献:

Python中BeautifulSoup库的用法_阎_松的博客-CSDN博客_python beautifulsoup

requests.text和requests.content的区别_、Lu的博客-CSDN博客_requests.text

Python requests乱码的五种解决办法_小龙在山东的博客-CSDN博客_python requests 乱码


http://www.ppmy.cn/news/3395.html

相关文章

[附源码]计算机毕业设计的云网盘设计Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

技术分享 | 做为测试,那些必须掌握的测试技术体系

软件测试技术是软件开发过程中的一个重要组成部分,是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程。其目的是尽快尽早地发现在软件产品中所存在的各种问题,与用户需求、预先定义的不一致性。检…

2022,itbird的年终总结报告

最近公司要求个人在做年终总结了,趁着这个机会,也想对自己的2022年进行一下回顾总结,最重要的是,对2023的目标,可以有一个指引。 就从工作和生活两方面来讲吧。 1.工作 1.1 行业的状态 本人从事的是android开发工作…

树上操作【点分治】 - 原理 中心分解 【POJ No. 1741】 树上两点之间的路径数 Tree

树上操作【点分治】 - 原理 中心分解 分治法指将规模较大的问题分解为规模较小的子问题,解决各个子问题后合并得到原问题的答案。树上的分治算法分为点分治和边分治。 点分治经常用于带权树上的路径统计,本质上是一种带优化的暴力算法,并融…

【java】乐观锁和悲观锁、CAS和ABA问题

一、乐观锁VS悲观锁 1)关于悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,Java中synchronized和ReentrantLock以及Read-write locks等就是悲观锁思想的实现。 2)关于…

1.专题 存储结构和逻辑结构

1. 存储结构 软件完成对象抽象,需要分配一定的内存资源。 根据对象对内存使用的特征,可以把数据存储的特征划分为: 顺序存储链接存储索引存储 和 散列存储 1.1 顺序存储 对象占用的资源表现为一段连续的内存存储 图示如下: M…

2022职场人状态和顺风出行感受调研报告

2022年即将过去,作为职场人的你会如何总结?职场同路人又有哪些想对彼此说的话?近日,嘀嗒出行发布《2022职场人状态和顺风出行感受调研报告》,基于近8000名嘀嗒顺风车车主和乘客分享各自职场经历和顺风出行感受&#xf…

Typescript - - 高级用法

Typescript - - 高级用法 extends extends 关键字在TS中的两种用法,即接口继承和条件判断。 接口继承 interface T1 {name: string}interface T2 {sex: number}// 多重继承,逗号隔开interface T3 extends T1,T2 {age: number}// 合法const t3: T3 {nam…