为了练习BeautifulSoup模块的使用,搞了个小说下载器。
一、效果展示
二、模块导入
需要的模块有BeautifulSoup,os,requests,re和lxml
from bs4 import BeautifulSoup
import os,requests,re
三、功能实现
1、为了方便找到想要的小说,于是我找了一个盗(和)版(谐)小说网站。网址是笔趣看
2、指定小说的下载地址
os.chdir(r"D:\\")
3、首先我需要根据每一章节的网址提取小说内容
def xiazai(url):
try:
html=requests.get(url).text
soup=BeautifulSoup(html,"lxml")
name=soup.find("div",class_="p").find_all("a")[1].get_text()
zj=soup.find("h1").get_text()
book=soup.find_all("div",id="content",class_="showtxt")[0]
book=str(book.get_text()).replace(u"\xa0",u" ").replace(" ","\n ").replace("&1t;/p>","").replace(url,"").replace("请记住本书首发域名:www.biqukan.com。笔趣阁手机版阅读网址:m.biqukan.com","")
book=book.replace("[笔趣看 www.biqukan.com]百度搜索“笔趣看小说网”手机阅读:m.biqukan.com","").replace("手机阅读地址:http://m.biqukan.com,数据和书签与电脑站同步,无广告清新阅读!","") #去除广告
with open(name+".txt","a") as f:
f.write(zj+"\n"+book+"\n\n\n")
print(zj+" 下载完成")
except:
print("下载失败")
这里我用string的replace()方法将广告替换为空白,同时由于文章内容存在特殊字符将导致存储失败所以我也将其替换为空格string.replace(u"\xa0",u" ")
4、既然已经能够提取给定地址的小说内容,那通过小说目录提供的地址,提取整本小说内容也不是不可能的。
def mulu(url):
html=requests.get(url).text
link1=re.findall("正文卷</dt>([\S\s]*?)</dl>",html)[0]
link2=re.findall('href="(.*?)">',link1)
for link in link2:
link="http://www.biqukan.com"+link
xiazai(link)
到此,只要提供小说目录的地址,就可以提取整本小说内容,但是正常使用的话还是不太方便,有没有方法能够直接通过查找小说名字就能下载小说呢?
5、还好,网站提供了搜索小说的接口http://www.biqukan.com/s.php?ie=gbk&s=2758772450457967865&q=“小说名”。
利用它,我们就可以直接对感兴趣的小说进行搜索,然后选择想下载的小说。
name=input("输入书名:")
url="http://www.biqukan.com/s.php?ie=gbk&s=2758772450457967865&q={}".format(name)
html=requests.get(url).text
try:
link1=re.findall('"bookimg"><a href="(.*?)"><img src=',html)
name1=re.findall('/">([\u4E00-\u9FA5]+)</a></h4><div class="cat">',html)
i=1;
for name in name1:
print(str(i)+" "+name)
i=i+1
i=0
for link1[i] in link1:
link1[i]="http://www.biqukan.com"+link1[i]
i=i+1
s=input("请选择: ")
mulu(link1[int(s)-1])
except:
print("未查询到相关结果!")
6、至此,一个完整的小说下载器就完成了。