Crawler:利用Beautifulsoup库+find_all方法实现下载在线书架小说《星祖的电影世界》-阿里云开发者社区

开发者社区> 一个处女座的程序猿> 正文

Crawler:利用Beautifulsoup库+find_all方法实现下载在线书架小说《星祖的电影世界》

简介: Crawler:利用Beautifulsoup库+find_all方法实现下载在线书架小说《星祖的电影世界》
+关注继续查看

输出结果

image.png

image.png

核心代码

# -*- coding: utf-8 -*-

'''

Created on 2018年4月7日

@author: niu

'''

#Py之Crawler:利用beautifulsoup+find_all方法实现下载在线书架小说《星祖的电影世界》

#find_all方法的第一个参数是获取的标签名,第二个参数class_是标签的属性。

from bs4 import BeautifulSoup

import requests, sys

class downloader(object):

   def __init__(self):

       self.server = 'http://www.biqukan.com/'

       self.target = 'http://www.biqukan.com/50_50927/'

       self.names = []            #存放章节名

       self.urls = []            #存放章节链接

       self.nums = 0            #章节数

   def get_download_url(self): #获取下载链接

       req = requests.get(url = self.target)

       html = req.text

       div_bf = BeautifulSoup(html)  #利用beautifulsoup提取内容

       div = div_bf.find_all('div', class_ = 'listmain') #通过审查元素发现全书各个章节存放在了class属性为listmain的div标签下,各章之间差别就在于这些章节的【href】属性不一样,而且其属性正好对应着每一章节URL后半部分,那这样,我们就可以根据标签的href属性值获得每个章节的链接和名称了。

       a_bf = BeautifulSoup(str(div[0]))

       a = a_bf.find_all('a')  

       self.nums = len(a[14:])      #剔除不必要的章节,并统计章节数

       for each in a[14:]:

           self.names.append(each.string)

           self.urls.append(self.server + each.get('href')) #再接着提取章节名和章节文章

   def get_contents(self, target): #获取章节内容,target下载连接(string),texts章节内容(string)

       req = requests.get(url = target)

       html = req.text

       bf = BeautifulSoup(html)

       texts = bf.find_all('div', class_ = 'showtxt') #观察不同标签发现class属性为showtxt的div标签只有一个!这个标签里面存放的内容,是我们需要的小说正文

       texts = texts[0].text.replace('\xa0'*8,'\n\n')  #replace方法,剔除空格,替换为回车进行分段。 在html中是用来表示空格的。replace(‘\xa0’*8,’\n\n’)就是去掉下图的八个空格符号,并用回车代替

       return texts

   def writer(self, name, path, text): #将爬取的文章内容写入文件

       write_flag = True

       with open(path, 'a', encoding='utf-8') as f: #当前路径下,小说保存名称(string)

           f.write(name + '\n')  #章节名称(string)

           f.writelines(text)  #章节内容(string)

           f.write('\n\n')

if __name__ == "__main__":

   dl = downloader()

   dl.get_download_url()

   print('《星祖的电影世界》开始下载:')

   for i in range(dl.nums):

       dl.writer(dl.names[i], '星祖的电影世界.txt', dl.get_contents(dl.urls[i]))

       sys.stdout.write("  已下载:%.3f%%" %  float(i/dl.nums) + '\r')

       sys.stdout.flush()

   print('《星祖的电影世界》下载完成')


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
bbossgroups持久层ConfigSQLExecutor组件的典型用法-预编译操作
本文介绍bbossgroups持久层ConfigSQLExecutor组件的典型用法-预编译操作 本文分三部分: 1.dao层写法 2.sql配置文件配置方法(可以支持多种数据库sql配置) 3.
734 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4068 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4479 0
mysql中FIND_IN_SET的使用方法
  根据表goods的id和site_id查处goods表id对应的网站名称。   表goods数据        表site数据        这种情况下用子查询不好处理,而mysql提供了线程的find_in_set函数再结合group by来实现此功能。
773 0
Sencha Touch 2.4 callParent() 用法
callParent() 用法 方法介绍 用来调用父类的同名方法,并传参,这在从一个框架类派生且要重写诸如onRender这样的方法时会经常看到。 传参方式 1.arguments Ext.define('App.
746 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5727 0
+关注
一个处女座的程序猿
国内互联网圈知名博主、人工智能领域优秀创作者,全球最大中文IT社区博客专家、CSDN开发者联盟生态成员、中国开源社区专家、华为云社区专家、51CTO社区专家、Python社区专家等,曾受邀采访和评审十多次。仅在国内的CSDN平台,博客文章浏览量超过2500万,拥有超过57万的粉丝。
1701
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载