再写一个用BeautifulSoup抓站的工具,体会BeautifulSoup的强大。

根据小说索引页获取小说全部章节内容并在本地整合为小说全文。不过不是智能的,不同的站点对代码需要做相应的修改。

#!/usr/bin/env pythonimport os
import sys
import re
import time
import chardet
import urllib.request as ur
from urllib.parse import urljoin,urlparse
from bs4 import BeautifulSoup
from threading import Threadclass Download(Thread):                          #为每个章节分配多线程def __init__(self,filepath,info):Thread.__init__(self)self.filepath = filepath(self.link,self.chapter) = infodef run(self):print('开始下载: '+self.chapter)section(self.filepath,self.chapter,self.link)print('完成下载: '+self.chapter)def getData(url):                          #主要用于判断页面编码,但是发现BeautifulSoup自带判定能力,故废弃此函数charsets = 'utf8'response = ur.urlopen(url,timeout = 10)html = response.read()charinfo = chardet.detect(html)charsets = charinfo['encoding']data = html.decode(charsets)return datadef merge(tmpFiles,targetFile):             #将下载的章节合并for tmpFile in tmpFiles:with open(targetFile,'a+') as wfile:wfile.write(open(tmpFile,'r').read())os.remove(tmpFile)def content(link):                         #获取章节页面的小说内容。对于不同的站点,在此函数内修改获取章节内容的代码html = ur.urlopen(link,timeout = 10)soup =BeautifulSoup(html)contents = soup.find(id = 'readtext').p.span.text.replace('  ','\n')   #BeautifulSoup会自动将&nbsp;转换为空格,<br/>转换为特殊符号return contentsdef section(filepath,chapter,link):         #下载章节内容while True:                #反复请求页面try:with open(filepath,'w') as nfile:nfile.write(chapter+'\n'+content(link)+'\n')breakexcept:passdef index(url):                         #获取章节索引indexs = []while True:                   #反复请求页面try:html = ur.urlopen(url,timeout = 10)#html = html.read().decode('gb2312')#html = getData(url)soup = BeautifulSoup(html,from_encoding = 'gbk')#BeautifulSoup能自动识别编码,但是会将gbk页面识别为gb2312页面,可能导致页面内部分数据获取失败,故显式指定breakexcept:passtitle = soup.find(name = 'div',attrs = {'class':'booktext'}).textindexDiv = soup.find(name = 'div',attrs = {'class':'booktext'})indexUl = [ul for ul in indexDiv.find_all('ul') if ul][1:]for ul in indexUl:indexList = [li.a for li in ul.find_all('li') if li]index = [(urljoin(url,a.get('href')),a.text) for a in indexList if a]indexs +=indexreturn indexsdef novel(url):tmpFiles = []tasks = []try:indexs = index(url)tmpDir = os.path.join(os.getcwd(),'tmp')if not os.path.exists(tmpDir):             #创建章节片段存放的临时目录os.mkdir(tmpDir)for i,info in enumerate(indexs):tmpFile = os.path.join(tmpDir,str(i))tmpFiles.append(tmpFile)task = Download(tmpFile,info)            #开启新线程下载章节内容task.setDaemon(True)task.start()tasks.append(task)if len(tasks) >= 20:                  #将线程总数控制在20个以内,如果线程过多会导致程序崩溃while len([task for task in tasks if task.isAlive()]):print( '进度: {} / {}'.format(i+1-len([task for task in tasks if task.isAlive()]),len(indexs)))  #显示下载进度time.sleep(2)tasks = []if i == len(indexs) - 1:while len([task for task in tasks if task.isAlive()]):print( '进度: {} / {}'.format(len(indexs) - len([task for task in tasks if task.isAlive()]),len(indexs)))time.sleep(2)print( '进度: {} / {}'.format(len(indexs),len(indexs)))print('开始整合......')merge(tmpFiles,os.path.join(os.getcwd(),title+'.txt'))print('下载成功!')except Exception as ex:print(ex)print('下载失败!')sys.exit()
def main(argv):try:novel(argv[0])except KeyboardInterrupt as kbi:            #使用<C-c>中断下载后仍然能将已下载的章节合并tmpDir = os.path.join(os.getcwd(),'tmp')if os.path.exists(tmpDir):tmpFiles = [os.path.join(tmpDir,tfile) for tfile in os.listdir(tmpDir) if os.path.isfile(os.path.join(tmpDir,tfile))]print('开始整合不完整的下载......')try:merge(tmpFiles,os.path.join(os.getcwd(),'不完整文档.txt'))if os.path.exists(os.path.join(os.getcwd(),'不完整文档.txt')):print('部分章节下载成功!')else:print('下载失败!')except:print('下载失败!')sys.exit()os.rmdir(tmpDir)else:print('下载失败!')sys.exit()if os.path.exists(os.path.join(os.getcwd(),'tmp')):    os.rmdir(os.path.join(os.getcwd(),'tmp'))if __name__ == "__main__":if len(sys.argv) > 1:main(sys.argv[1:])#http://www.lueqiu.com/

截图:

转载于:https://www.cnblogs.com/xshrim/p/4083508.html

Python3利用BeautifulSoup4抓取站点小说全文的代码相关推荐

  1. mac python3 利用mitmproxy抓取安卓手机流量包

    最近试了一下利用mitmproxy来抓取安卓手机流量,用于分析.前面使用过Charles,但是是图形化界面的,不方便把数据存下来,mitmproxy支持python编程,容易把数据存放起来,所以这里分 ...

  2. pythonallowpos_利用Python抓取并分析京东商品评论数据

    2.1 内容简介 本章主要介绍如何利用Python抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色等颜色, 70B到90D ...

  3. 使用aiohttp 抓取起点小说网

    使用aiohttp 抓取起点小说网 主要是为了学习异步协程抓取库,包括asyncio, aiohttp,等库的用法,顺便学习.感受一下并发的速度. 所以代码也不是很难,都是直接找到小说目录接口,找到目 ...

  4. 利用wget 抓取 网站网页 包括css背景图片

    利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...

  5. 利用urllib3 抓取博客列表

    利用urllib3 抓取博客列表 分析页面代码 分析正则表达式 完整代码 分析页面代码 从这段代码中可以找到很多规律,例如,每条博客的所有信息都包含在一个 <div> 节点中,这个< ...

  6. 百度关键词抓取工具_VBA利用XMLHTTP抓取百度查询关键词结果的个数

    大家好,我们今日讲解"利用XMLHTTP抓取百度查询关键词结果的个数",这节内容是"VBA信息获取与处理"教程中第六个专题"VBA中利用XMLHTTP ...

  7. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语 ...

  8. python抓取数据包_利用python-pypcap抓取带VLAN标签的数据包方法

    1.背景介绍 在采用通常的socket抓包方式下,操作系统会自动将收到包的VLAN信息剥离,导致上层应用收到的包不会含有VLAN标签信息.而libpcap虽然是基于socket实现抓包,但在收到数据包 ...

  9. 利用Python抓取搜索引擎结果

    前一段时间一直在研究如何用python抓取搜索引擎结果,在实现的过程中遇到了很多的问题,我把我遇到的问题都记录下来,希望以后遇到同样问题的童鞋不要再走弯路. 1. 搜索引擎的选取 选择一个好的搜索引擎 ...

  10. python爬取pdf教程_#如何利用Python抓取PDF中的某些内容#python爬取pdf教程

    如何利用Python抓取PDF中的某些内容 学生每天要学习,工作者要工作,家庭主妇每都要务.不论做什么,都有着相应的操作流同样就会有操作技巧.学生运用技巧学习才不会累,学得还会更快更多:工作者掌握技巧 ...

最新文章

  1. [C] [最短路] 只有5行的算法:Floyd-Warshall
  2. 【Pandas库】(2) Series的基本操作方法
  3. 苹果手机无线充电板外部电磁场测试
  4. pypy的安装及使用介绍
  5. ora-01033:oracle initialization or shutdown in progress 解决方法
  6. boost::geometry::detail::as_range用法的测试程序
  7. java综合图形界面程序设计_java综合图形界面程序设计.doc
  8. redux 源码详解
  9. [BJOI2019]送别——非旋转treap
  10. Css制作table细线表格
  11. 节点部署_Pod在多可用区worker节点上的高可用部署
  12. python向excel写数据_Python向excel中写入数据的方法
  13. 厉害了!这款百度炼丹神器绝了!
  14. linux 安装pyaudio
  15. wincc新手之路-安装与授权
  16. 「面试必背」多线程面试题(快收藏)
  17. dw新建html快捷键,DW软件新建一个html网页
  18. GAMS系列分享13——综合能源系统——包含储能的单能源枢纽模型
  19. 回顾12306数据泄露事件
  20. 数据变现四大模式释放电信大数据价值

热门文章

  1. snmp+mrtg监控-note
  2. Linux多网卡配置高级策略路由---从哪里来就回哪里去~!
  3. 联合主键使用in和not in
  4. 驱动调试助手V2.9
  5. 实践两个servlet小项目
  6. 同学,你要的SpringBoot多图片上传回显功能已经实现了,赶紧收藏吃灰~
  7. BIO、NIO、AIO,还傻傻分不清?
  8. 用了很多年的 CMS 垃圾收集器,终于换成了 G1,真香!!
  9. Linux运维之ntpdate同步网络时间
  10. 熬夜伤身,建议通宵!