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修改操作系统时间的方法
May 18 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python玩转Excel的读写改实例
Feb 22 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
Python DataFrame一列拆成多列以及一行拆成多行
Aug 06 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
python实现感知机模型的示例
Sep 30 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+Html+缓存
2006/11/25 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Python 开发Activex组件方法
2009/11/08 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Django REST framework 视图和路由详解
2019/07/19 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
物业管理求职自荐信
2013/09/25 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
伊琍体标语
2014/06/25 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
我的生日感言
2015/08/03 职场文书