python 网站爬虫 下载在线盗墓笔记小说到本地的脚本

妖狐艹你老母 2022-08-13 06:00 244阅读 0赞

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

需要 BeautifulSoup 和 requests 两个库

(我已经把注释写得尽量详细)

这个程序的执行速度很慢,求高手告诉我优化的方法!!

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

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

下面是修改后的完善版,慎用,速度极其的慢,判断的东西和次数增加的缘故:

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

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python自动下载小说

    大家好呀,空虚且漫长的三天小长假终于过去了,,哈哈哈哈,又是一个愉快的周一 ![在这里插入图片描述][20200106095612416.png] 刚到公司还没坐下,我

    相关 java爬虫下载txt小说

    最近迷上了天蚕土豆写的《大主宰》这本玄幻小说,无奈找不到下载链接。于是就萌生了自己爬取小说章节的想法,代码其实很简单,主要在于分析网页结构、正则匹配以及文件保存. 1