python爬虫实例之小说爬取器
今天和大家分享一个爬取盗版小说的实例。
如今的网络小说可谓是百家齐放各领风骚,玄幻科幻穿越修仙都市… 各种套路看得我是心潮澎湃,笔者曾经也蛮喜欢看小说的,以前经常是拿着一台诺基亚看到深夜,第二天带着黑眼圈去上学。
以前看小说都是txt格式的文件,每次都需要拿着在电脑上搜索‘***txt小说免费下载’,往事不堪回首
学以致用,为了以后下载小说能够超微显得高端一点,今天就给大家分享一个爬取盗版小说的爬虫实例。
当然还是希望大家支持正版哈
这次我选择的网站是笔趣阁,一个可以免费在线看小说的网站,而且貌似可以免费直接下载(手动狗头)
在本实例中我们选择的是孑与2大大的经典之作《唐砖》
点开唐砖我们可以看到是这个样子的
(图片暂无)
查看原码后发现它的目录里面所有章节都存放在一个名为list的div里面,并且所有链接都可以直接访问
我们先用代码获取它的所有目录信息并存放在两个列表chaptername 和chapteraddress 中
def getchapter(html):soup = BeautifulSoup(html,'lxml')try:alist = soup.find('div',id='list').find_all('a')for list in alist:chaptername.append(list.string)href = 'http://www.paoshu8.com'+list['href']chapteraddress.append(href)return Trueexcept:print('未找到章节')return False
这样我们就得到了所有的章节信息,接下来只要遍历链接地址就可以得到每一节的详细内容
在每一节详细内容中我们发现,小说的文字都存放在了一个名为content的div里面,我们只需利用BeaufulSoup里面的find函数就可以找到这个div,并且我们可以看到,他的文字都是存放在了p标签里面,所以接下来我们再利用find_all函数找到div里面的所有p标签便可。
在这次爬虫中,我遇到的一个问题就是在小说中遇见了两个特殊符号,比如说’\u30fb’,’\u2660’,对于这样的错误,我直接用replace替代了这些特殊符号,最终不算很完整的爬完了整部小说。
下面上代码:
import requests
from bs4 import BeautifulSoup
import timestart = time.clock()
#获取页面html源码
def getpage(url):headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}page = requests.get(url).content.decode('utf-8')return pagechaptername = [] #存放小说章节名字
chapteraddress = [] #存放小说章节地址
#获取小说所有章节以及地址
def getchapter(html):soup = BeautifulSoup(html,'lxml')try:alist = soup.find('div',id='list').find_all('a')for list in alist:chaptername.append(list.string)href = 'http://www.paoshu8.com'+list['href']chapteraddress.append(href)return Trueexcept:print('未找到章节')return False#获取章节内容
def getdetail(html):soup = BeautifulSoup(html,'lxml')try:content = ' 'pstring = soup.find('div',id='content').find_all('p')for p in pstring:content += p.string.replace('\u30fb','').replace('\u2660','') #这是整个代码最简陋的地方,有可能出现各种的特殊符号中断程序,如果每次都需要replace的话太麻烦了content += '\n 'return contentexcept:print('出错')return '出错'url = 'http://www.paoshu8.com/0_840/'
html = getpage(url)
getchapter(html)file = open('C:/Users/Lenovo/Desktop/fiction.txt','w') #小说存放在本地的地址
count = len(chapteraddress)
for i in range(len(chapteraddress)):curl = str(chapteraddress[i])chtml = getpage(curl)content = '\n' + getdetail(chtml) + '\n' #为了保持小说有格式title = '\n 第'+str(i+1)+'章 '+str(chaptername[i])+' \n'file.write(title+content)print('{:.3%}'.format(i/count)+' '+chaptername[i])file.close()end = time.clock()print('下载完毕,总耗时',end-start,'秒')
以上代码还有很多地方需要完善。比如说每次下载小说的话都得先去小说网站查看网址才能进行下载,比较麻烦,所以我稍微进行了些修改,让程序仅需输入名字便可爬取网站里面任何小说。
import requests
from bs4 import BeautifulSoup
import time
import codecsstart = time.clock()#在小说大全界面获取所有小说名单
novellist = {}
def getnovels(html):soup = BeautifulSoup(html,'lxml')list = soup.find('div',class_='novellist').find_all('a')baseurl = 'http://www.paoshu8.com'for l in list:novellist[l.string] = baseurl+str(l['href']).replace('http:','')#获取页面html源码
def getpage(url):headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}page = requests.get(url).content.decode('utf-8')return pagechaptername = [] #存放小说章节名字
chapteraddress = [] #存放小说章节地址
#获取小说所有章节以及地址
def getchapter(html):soup = BeautifulSoup(html,'lxml')try:alist = soup.find('div',id='list').find_all('a')for list in alist:chaptername.append(list.string)href = 'http://www.paoshu8.com'+list['href']chapteraddress.append(href)return Trueexcept:print('未找到章节')return False#获取章节内容
def getdetail(html):soup = BeautifulSoup(html,'lxml')try:content = ' 'pstring = soup.find('div',id='content').find_all('p')for p in pstring:content += p.stringcontent += '\n 'return contentexcept:print('出错')return '出错'url = 'http://www.paoshu8.com/xiaoshuodaquan/' #小说大全网址
html = getpage(url)
getnovels(html) #获取小说名单name = input('请输入想要下载小说的名字:\n')
if name in novellist:print('开始下载')url = str(novellist[name])html = getpage(url)getchapter(html)file = codecs.open('C:/Users/Lenovo/Desktop/novellist/'+name+'.txt','w','utf-8') #小说存放在本地的地址count = len(chapteraddress)for i in range(len(chapteraddress)):curl = str(chapteraddress[i])chtml = getpage(curl)content = '\n' + getdetail(chtml) + '\n' #为了保持小说有格式title = '\n 第'+str(i+1)+'章 '+str(chaptername[i])+' \n'file.write(title+content)print('{:.3%}'.format(i/count)+' '+chaptername[i])file.close()end = time.clock()print('下载完毕,总耗时',end-start,'秒')
else:print('未找见该小说')
运行截图:
这是单线程版本的爬取器,如果想要加快下载速度,可以用多线程:python爬虫实例之——多线程爬取小说
以上便是本篇小说下载器的所有内容,祝愿我们共同进步,也希望我们早日打赢这场战疫!
python爬虫实例之小说爬取器相关推荐
- python爬虫实例之——多线程爬取小说
之前写过一篇爬取小说的博客,但是单线程爬取速度太慢了,之前爬取一部小说花了700多秒,1秒两章的速度有点让人难以接受. 所以弄了个多线程的爬虫. 这次的思路和之前的不一样,之前是一章一章的爬,每爬一章 ...
- 使用 requests+lxml 库的 Python 爬虫实例(以爬取网页连载小说《撒野》为例)
需求目标 介绍使用 requests 库与 lxml 库进行简单的网页数据爬取普通框架与爬虫实例,本文以爬取网页连载小说<撒野>为例~ 当然有很多小说基本都能找到现成的 .txt 或者 . ...
- python爬虫实例练习:爬取慕课网课程名称以及对应的链接
1.安装与开发环境 模块安装: bs4 解析库安装:pip install bs4 开发环境: python 3.x + pycharm ps:文章来源于小编的头条号:"python数据科学 ...
- python爬虫初战之小说爬取
废话不多说,上代码. 总体思路是构建函数然后循环. 函数分两块,第一个函数得到标题和每一章节的网址,第二个函数得到每一章节的具体内容,然后循环就ok. import urllib.request as ...
- python爬虫对炒股有没有用_使用python爬虫实现网络股票信息爬取的demo
实例如下所示: import requests from bs4 import BeautifulSoup import traceback import re def getHTMLText(url ...
- python爬虫股票市盈率_使用python爬虫实现网络股票信息爬取的demo
实例如下所示: import requests from bs4 import BeautifulSoup import traceback import re def getHTMLText(url ...
- 19. python爬虫——基于scrapy框架爬取网易新闻内容
python爬虫--基于scrapy框架爬取网易新闻内容 1.需求 [前期准备] 2.分析及代码实现 (1)获取五大板块详情页url (2)解析每个板块 (3)解析每个模块里的标题中详情页信息 1.需 ...
- python爬虫——用Scrapy框架爬取阳光电影的所有电影
python爬虫--用Scrapy框架爬取阳光电影的所有电影 1.附上效果图 2.阳光电影网址http://www.ygdy8.net/index.html 3.先写好开始的网址 name = 'yg ...
- python爬虫如何实现每天爬取微信公众号的推送文章
python爬虫如何实现每天爬取微信公众号的推送文章 上上篇文章爬虫如何爬取微信公众号文章 上篇文章python爬虫如何爬取微信公众号文章(二) 上面的文章分别介绍了如何批量获取公众号的历史文章url ...
最新文章
- 刻意练习:Python基础 -- Task01. 变量、运算符与数据类型
- 函数计算+云市场实现手机号归属地和图片爬虫系统设计...
- mysql的sql_mode合理设置
- IAR 不能使用go to 的解决方法
- 解读JavaScript代码 var ie = !-[1,]
- scrapy splash 爬取图片学习心得
- ci框架 查询构造器类
- QT6.1.2下载和安装教程
- 增长黑客AB-Test系统(四)——AB-Test 最小样本量
- Vue3中数据更新函数effect的实现
- 美团笔试题 淘汰分数
- web 常见的攻击方式
- 软件测试面试中都会问到哪些关于Python的问题?
- linux下磁盘测速,linux下磁盘测速工具
- 基于国产银河飞腾多核 DSP +FPGA的图像识别硬件设计与算法实现
- 火车票是一门什么生意 「上篇」
- 上海浦东新区计算机学校排名2015,2015年上海市浦东新区初级中学最新排名.pdf
- 三星android 4.04,三星Galaxy note i889如何Odin线刷4.04
- IT奶爸带娃记之幼儿园选择困难症
- react17源码浅析