近期闲着没事想看小说,找到一个全是南派三叔的小说的站点,决定都下载下来看看,于是动手,在非常多QQ群里高手的帮助下(本人正則表達式非常烂。程序复杂的正则都是一些高手指导的),花了三四天写了一个脚本

须要 BeautifulSoup 和 requests 两个库

(我已经把凝视写得尽量具体)

这个程序的运行速度非常慢,求高手告诉我优化的方法。!

  1. #-*-coding:utf8-*-
  2.  
  3. from bs4 import BeautifulSoup
  4. import requests
  5. import re
  6. import os
  7.  
  8. #打开网页将所需的URL读取出来放进一个列表中
  9. r = requests.get('http://www.nanpaisanshu.org/').content #打开要读取的网页
  10. content=BeautifulSoup(r).findAll('a',href=re.compile(r'\Ahttp://www.nanpaisanshu.org/[a-z]+\Z')) #在网页中找到须要的信息
  11.  
  12. sc = str(content) #转换为string类型
  13.  
  14. lists=[]
  15. lists = sc.split(',')
  16. lists = list(set(lists)) #删除列表中反复信息
  17.  
  18. lisy=[]
  19.  
  20. for line in lists:
  21. p=line.split('"')[1] #按 " 切割,取出须要的信息写进数组
  22. lisy.append(p) #这里已经拥有须要的url
  23. #print p
  24. #print lisy
  25.  
  26. #把读取到的URL遍历打开,将全部网页保存到html文件里
  27.  
  28. s = os.getcwd()#当前路径
  29.  
  30. d = os.sep #系统分隔符
  31.  
  32. namef='aaa' #文件加名称
  33.  
  34. #b = os.path.exists( s+d+namef) #推断是存在
  35.  
  36. f=os.path.exists(s+d+namef) #推断是存在
  37.  
  38. if f==False:
  39. os.mkdir(s+d+namef) #假设目录不存在就新建一个
  40. else:
  41. print u'已经存在'+namef
  42.  
  43. filenm = s+d+namef+d #路径
  44.  
  45. i=1
  46. for line in lisy:
  47. r = requests.get(line) #遍历打开全部url
  48. print r.content
  49. print '\n'
  50. tfile=open(filenm+'neirong'+str(i)+'.html','w')
  51. i=i+1
  52. tfile.write(r.content) #将网页内容写入文件
  53.  
  54. #将URL文件里的符合要求的URL读取出来写进一个txt文件里
  55. for i in range(1,len(lisy)+1):
  56. fp = open(filenm+'neirong'+str(i)+'.html', "r")
  57. of = open(filenm+'neirong'+str(i)+'.txt','w')
  58. content = fp.read() #将文件内容读取
  59.  
  60. p=re.compile(r'http://www\.nanpaisanshu\.org/.*?\.html') #正则匹配
  61.  
  62. #print p.findall(content)
  63.  
  64. #print type(p.findall(content))
  65.  
  66. for line in p.findall(content):
  67. #print line+'\n'
  68. #if line !='http://www.nanpaisanshu.org/9701.html':
  69. of.write(line+'\n') #将匹配到的文件写入还有一个文件里
  70. #else:
  71. #continue
  72.  
  73. #of.write(str(p.findall(content)))
  74.  
  75. #关闭文件
  76. of.close()
  77. fp.close()
  78. tfile.close()
  79.  
  80. #将txt
  81.  
  82. for i in range(1,len(lisy)+1):
  83. ot=open(filenm+'neirong'+str(i)+'.txt','r')
  84. outfile=open(filenm+'quanbu'+str(i)+'.txt','a+')
  85.  
  86. li=[]
  87. for line in ot:
  88. line = line.replace('\n','')
  89. li.append(line) #将url文件里的数据放进列表中
  90.  
  91. li = sorted(li) #给列表排序
  92.  
  93. for line in li:
  94. print line
  95. #line = line.replace('\n','')
  96. r = requests.get(line).content #遍历打开全部url
  97. title=BeautifulSoup(r).find("div",{'class':"post_title"}).h2 #取出标题
  98. content=BeautifulSoup(r).findAll("div",{'class':"post_entry"}) #取出内容
  99. sti=str(title).replace('<h2>','').replace('</h2>','') #处理标题。仅仅保留文字
  100.  
  101. #处理内容,仅仅保留文字
  102. scon = str(content).replace('<p>',' ').replace('</p>',' ').replace('<br/>','\n')
  103. #print str(urllist)
  104. scon = re.sub("<.*>", "", scon)
  105. scon = re.sub("(.*?
  106.  
  107. );","",scon)
  108. #scon = scon.strip()
  109. scon = '\n'.join(scon.split())
  110.  
  111. print scon
  112. outfile.write(sti+'\n'+line+'\n'+scon) #将标题和内容写进文件里
  113. #i=i+1
  114. #print
  115. #print urllist
  116.  
  117. print '=========================下载结束======================='
  118.  
  119. #关闭文件
  120. outfile.close()
  121. ot.close()
  122.  
  123. #取出指定目录下的全部文件名称
  124. targetDir=s+d+namef
  125. for line in os.listdir(targetDir):
  126.  
  127. p=re.compile(r'neirong[0-9]{1}') #用正则匹配
  128. if p.match(line)!=None:
  129. print "须要删除的文件"+s+d+namef+d+line+'!!'
  130. os.remove(s+d+namef+d+line) #匹配成功就删除这个文件,os.remove()中须要完整路径
  131. else:
  132. print '保留文件!'
  133. continue

有时候会显示连接失败,然后程序报错,应该推断一下  requests.get(url).status_code != 200  只是我加了以后发现执行更慢,每一个页面都推断,汗,可能是由于我这里网速几K的原因才会异常

以下是改动后的完好版,慎用,速度极其的慢。推断的东西和次数添加的缘故:

  1. #-*-coding:utf8-*-
  2.  
  3. #下载盗墓笔记小说
  4. #2014-10-14
  5. #ZJL
  6.  
  7. from bs4 import BeautifulSoup
  8. import requests
  9. import re
  10. import os
  11.  
  12. #打开网页将所需的URL读取出来放进一个列表中
  13. r = requests.get('http://www.nanpaisanshu.org/').content #打开要读取的网页
  14. content=BeautifulSoup(r).findAll('a',href=re.compile(r'\Ahttp://www.nanpaisanshu.org/[a-z]+\Z')) #在网页中找到须要的信息
  15.  
  16. sc = str(content) #转换为string类型
  17.  
  18. lists=[]
  19. lists = sc.split(',')
  20. lists = list(set(lists)) #删除列表中反复信息
  21.  
  22. lisy=[]
  23.  
  24. for line in lists:
  25. p=line.split('"')[1] #按 " 切割,取出须要的信息写进数组
  26. lisy.append(p) #这里已经拥有须要的url
  27. #print p
  28. #print lisy
  29.  
  30. #把读取到的URL遍历打开。将全部网页保存到html文件里
  31.  
  32. s = os.getcwd()#当前路径
  33.  
  34. d = os.sep #系统分隔符
  35.  
  36. namef='aaa' #文件加名称
  37.  
  38. #b = os.path.exists( s+d+namef) #推断是存在
  39.  
  40. f=os.path.exists(s+d+namef) #推断是存在
  41.  
  42. if f==False:
  43. os.mkdir(s+d+namef) #假设目录不存在就新建一个
  44. else:
  45. print u'已经存在'+namef
  46.  
  47. filenm = s+d+namef+d #路径
  48.  
  49. i=1
  50. for line in lisy:
  51. r = requests.get(line) #遍历打开全部url
  52. print r.content
  53. print '\n'
  54. tfile=open(filenm+'neirong'+str(i)+'.html','w')
  55. i=i+1
  56. tfile.write(r.content) #将网页内容写入文件
  57.  
  58. #将URL文件里的符合要求的URL读取出来写进一个txt文件里
  59. for i in range(1,len(lisy)+1):
  60. fp = open(filenm+'neirong'+str(i)+'.html', "r")
  61. of = open(filenm+'neirong'+str(i)+'.txt','w')
  62. content = fp.read() #将文件内容读取
  63.  
  64. p=re.compile(r'http://www\.nanpaisanshu\.org/.*?
  65.  
  66. \.html') #正则匹配
  67.  
  68. #print p.findall(content)
  69.  
  70. #print type(p.findall(content))
  71.  
  72. for line in p.findall(content):
  73. #print line+'\n'
  74. #if line !='http://www.nanpaisanshu.org/9701.html':
  75. of.write(line+'\n') #将匹配到的文件写入还有一个文件里
  76. #else:
  77. #continue
  78.  
  79. #of.write(str(p.findall(content)))
  80.  
  81. #关闭文件
  82. of.close()
  83. fp.close()
  84. tfile.close()
  85.  
  86. #将txt
  87.  
  88. for i in range(1,len(lisy)+1):
  89. ot=open(filenm+'neirong'+str(i)+'.txt','r')
  90. if os.path.exists(filenm+'quanbu'+str(i)+'.txt')==True:
  91. print "已经存在"+filenm+'quanbu'+str(i)+'.txt'+'会先删除再创建'
  92. os.remove(filenm+'quanbu'+str(i)+'.txt')
  93. outfile=open(filenm+'quanbu'+str(i)+'.txt','a+') #防止第二次下载时内容在文件后面追加(不知道会不会又一次新建文件覆盖掉原来的文件所以这么做)
  94.  
  95. else:
  96. print "新建"+filenm+'quanbu'+str(i)+'.txt'
  97. outfile=open(filenm+'quanbu'+str(i)+'.txt','a+')
  98.  
  99. li=[]
  100. for line in ot:
  101. line = line.replace('\n','')
  102. li.append(line) #将url文件里的数据放进列表中
  103.  
  104. li = sorted(li) #给列表排序
  105.  
  106. for line in li:
  107. #print line
  108. #line = line.replace('\n','')
  109.  
  110. if requests.get(line).status_code != 200:
  111. print '由于网络原因,这个章节为空!'
  112. outfile.write('由于网络原因。这个章节为空') #推断网络连接情况,防止连接失败后程序报错
  113. elif requests.get(line).status_code == 200:
  114. print '连接成功!'
  115. r = requests.get(line).content #遍历打开全部url
  116. title=BeautifulSoup(r).find("div",{'class':"post_title"}).h2 #取出标题
  117. content=BeautifulSoup(r).findAll("div",{'class':"post_entry"}) #取出内容
  118. sti=str(title).replace('<h2>','').replace('</h2>','') #处理标题。仅仅保留文字
  119.  
  120. #处理内容,仅仅保留文字
  121. scon = str(content).replace('<p>',' ').replace('</p>',' ').replace('<br/>','\n')
  122. #print str(urllist)
  123. scon = re.sub("<.*>", "", scon)
  124. scon = re.sub("(.*?);","",scon)
  125. #scon = scon.strip()
  126. scon = '\n'.join(scon.split())
  127.  
  128. print scon
  129. outfile.write(sti+'\n'+line+'\n'+scon) #将标题。链接,内容写进文件里
  130. #i=i+1
  131. #print
  132. #print urllist
  133.  
  134. print '=========================下载结束======================='
  135.  
  136. #关闭文件
  137. outfile.close()
  138. ot.close()
  139.  
  140. #取出指定目录下的全部文件名称
  141. targetDir=s+d+namef
  142. for line in os.listdir(targetDir):
  143.  
  144. p=re.compile(r'neirong[0-9]{1}') #用正则匹配
  145. if p.match(line)!=None:
  146. print "须要删除的文件"+s+d+namef+d+line+'!!'
  147. os.remove(s+d+namef+d+line) #匹配成功就删除这个文件,os.remove()中须要完整路径
  148. else:
  149. print '保留文件。'
  150. continue

python 站点爬虫 下载在线盗墓笔记小说到本地的脚本的更多相关文章

  1. Python 应用爬虫下载QQ音乐

    Python应用爬虫下载QQ音乐 目录: 1.简介怎样实现下载QQ音乐的过程: 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网: https://y.qq.com/,在搜索栏上输入一首 ...

  2. Python 应用爬虫下载酷狗音乐

    应用爬虫下载酷狗音乐 首先我们需要进入到这个界面 想要爬取这些歌曲链接,然而这个是一个假的网站,虽然单机右键进行检查能看到这些歌曲的链接,可进行爬取时,却爬取不到这些信息. 这个时候我们就应该换一种思 ...

  3. python3爬虫——下载unsplash美图到本地

    最近发现一个网站www.unsplash.com ( 没有广告费哈,纯粹觉得不错 ),网页做得很美观,上面也都是一些免费的摄影照片,觉得很好看,就决定利用蹩脚的技能写个爬虫下载图片. 先随意感受一下这 ...

  4. Python网络爬虫 - 下载图片

    下载博客园的logo from urllib.request import urlretrieve from urllib.request import urlopen from bs4 import ...

  5. python从爬虫基础到爬取网络小说实例

    一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...

  6. 初次尝试python爬虫,爬取小说网站的小说。

    本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...

  7. 从零开始学Python网络爬虫PDF高清完整版免费下载|百度网盘

    百度网盘:从零开始学Python网络爬虫PDF高清完整版免费下载 提取码:wy36 目录 前言第1章 Python零基础语法入门 11.1 Python与PyCharm安装 11.1.1 Python ...

  8. python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...

  9. python简易爬虫来实现自动图片下载

    菜鸟新人刚刚入住博客园,先发个之前写的简易爬虫的实现吧,水平有限请轻喷. 估计利用python实现爬虫的程序网上已经有太多了,不过新人用来练手学习python确实是个不错的选择.本人借鉴网上的部分实现 ...

随机推荐

  1. 【Eclipse】修改java代码不强制重启

    找到tomcat的server.xml文件,修改以下代码,重新发布重启.然后修改java代码就可以不用重启了. 将reloadable=“true”改成reloadable="false&q ...

  2. LINQ简单案例

    1.在visual studio 创建一个解决方案,新建一个控制台程序Kong 2.新建两个类,分别为Master 类和Kongfu类  Master类中包含成员如下,并重写ToString方法 na ...

  3. BZOJ 2435: [Noi2011]道路修建( dfs )

    NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...

  4. [javascript]在浏览器端应用cookie记住用户名

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 从零搭建LNMP环境

    Linux就是环境所在的操作系统: Nginx则是一个「高性能的HTTP和反向代理服务器」,官网地址:http://nginx.org/: MySQL则是一个方便地对数据进行增删改查的数据库管理系统, ...

  6. [转]TOMCAT原理以及处理HTTP请求的过程、ContextPath ServletPath

    一.TOMCAT 1 - Tomcat Server的组成部分 <Server>     <Service>         <Connector/>        ...

  7. Chapter 12 外观模式

    外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个模式使得这一子系统更加容易使用. 外观模式三个阶段: 首先,在设计初期阶段,应该要有意识的将不同的两个层分离. 其次,在 ...

  8. Week3(9月23日):例子更Powerful更完整了,哇咔咔

    Part I:提问  =========================== 1.控制器中动作方法的返回类型有哪些? 2.如果控制器代码如下,请问浏览器中如何输入什么路由访问? public clas ...

  9. c语言‘\0’ ,‘0’, “0” ,0之间的区别

    首先比较一下‘\0’和‘0’的区别.有一个共同点就是它们都是字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节.请翻开你的ASCII字符集表吧,一般在你的C语言教材的附录上, ...

  10. oschina插件和扩展

    Eclipse插件 2551FireFox插件 14IE插件 19Prototype扩展 220Chrome插件/扩展 72WordPress插件 33NetBeans插件 12IDEA插件 25Xc ...