今天我们来进行Python爬取小说网的案例,与前面学习的爬取图片和爬取电影网不同,小说网的数据量比较大,相比前两者要复杂的多。

首先分析需求,我们要对每个分类的小说进行爬取,并且进行分类,不仅是文字还有图片信息,着重考虑的是网页目录,页数跳转和下载后乱码的问题。

下面开始写代码吧!

首先导入今天的几个包

import requests
from lxml import etree
from urllib.request import urlretrieve
from urllib.parse import quote
import os
# 正则表达式:从目标字符串提取需要的字符的一种匹配规则。
import re

一部小说的全部信息需要如下代码

# 小说名称
novel_name = div.xpath('h1/text()')[0]
# 小说点击次数
novel_click_num = div.xpath('ul/li[1]/text()')[0].split(":")[-1]
# 小说文件大小
novel_size = div.xpath('ul/li[2]/text()')[0].split(":")[-1]
# 小说书籍类型
novel_file_type = div.xpath('ul/li[3]/text()')[0].split(":")[-1]
# 小说更新日期
novel_update_time = div.xpath('ul/li[4]/text()')[0].split(":")[-1]
# 小说连载状态
novel_status = div.xpath('ul/li[5]/text()')[0].split(":")[-1]
# 小说作者
novel_author = div.xpath('ul/li[6]/text()')[0].split(":")[-1]
# 小说运行环境
novel_run_envir = div.xpath('ul/li[7]/text()')[0].split(":")[-1]
# 小说最新章节
novel_last_chapter = div.xpath('ul/li[8]/a/text()')[0]
# 小说图片的地址
novel_img_url = "https://www.qisuu.la" + html_obj.xpath('//div[@class="detail_pic"]/img/@src')[0]
# 小说的下载地址
# 根据正则表达式提取
pattern_obj = re.compile(r"get_down_url.*?,'(.*?)',", re.S)
novel_download_url = re.search(pattern_obj, response.text).group(1)

全部代码:

import requests
from lxml import etree
from urllib.request import urlretrieve
from urllib.parse import quote
import os
# 正则表达式:从目标字符串提取需要的字符的一种匹配规则。
import re# 判断是否有奇书网这个文件夹,如果没有,就创建一个并且切换进去
# 如果有则直接切换进去
if not os.path.exists("奇书网"):os.mkdir("奇书网")os.chdir("奇书网")
else:os.chdir("奇书网")
# 首先对网站首页发起请求,目的是为了解析出来每个小说分类的名称和地址
response = requests.get("https://www.qisuu.la/")
html_obj = etree.HTML(response.text)
a_list = html_obj.xpath('//div[@class="nav"]/a')
# 删除首页所在的a标签
del a_list[0]
for a in a_list:href = a.xpath("@href")[0]text = a.xpath("text()")[0]print("正在爬取-{}-分类小说".format(text))# 通过分类的名称创建文件夹,保证对应的分类小说存储到对应的文件夹中if not os.path.exists(text):os.mkdir(text)os.chdir(text)else:os.chdir(text)# 根据每个分类的href属性值,拼接出来每个分类详细的地址type_url = "https://www.qisuu.la" + href# 对每个小说分类的地址发起访问response = requests.get(type_url)# 编写正则表达式规则,从每个小说分类首页提取该小说分类的总页数# .*?:非贪婪匹配pattern_obj = re.compile(r"页次:1/(.*?) 每页", re.S)# 根据正则表达式匹配规则,从页面源代码中提取总页数total_num = re.search(pattern_obj, response.text).group(1)# 正则表达式匹配到的total_num是一个字符串,所有需要用int转换一下for page_num in range(1, int(total_num) + 1):print("正在爬取第{}页小说".format(page_num))if not os.path.exists("第{}页".format(page_num)):os.mkdir("第{}页".format(page_num))os.chdir("第{}页".format(page_num))else:os.chdir("第{}页".format(page_num))# 在小说分类地址的基础上,拼接出来每一页小说的地址every_page_url = type_url + "index_{}.html".format(page_num)# 对每一页小说发起访问response = requests.get(every_page_url)html_obj = etree.HTML(response.text)# 解析出来每一本小说的地址a_list = html_obj.xpath('//div[@class="listBox"]/ul/li/a')for a in a_list:href = a.xpath("@href")[0]text = a.xpath("text()")[0]print("正在爬取-{}-小说".format(text))if not os.path.exists(text):os.mkdir(text)os.chdir(text)else:os.chdir(text)# 拼接出来每一本小说的地址,然后发起访问every_novel_url = "https://www.qisuu.la" + hrefresponse = requests.get(every_novel_url)response.encoding = "utf-8"html_obj = etree.HTML(response.text)div = html_obj.xpath('//div[@class="detail_right"]')[0]# 小说名称novel_name = div.xpath('h1/text()')[0]# 小说点击次数novel_click_num = div.xpath('ul/li[1]/text()')[0].split(":")[-1]# 小说文件大小novel_size = div.xpath('ul/li[2]/text()')[0].split(":")[-1]# 小说书籍类型novel_file_type = div.xpath('ul/li[3]/text()')[0].split(":")[-1]# 小说更新日期novel_update_time = div.xpath('ul/li[4]/text()')[0].split(":")[-1]# 小说连载状态novel_status = div.xpath('ul/li[5]/text()')[0].split(":")[-1]# 小说作者novel_author = div.xpath('ul/li[6]/text()')[0].split(":")[-1]# 小说运行环境novel_run_envir = div.xpath('ul/li[7]/text()')[0].split(":")[-1]# 小说最新章节novel_last_chapter = div.xpath('ul/li[8]/a/text()')[0]# 小说图片的地址novel_img_url = "https://www.qisuu.la" + html_obj.xpath('//div[@class="detail_pic"]/img/@src')[0]# 小说的下载地址# 根据正则表达式提取pattern_obj = re.compile(r"get_down_url.*?,'(.*?)',", re.S)novel_download_url = re.search(pattern_obj, response.text).group(1)print("没有转换之前的小说地址:", novel_download_url)# 从小说下载地址中把其中的文字部分取出来,使用quote对文字部分内容进行编码novel_download_url = novel_download_url.replace(novel_download_url.split("/")[-1].split(".")[0],quote(novel_download_url.split("/")[-1].split(".")[0]))print("转换过后的下载地址是:", novel_download_url)# 下载小说图片urlretrieve(novel_img_url, "{}.jpg".format(novel_name))# 由于使用urlretrieve进行文件下载的时候,下载地址中不能含有中文,需要进行对中文进行转换urlretrieve(novel_download_url, "{}.txt".format(novel_name))f = open("{}信息.txt".format(novel_name), "w", encoding="utf-8")# write():文件写入f.write("小说名称:{}".format(novel_name))f.write("\n")f.write("点击次数:{}".format(novel_click_num))f.write("\n")f.write("文件大小:{}".format(novel_size))f.write("\n")f.write("书籍类型:{}".format(novel_file_type))f.write("\n")f.write("更新日期:{}".format(novel_update_time))f.write("\n")f.write("连载状态:{}".format(novel_status))f.write("\n")f.write("小说作者:{}".format(novel_author))f.write("\n")f.write("运行环境:{}".format(novel_run_envir))f.write("\n")f.write("最新章节:{}".format(novel_last_chapter))f.write("\n")f.write("图片地址:{}".format(novel_img_url))f.write("\n")f.write("下载地址:{}".format(novel_download_url))f.write("\n")print("文件关闭")# 关闭文件f.close()os.chdir(os.pardir)os.chdir(os.pardir)os.chdir(os.pardir)

运行程序后,

我这里网路比较卡,只下载了一本就停止运行了 ,如果想下载全部,耐心等待就好了,489页 每页25本,太多了。哈哈 运行完后去你程序的源文件就可以看到奇书网文件夹了,好看的小说就都在里面啦!

做的不好 仅供参考

Python爬取奇书网(用Python下载小说到本地)相关推荐

  1. Python爬取知网信息——Python+selenium爬取知网信息(文献名,作者,来源,发表日期,文献类型)

    # -*- coding: utf-8 -*- #时间:2019.5.1 #运行环境Python 3.* ''' 1.运行此代码前需要先下载Chrome浏览器,去百度搜索下载 2.我是利用seleni ...

  2. 在当当买了python怎么下载源代码-爬虫实战:爬取当当网所有 Python 书籍

    来源:公众号-极客猴 出处: 本文主要讲解如何利用urllib.re.BeautifulSoup 这几个库去实战,爬取当当网所有 Python 书籍. 1 确定爬取目标 任何网站皆可爬取,就看你要不要 ...

  3. 在当当买了python怎么下载源代码-Python爬取当当网最受欢迎的 500 本书

    想看好书?想知道哪些书比较多人推荐,最好的方式就是看数据,接下来用 Python 爬取当当网五星图书榜 TOP500 的书籍,或许能给我们参考参考! Python爬取目标 爬取当当网前500本受欢迎的 ...

  4. python爬取东方财富网资金流向数据(在本地生成csv文件)

    今天我们来试着用python爬取东方财富网资金流向的表格数据. 第一步:程序及应用的准备 首先我们需要安装selenium库,使用命令pip install selenium;然后我们需要下载对应的c ...

  5. python爬取当当网商品评论

    python爬取当当网商品评论 本案例获取某鞋评论作为例 案例目的: 通过爬取当当网商品评价,介绍通过结合jsonpath和正则表达式获取目标数据的方法. 代码功能: 输入爬取的页数,自动下载保存每页 ...

  6. Python爬取书包网文章实战总结

    python爬取书包网文章总结 今天闲来无事去看小说,但是发现没办法直接下载,所以呢就用python爬虫来下载一波了,哈哈- 爬取的是这篇小说:剑破九天(是不是很霸气,话不多说,开始-) 总体思路步骤 ...

  7. python爬取火车票网的时刻表数据

    python爬取火车票网的时刻表数据 导包 import re,requests,datetime,time,json from prettytable import PrettyTable from ...

  8. python爬取网易云音乐_我用Python爬取了网易云音乐

    原标题:我用Python爬取了网易云音乐 来源:别动我的猫尾巴 headers需要进行修改,headers设置不对会被屏蔽导致爬取不成功.一个headers用久了也会爬取不成功 代码如下: impor ...

  9. 使用Python爬取知网信息

    使用Python爬取知网信息 import requests from urllib import request from lxml import etree import re import cs ...

  10. 利用python爬取东方财富网股吧评论并进行情感分析(一)

    利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论.涉及内容在前人的研究基础之 ...

最新文章

  1. 利用 scipy.signal中的spectrogram分析信号的时频联合分布
  2. MapReduce1.x与MapReduce2.x差异
  3. SDWebImage 加载Https自签名证书时的图片问题
  4. run as date怎么用_熟词僻义 | date是一种什么水果?
  5. php中find的函数_filter()、find()函数的区别
  6. getssdtserviceid_[下载]发个获得SSDT函数名和索引号的代码
  7. 如何测试GPS的RAIM功能-->如何使用GSS7000测试RAIM
  8. 常用的远程连接Linux工具有哪些??
  9. ManualResetEvent使用说明
  10. 机器人控制框架行为树py_trees <一、行为树介绍>
  11. a标签实现下载图片功能
  12. 自己不优秀,认识谁都没用
  13. Android Studio 光标莫名其妙加粗后,与 insert 键相反的问题
  14. 【高效程序员系列】3、别碰鼠标------让键盘飞起来
  15. 一个大二博主的一年来写博的年终总结与未来展望——致2019努力的自己,也致2020更好的自己
  16. Qt信号与槽机制详解1-创建一个带信号和槽的例子
  17. web服务器角色源文件,IIS 7.5中提供的Web服务器(IIS)角色服务详请
  18. svn: 'path' has no ancestry information
  19. 增长量计算n+1原则_2017国家公务员考试:简单易得分的增长量计算
  20. Automation错误 定义的应用程序或对象错误-Scripting.FileSystemObject

热门文章

  1. AUTOSAR-基本概念
  2. Python练习_数据类型_day4
  3. C/C++ 内存泄漏检测工具汇总
  4. 写bat文件,报系统找不到指定文件的处理方式
  5. 在线matlab,web版,还是挺好用的
  6. 上海内推 | 微软亚洲研究院(上海)AI-ML组招聘AI实习生
  7. 自己用服务器搭建网盘,三步轻松搞定,还包括应用测试哦!
  8. android float 百分比,如何在android中计算百分比
  9. python爬虫练习之爬取豆瓣读书所有标签下的书籍信息
  10. c语言结构体投票系统,结构体之投票系统