前言

该文章主要分析编写爬虫小说的思路,文章代码使用语言Python3.7

2020-03-20

天象独行

第一部分:面对过程编程

1;首先我们确定目标,我们将要从网页:“https://www.biqukan.com/38_38836”下载小说“沧元图”。这里我们先设定URL以及请求头(后面会进行调整,让程序与人进行交互),且程序所需要的库:

from urllib importrequestfrom bs4 importBeautifulSoupimport_collectionsimportreimport os

'''***********************************

获取下载连接

***********************************'''url= 'https://www.biqukan.com/38_38836/'head= {'User-Agent':'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19',}

2;看到整个网页,我们发现这个界面是有很多目录,那么我们输入按键“F12”去查看前段代码。发现代码中属性“href”表示这是资源的具体路径,那这个时候,我们想到,可以通过Python 3 模块urllib 发出请求,正则表达式来提取内容的方式来提取我们所需要的内容:目录名称以及资源路径。具体查看如下代码:

charter = re.compile(u'[第弟](.+)章', re.IGNORECASE)

target_req= request.Request(url=url,headers=head) #发送请求#print("request.req的返回对象:",type(target_req))#print("++++++++++++++++++++++++++++++++++++++++++")

target_response=request.urlopen(target_req) #打开response包#print("request.response的返回对象:",type(target_response))#print("++++++++++++++++++++++++++++++++++++++++++")

'''打开read()用gbk编码编译'''target_html= target_response.read().decode('gbk','ignore')#print("request.html的返回对象:",type(target_html))#print("++++++++++++++++++++++++++++++++++++++++++")

listmain_soup= BeautifulSoup(target_html,'lxml') #使用“lxml”编译#print(listmain_soup.ul.li)#print("listmain_soup的返回对象:",type(listmain_soup))#print("++++++++++++++++++++++++++++++++++++++++++")

#chapters 状态是列表

chapters = listmain_soup.find_all('div',class_= 'listmain') #在下载的页面当中通过方法find_all 将页面中指定位置提取出来。#print(chapters)#print(type(chapters))#print("++++++++++++++++++++++++++++++++++++++++++")#help(listmain_soup.find_all)

download_soup= BeautifulSoup(str(chapters),'lxml') #将页面使用“lxml”编译#print(download_soup)#a = str(download_soup.dl.dt).split("》")[0][5:]#print(a)#novel_name = str(download_soup.)

novel_name = str(download_soup.dl.dt).split("》")[0][5:] #提取小说名称

flag_name= "《" + novel_name + "》" + "正文卷"

#print(flag_name)#print(len(download_soup.dl))#章节数目numbers

numbers = (len(download_soup.dl) - 1) / 2 - 8

#print(numbers)

download_dict=_collections.OrderedDict()

begin_flag=False

numbers= 1

#print(download_soup.dl.children)

#Beautiful Soup 通过tag的.children生成器,可以对tag的子节点进行循环#get属性的值

for child indownload_soup.dl.children:#print(dir(child))

#如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点:

if child != ' ':if child.string == u"%s" %flag_name:

begin_flag=Trueif begin_flag == True and child.a !=None:

download_url= "https://www.biqukan.com" + child.a.get('href')

download_name=child.string#print(download_name)

names = str(download_name).split('章')#print(names)

name = charter.findall(names[0] + '章')#print(name)

ifname:

download_dict['第' + str(numbers) + '章' + names[-1]] =download_url

numbers+= 1

#print(novel_name + '.txt' , numbers,download_dict)

#print(download_url)

3;这个时候我们成功将文章名称以及下载地址提取出来。结果如下图:

4;接下来,我们通过for 循环来逐一提取出文件名称以及下载地址,并且逐一下载进入文件。详细查看如下代码:

'''***************************************

提取下载地址,提取下载内容

***************************************'''

#print(download_dict['第1章 孟川和云青萍'])

print("下载开始>>>>")for key,value indownload_dict.items():

name_key=key

path= '/home/aaron/桌面/novel' + '//' +name_key

download_req_key= request.Request(url=value,headers=head)

download_response_value=request.urlopen(download_req_key)

download_html= download_response_value.read().decode('gbk','ignore')

soup_texts_value= BeautifulSoup(download_html,'lxml')

texts= soup_texts_value.find_all(id = 'content', class_ = 'showtxt')'''函数解析:

1;text 提取文本

2;replace()方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。'''texts= BeautifulSoup(str(texts),'lxml').div.text.replace('app2();' , '')

texts=texts.encode()#print(type(texts))

file = os.open(path,os.O_CREAT|os.O_RDWR|os.O_APPEND)

os.write(file,texts)#os.close(file)

print("%s 下载完成" ,name_key)

5;程序运行结果:

第二部分:面对对象思想

1;上面程序已经完成了任务,但是这样的代码没有交互,也没有这么方便阅读,那么我们将代码稍微调整一下。首先,我们将必要的,可重复的使用的功能都放在函数里面调用。如下:

#-*- coding:UTF-8 -*-

from urllib importrequestfrom bs4 importBeautifulSoupimport_collectionsimportreimportos'''类:下载《笔趣看》网小说: url:https://www.biqukan.com/'''

classdownload(object):def __init__(self,target):

self.target_url=target

self.head= {'User-Agent':'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19',}'''方法:获取下载链接

Parameters: 无

Returns:

1;文件名称

2;下载信息地址

3;小说名称'''

defdownload_url(self):

download_req= request.Request(url=self.target_url, headers =self.head)

download_response=request.urlopen(download_req)

download_html= download_response.read().decode('gbk','ignore')'''1;目前HTML已经使用url库发送了请求,接下来使用lxml编译,这么做是让我们更好的去提取网页当中我们需要的内容'''listmain_soup= BeautifulSoup(download_html,'lxml')'''2;我们通过BeautifulSoup方法,使用'lxml'编译,接下来我们我们来提取文件名称'''chapters= listmain_soup.find_all('div',class_ = 'listmain')

download_soup= BeautifulSoup(str(chapters),'lxml')'''3;提取文件名称'''novel_name= str(download_soup.dl.dt).split("》")[0][5:]'''4;设定for循环所需要的参数'''flag_name= '《' + novel_name + '》' + '正文卷'begin_flag= False #设定开始运行下载的位置

download_dict = _collections.OrderedDict() #设定有序字典,用来存放文件名称和下载链接地址

numbers = 1 #设定章节内容

'''4;利用for循环来提取出文件名称以及下载地址'''

for child indownload_soup.dl.children:if child != ' ': #排除空格

if child.string == u"%s" % flag_name: #设定开始下载位置

begin_flag =Trueif begin_flag == True and child.a != None: #符合有下载链接地址的条件才会下载

download_url = "https://www.biqukan.com" + child.a.get('href') #get() 用来提取属性内容

download_name =child.string'''5;重新修改文件名称'''names= str(download_name).split('章')

name= charter.findall(names[0] + '章')'''6;将文件名称以及下载链接放入字典当中'''

ifname:

download_dict['第' + str(numbers) + '章' + names[-1]] =download_url

numbers+= 1

return novel_name + '.txt', numbers , download_dict'''函数说明:爬文章内容

Parameters:

url

Retruns:

soup_text'''

defDownloader(self,url):

download_req= request.Request(url=self.target_url, headers =self.head)

download_response=request.urlopen(download_req)

download_html= download_response.read().decode('gbk','ignore')

soup_texts= BeautifulSoup(download_html,'lxml')

texts= soup_texts.find_all(id='content', class_='showtxt')

soup_text= BeautifulSoup(str(texts), 'lxml').div.text.replace('app2();', '')returnsoup_text'''函数说明:将爬去的文件内容写入文件'''

defwriter(self,name,path,text):

write_flag= True #设定文件写入的位置

'''1;使用with循环打开文件,并且注入到“f”当中'''with open(path,'a',encoding='utf-8') as f:

f.write(name+ ' ')for each intext:if each == 'h':

write_flag=Falseif write_flag == True and each != ' ':

f.write(each)if write_flag == True and each == ' ':

f.write(' ')

f.write(' ')if __name__ == "__main__":

target_url= str(input("请输入小说目录下载地址: "))

d= download(target=target_url)

name , numbers, url_dict=d.download_url()if name inos.listdir():

os.remove(name)

index=1

print("《%s》下载中:" % name[:-4])for key,value inurl_dict.items():

d.writer(key,name,d.Downloader(value))

sys.stdout.write("已下载:%.3f%%" % float(index / numbers) + ' ')

sys.stdout.flush()

index+= 1

print("《%s》下载完成!" % name[:-4])

python下载代码-Python3----下载小说代码相关推荐

  1. python软件下载3版本-【python3下载】python3下载安装 中文版-七喜软件园

    python3是一款非常实用的计算机语言编译工具.软件能帮助用户广泛的进行计算机语言的设计与编译,并且还支持对图像进行处理,功能十分的强大.此外,python3中文版有着多样的数据模块,能实现各类的系 ...

  2. python3下载文件-python3 下载文件方法汇总

    学习python爬虫中,特地mark,以备忘 方法一: 使用 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. urlretrie ...

  3. python 判断节假日,Python3自动签到 定时任务 判断节假日的实例

    不废话,直接上代码Python3.6 签到代码,只需修改url,账号,密码即可,此处是登录时无验证登录,有验证码的自行补充 # -*- coding:utf-8 -*- import json imp ...

  4. python 小说下载_Python3----下载小说代码

    前言 该文章主要分析编写爬虫小说的思路,文章代码使用语言Python3.7 2020-03-20 天象独行 第一部分:面对过程编程 1:首先我们确定目标,我们将要从网页:"https://w ...

  5. python 小说下载工具_下载代码python之小说下载器

    时光紧张,先记一笔,后续优化与完善. 首先声明,我写这个是为了练手,我不看小说了.因为眼睛近视太厉害了,我连手机都不玩了. 小说下载器的目标是为了解决当初市面上能下载最新小说的网站是在太少了,但是在线 ...

  6. Python妙用:使用一行代码下载视频

    "如何用一行Python代码下载<后浪>等全网视频" 01 基于Python开发 是的,这款下载工具包是基于Python开发的,实际它不只支持视频下载,还支持图片.音乐 ...

  7. Python3:我只用1行代码就下载全网视频,我被我的才华和颜值征服了!!

    you-get库使用 1.引言 2.代码实战 2.1 you-get介绍 2.2 you-get安装 2.3 you-get下载视频 2.3.1 指定存储和重命名 2.3.2 查看视频信息 2.3.3 ...

  8. python代码示例下载-Python下载网易云歌单歌曲的示例代码

    今天写了个下载脚本,记录一下 效果: 直接上代码: # 网易云 根据歌单链接下载MP3歌曲 import requests from bs4 import BeautifulSoup def main ...

  9. python代码示例下载-python爬取音频下载的示例代码

    抓取"xmly"鬼故事音频 import json # 在这个url,音频链接为JSON动态生成,所以用到了json模块 import requests headers = { & ...

最新文章

  1. 用switch编写一个计算机程序,超级新手,用switch写了个计算器程序,求指导
  2. 本弗莱数据可视化的生产流程图_力控锂离子电池车间数据采集系统
  3. 通信专业学python有用吗-通信算法工程师需要学python吗
  4. [C++] 用Xcode来写C++程序[6] Name visibility
  5. webstorm 不知道手贱点了什么,有时候会自动删除分号
  6. 装有支付宝的手机丢了可咋办
  7. Spring框架----Spring的bean的作用范围
  8. MQ监听 linux,RabbitMQ的安装,配置,监控
  9. ssh链接数设置问题
  10. Liunx 常用命令 学习备份
  11. AI总监Karpathy亲自揭秘特斯拉纯视觉系统,还有自动驾驶超算Dojo原型
  12. 视觉SLAM笔记(51) 非线性系统和 EKF
  13. c语言ascii码表_零基础学C语言——变量、常量与数据类型
  14. LEACH算法无线传感器网络路由协议
  15. 苹果手机网页上点击数字可能拨打电话的解决办法
  16. ssh-keygen的使用方法
  17. app推广假量怎么识别?
  18. 计算机二级Web考试真题题库 上机考试系统 大纲教材 考试课程 讲解视频
  19. c++某商店开展买一送一活动,购买两件商品时,只需支付价格较高的商品的金额。要求程序在输入两个商品的价格后,输出所应支付的金额,请根据裁判程序编写函数cut,将代码补充完整。
  20. Mac电脑最强截图工具--iShot

热门文章

  1. Cassandra——类似levelDB的基于p2p架构的分布式NOSQL数据库
  2. confluence 卡顿原因总结
  3. css美化单选款、复选框
  4. 算法 【第九章】动态规划问题
  5. 【Crash Course Psychology】1. Intro to psychology笔记
  6. webdriver--单选、复选及下拉框的定位
  7. 霸气侧漏HTML5--之--canvas(1) api + 弹球例子
  8. 中间人攻击框架以及工具,中国寒龙出品欢迎下载!~
  9. location.hash属性介绍
  10. ubuntu 下 SubLime Text2 使用之创建快捷方式