python爬取小说详解(一)
整理思路:
首先观察我们要爬取的页面信息。如下:
自此我们获得信息有如下:
♦1.小说名称链接小说内容的一个url,url的形式是:http://www.365haoshu.com/Book/Chapter/ +href="detail.aspx?NovelId=3026&s=1527731727&t=DgV6NiFxdi8bOQ40DikZJQ0HCnYMBwZyDikgcA45BnAOKSB.&r=4298" #其中:&r=4298这个变化对小说章节顺序没有发生变化,你可以在后面改一下试一下
♦2.小说的链接和小说名称都在同一个标签下面。
至此我有了简单的思路了:
根据以上条件特点我有了一个总体思路,我分别用两个列表一个存放小说名字,一个存放列链接,然后然依次同时取出小说名字对应链接然后写在一个文件里面。
♦1.根据难度性,我们先把所有的这个HTML内容响应出来放到一个类集合里面<class 'bs4.BeautifulSoup'>
♦2.再根据这个集合在检索小说名字和链接所在所在的tag行,形成一个新的集合<class 'bs4.element.ResultSet'>
♦3.然后再在这个集合里面检索小说名称和小说链接,再形成一个新的类集合<class 'bs4.element.Tag'>
♦4.在检索的同时就把这些检索出来的东西分别存放在两个字符串里面
♦5,按照顺序依次遍历出来并把对应小说的内用写在text文件里面
我们需要用到的库:
♦from bs4 import BeautifulSoup
♦import requests
小说章节链接:
♦http://www.365haoshu.com/Book/Chapter/List.aspx?NovelId=6686
♦小说名称:为你倾心,为我倾城
接下来开始代码部分:
- from bs4 import BeautifulSoup#导入BeautifulSoup这个模块爬虫中很关键在第二篇中讲
- import requests
- #我们大概分三个步骤
- #1.获取章节和章节对应的链接信息
- #2.获取对应章节的内容
- #3.把章节名字已经对应章节的内容写进text文件里面
- class spiderstory(object):
- def __init__(self):
- self.url = 'http://www.365haoshu.com/Book/Chapter/'
- self.names = []#存放章节名称
- self.hrefs = []#存放章节链接
- def get_urlandname(self):
- response = requests.get(url=self.url + 'List.aspx?NovelId=6686 ')#回去章节目录类型为<class 'requests.models.Response'>
- req_parser = BeautifulSoup(response.text,"html.parser")
- # req后面跟text和html都行,固定写法,BeautifulSoup默认支持Python的标准HTML解析库数据类型:<class 'bs4.BeautifulSoup'>
- # print(req_parser)
- # print(type(req_parser))
- div = req_parser.find_all('div',class_='user-catalog-ul-li')
- # 查找内容,标签为div,属性为class='user-catalog-ul-li',这里 是找到名字和链接所在的标签,数据类型:<class 'bs4.element.ResultSet'>
- # print(div)
- # print(type(div))
- a_bf = BeautifulSoup(str(div))#进行进一步的字符解析因为获取要素类型的值时必须进行这一步
- # print(type(a_bf))#<class 'bs4.BeautifulSoup'>
- # print(len(a_bf))#1
- a = a_bf.find_all('a') # # 查找内容,标签为a#下面需要获取a标签下的href,所以这里首先要精确到a标签下。才能从a标签下获取属性的值
- # print(len(a))
- # print(a)
- for i in a:#注意class类型和列表等一样也是一个一个元素的,所以他可以用for遍历,你可以用len查看一下
- #print(i.find('span',class_='fl').string)#查找所有span和属性class='fi'的字符类型的内容,注意因为class和类一样了所写成class_
- # print(i)
- # print(i['href'])
- # print(type(i))
- # print(len(i))
- # print(i.find('span',class_='fl'))
- self.names.append(i.find('span',class_='fl').string)#str只获取指定的文本类型
- #print(i.get('href'))#获取有两种方法:1.i.get('href' 2.i['href']
- self.hrefs.append(self.url + i['href'])#注意如果TypeError: must be str, not NoneType,所以这里追加到字符串里面必须以字符的形式加
- print(self.names)
- print(self.hrefs)
- def get_text(self,url):
- # print(self.hrefs[0])
- respons2 =requests.get(url=url)
- # print(respons2)
- c = BeautifulSoup(str(respons2.text),'html.parser')
- # print(c)
- b = c.find_all('p', class_='p-content')
- text = []
- for temp in b:#获取标签里面的文本只能进行遍历每个满足条件的文本才能获取
- text.append(temp.string)
- #b.string#获取解析后的文本,获取所有的文本类型
- print(text)
- return text
- def writer(self,name,path,text1):
- ''' 写入TXT文档'''
- with open(path,'a',encoding='utf-8') as f:
- f.write(name + '\n')#写入名字并换行
- f.writelines(text1)#追加内容
- f.write('\n\n')#换两行
- if __name__ == "__main__": # 运行入口
- a= spiderstory()
- a.get_urlandname()
- # a.get_text()
- for i in range(len(a.names)):
- name = a.names[i]
- text = str(a.get_text(a.hrefs[i]))#注意TypeError: write() argument must be str, not None,写入文档必须是字符串
- a.writer(name,'F:\小说.txt',text)
- print(a)
以上是我写的整体代码以及一些调试的方法:
代码整理如下:
- from bs4 import BeautifulSoup
- import requests
- class spiderstory(object):
- def __init__(self):
- self.url = 'http://www.365haoshu.com/Book/Chapter/'
- self.names = []#存放章节名称
- self.hrefs = []#存放章节链接
- def get_urlandname(self):
- '''获取章节名称和和章节URL'''
- response = requests.get(url=self.url + 'List.aspx?NovelId=6686 ')
- req_parser = BeautifulSoup(response.text,"html.parser")
- div = req_parser.find_all('div',class_='user-catalog-ul-li')
- a_bf = BeautifulSoup(str(div))
- a = a_bf.find_all('a')
- for i in a:
- self.names.append(i.find('span',class_='fl').string)
- self.hrefs.append(self.url + i['href'])
- def get_text(self,url):
- '''获取对应章节内容'''
- respons2 =requests.get(url=url)
- c = BeautifulSoup(str(respons2.text),'html.parser')
- b = c.find_all('p', class_='p-content')
- text = []
- for temp in b:
- text.append(temp.string)
- return text
- def writer(self,name,path,text1):
- ''' 写入TXT文档'''
- with open(path,'a',encoding='utf-8') as f:
- f.write(name + '\n')
- f.writelines(text1)
- f.write('\n\n')
- if __name__ == "__main__": # 运行入口
- a= spiderstory()
- a.get_urlandname()
- for i in range(len(a.names)):
- name = a.names[i]
- text = str(a.get_text(a.hrefs[i]))
- a.writer(name,'F:\小说.txt',text)
- print(a)
python爬取小说详解(一)的更多相关文章
- 用Python爬取小说《一念永恒》
我们首先选定从笔趣看网站爬取这本小说. 然后开始分析网页构造,这些与以前的分析过程大同小异,就不再多叙述了,只需要找到几个关键的标签和user-agent基本上就可以了. 那么下面,我们直接来看代码. ...
- 详细记录了python爬取小说《元尊》的整个过程,看了你必会~
学了好几天的渗透测试基础理论,周末了让自己放松一下,最近听说天蚕土豆有一本新小说,叫做<元尊>,学生时代的我可是十分喜欢读天蚕土豆的小说,<斗破苍穹>相信很多小伙伴都看过吧.今 ...
- 用python爬取小说章节内容
在学爬虫之前, 最好有一些html基础, 才能更好的分析网页. 主要是五步: 1. 获取链接 2. 正则匹配 3. 获取内容 4. 处理内容 5. 写入文件 代码如下: #导入相关model fro ...
- python爬取小说
运行结果: 代码: import requests from bs4 import BeautifulSoup from selenium import webdriver import os cla ...
- python入门学习之Python爬取最新笔趣阁小说
Python爬取新笔趣阁小说,并保存到TXT文件中 我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后 ...
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- Python3爬取小说并保存到文件
问题 python课上,老师给同学们布置了一个问题,因为这节课上学的是正则表达式,所以要求利用python爬取小说网的任意小说并保存到文件. 我选的网站的URL是'https://www.biquka ...
- Python实战项目网络爬虫 之 爬取小说吧小说正文
本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...
- python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇(转载)
转载出处:药少敏 ,感谢原作者清晰的讲解思路! 下述代码是我通过自己互联网搜索和拜读完此篇文章之后写出的具有同样效果的爬虫代码: from bs4 import BeautifulSoup imp ...
随机推荐
- Kubernetes的UI界面Kubernetes Dashboard的搭建
1.搭建准备 Kubernetes集群的安装部署 2.搭建过程 2.1.在master节点上创建kubernetes-dashboard.yaml cd /etc/kubernetes vim kub ...
- 03-SSH综合案例:商城表关系分析
1.2 设计页面: 静态页面: 1.3 数据库分析与设计: 一般是一个Java类就对应一个表,有哪些类?那看你有哪些实体啊?一般一个模块对应一个实体 有用户模块就会有用户的一个实体,就会有用 ...
- Python help() 函数
Python help() 函数 Python 内置函数 描述 help() 函数用于查看函数或模块用途的详细说明. 语法 help 语法: help([object]) 参数说明: object ...
- 除了DFS的空间恒定为宽度*深度之外,其余都是宽度^深度次方
- 关于java项目中的.classpath文件:
Classpath是Java中的重要概念: 它描述了Java虚拟机在运行一个Class时在哪些路径中加载要运行的类以及运行的类要用到的类 简单的说,就是像操作系统的path 只不过这个classpat ...
- Laravel 使用 seeder 使用要点
一.关于 DB use DB; 再使用 DB::table(database.table)->get(); 二.关于 ERROR 1366 (HY000): Incorrect string v ...
- appium镜像设置
npm --registry http://registry.cnpmjs.org install -g appium 使用npm的国内镜像可以安装,速度很不错. 以后不想输入ip的话可以输入以下命令 ...
- asp.net hessian + android hessdroid
做android开发时你还在为gson,json而人肉序列化与反序列化吗,上传文件时你还在使用UrlConnection或者HttpClient吗?下面提供了asp.net 服务端与 android ...
- excel定位函数
在Excel中MATCH函数可以返回指定内容所在的位置,而INDEX又可以根据指定位置查询到位置所对应的数据,各取其优点,我们可以返回指定位置相关联的数据. MATCH函数(返回指定内容所 ...
- Mysal表类型的区别-MyISAM,InnoDB
1/ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源.I ...