Python爬取365好书中小说代码实例


Posted in Python onFebruary 28, 2020

要转载的小伙伴转载后请注明转载的地址

需要用到的库

  • from bs4 import BeautifulSoup
  • import requests
  • import time

365好书链接:http://www.365haoshu.com/ 爬取《我以月夜寄相思》小说

首页进入到目录:http://www.365haoshu.com/Book/Chapter/List.aspx?NovelId=3026

获取小说的每个章节的名称和章节链接

打开浏览器的开发者工具,查找一个章节:如下图,找到第一章的名称和href(也就是第一章节内容页面的链接),开始写代码

Python爬取365好书中小说代码实例

from bs4 import BeautifulSoup 
import requests
import time
# 分别导入time、requests、BeautifulSoup库

url = 'http://www.365haoshu.com/Book/Chapter/'
# 链接地址url,这儿url章节链接没全写出来是因为下面获取章节链接时要用到这些url
req = requests.get(url+'List.aspx?NovelId=0326')
# 打开章节页面,
req_bf = BeautifulSoup(req.text,"html.parser")
print(req_bf)
# 将打开的页面以text打印出来
div = req_bf.find_all('div',class_='user-catalog-ul-li')
# 分析页面,所需要的章节名和章节链接是在div标签,属性class为user-catalog-ul-li下
# 找到这个下的内容,并打印
s = []
for d in div:
  s.append(d.find('a'))
print(s)
# 获取div下面的a标签下的内容
names=[] # 存储章节名
hrefs=[] # 存储章节链接
for i in s:
  names.append(i.find('span').string)
  hrefs.append(url + i.get('href'))
# 将所有的章节和章节链接存入的列表中
观察href后的链接和打开章节内容页面的链接是不完全的相同的, 所以要拼接使得浏览器能直接打开章节内容

获取到链接和章节名后打开一个章节获取文本内容;

和获取章节名方法一致,一步一步查找到内容的位置

txt = requests.get(hrefs[0])
div_bf = BeautifulSoup(txt.text,'html.parser')
div = div_bf.find_all('div',class_='container user-reading-online pos-rel')
#print(div)
ps = BeautifulSoup(str(div),"html.parser")
p=ps.find_all('p',class_='p-content')
print(p)
txt=[]
for i in p:
  txt.append(i.string+'\n')
print(txt)

获取单一章节完成

接下来整理代码,获取整个小说的内容,代码如下:

# --*-- coding=utf-8 --*--

from bs4 import BeautifulSoup
import requests
import time


class spiderstory(object):

  def __init__(self): # 初始化
    self.url = 'http://www.365haoshu.com/Book/Chapter/'
    self.names = [] # 存放章节名
    self.hrefs = [] # 存放章节链接

  def get_urlAndName(self):
    '''获取章节名和章节链接'''
    req = requests.get(url=self.url+'List.aspx?NovelId=0326') # 获取章节目录页面
    time.sleep(1) # 等待1秒
    div_bf = BeautifulSoup(req.text,"html.parser") # req后面跟text和html都行
    div = div_bf.find_all('div', class_='user-catalog-ul-li') # 查找内容,标签为div,属性为class='user-catalog-ul-li'
    a_bf = BeautifulSoup(str(div))
    a = a_bf.find_all('a') # # 查找内容,标签为a
    for i in a:
      self.names.append(i.find('span').string) # 获取内容直接string就行
      self.hrefs.append(self.url + i.get('href')) # 获取链接

  def get_text(self,url):
    '''获取章节内容'''
    req = requests.get(url=url)
    div_bf = BeautifulSoup(req.text,"html.parser")
    div = div_bf.find_all('div', class_='container user-reading-online pos-rel') # 查找内容
    ps = BeautifulSoup(str(div), "html.parser")
    p = ps.find_all('p', class_='p-content')
    text = []
    for each in p:
      text.append(each.string)
    print(text)

    return text # 将获得的内容返回

  def writer(self, name, path, text):
    '''写入text文档中'''
    with open(path, 'a', encoding='utf-8') as f:
      f.write(name + '\n')
      f.writelines(text)
      f.write('\n\n')
if __name__ == "__main__": # 运行入口
  s = spiderstory()
  s.get_urlAndName()
  le = len(s.names)
  for i in range(le): # 利用for循环获得所有的内容
    name = s.names[i]
    text = str(s.get_text(s.hrefs[i]))
    s.writer(name,"我以月夜寄相思.txt",text)
  print('下载完毕!!!')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 命令行非阻塞输入的小例子
Sep 27 Python
Python数据类型详解(四)字典:dict
May 12 Python
Python中强大的命令行库click入门教程
Dec 26 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
浅谈python常用程序算法
Mar 22 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
使用Python的turtle模块画国旗
Sep 24 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
python爬虫利用代理池更换IP的方法步骤
Feb 21 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 #Python
使用wxpy实现自动发送微信消息功能
Feb 28 #Python
解决ROC曲线画出来只有一个点的问题
Feb 28 #Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 #Python
利用python画出AUC曲线的实例
Feb 28 #Python
Python编程快速上手——选择性拷贝操作案例分析
Feb 28 #Python
AUC计算方法与Python实现代码
Feb 28 #Python
You might like
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
python抓取网页中的图片示例
2014/02/28 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
python如何调用java类
2020/07/05 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
校长就职演讲稿
2014/01/06 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL
Java中的Kotlin 内部类原理
2022/06/16 Java/Android
基于Redission的分布式锁实战
2022/08/14 Redis