首页 > 代码库 > python 网站爬虫 下载在线盗墓笔记小说到本地的脚本
python 网站爬虫 下载在线盗墓笔记小说到本地的脚本
最近闲着没事想看小说,找到一个全是南派三叔的小说的网站,决定都下载下来看看,于是动手,在很多QQ群里高手的帮助下(本人正则表达式很烂,程序复杂的正则都是一些高手指导的),花了三四天写了一个脚本
需要 BeautifulSoup 和 requests 两个库
(我已经把注释写得尽量详细)
这个程序的执行速度很慢,求高手告诉我优化的方法!!
#-*-coding:utf8-*-from bs4 import BeautifulSoupimport requestsimport reimport os#打开网页将所需的URL读取出来放进一个列表中r = requests.get(‘http://www.nanpaisanshu.org/‘).content #打开要读取的网页content=BeautifulSoup(r).findAll(‘a‘,href=http://www.mamicode.com/re.compile(r‘\Ahttp://www.nanpaisanshu.org/[a-z]+\Z‘)) #在网页中找到需要的信息sc = str(content) #转换为string类型lists=[]lists = sc.split(‘,‘) lists = list(set(lists)) #删除列表中重复信息lisy=[]for line in lists: p=line.split(‘"‘)[1] #按 " 分割,取出需要的信息写进数组 lisy.append(p) #这里已经拥有需要的url #print p#print lisy#把读取到的URL遍历打开,将所有网页保存到html文件中s = os.getcwd()#当前路径d = os.sep #系统分隔符namef=‘aaa‘ #文件加名称#b = os.path.exists( s+d+namef) #判断是存在f=os.path.exists(s+d+namef) #判断是存在if f==False: os.mkdir(s+d+namef) #如果文件夹不存在就新建一个else: print u‘已经存在‘+nameffilenm = s+d+namef+d #路径i=1for line in lisy: r = requests.get(line) #遍历打开所有url print r.content print ‘\n‘ tfile=open(filenm+‘neirong‘+str(i)+‘.html‘,‘w‘) i=i+1 tfile.write(r.content) #将网页内容写入文件#将URL文件中的符合要求的URL读取出来写进一个txt文件中for i in range(1,len(lisy)+1): fp = open(filenm+‘neirong‘+str(i)+‘.html‘, "r") of = open(filenm+‘neirong‘+str(i)+‘.txt‘,‘w‘) content = fp.read() #将文件内容读取 p=re.compile(r‘http://www\.nanpaisanshu\.org/.*?\.html‘) #正则匹配 #print p.findall(content) #print type(p.findall(content)) for line in p.findall(content): #print line+‘\n‘ #if line !=‘http://www.nanpaisanshu.org/9701.html‘: of.write(line+‘\n‘) #将匹配到的文件写入另一个文件中 #else: #continue #of.write(str(p.findall(content)))#关闭文件of.close()fp.close()tfile.close()#将txtfor i in range(1,len(lisy)+1): ot=open(filenm+‘neirong‘+str(i)+‘.txt‘,‘r‘) outfile=open(filenm+‘quanbu‘+str(i)+‘.txt‘,‘a+‘) li=[] for line in ot: line = line.replace(‘\n‘,‘‘) li.append(line) #将url文件中的数据放进列表中 li = sorted(li) #给列表排序 for line in li: print line #line = line.replace(‘\n‘,‘‘) r = requests.get(line).content #遍历打开所有url title=BeautifulSoup(r).find("div",{‘class‘:"post_title"}).h2 #取出标题 content=BeautifulSoup(r).findAll("div",{‘class‘:"post_entry"}) #取出内容 sti=str(title).replace(‘<h2>‘,‘‘).replace(‘</h2>‘,‘‘) #处理标题,只保留文字 #处理内容,只保留文字 scon = str(content).replace(‘<p>‘,‘ ‘).replace(‘</p>‘,‘ ‘).replace(‘<br/>‘,‘\n‘) #print str(urllist) scon = re.sub("<.*>", "", scon) scon = re.sub("(.*?);","",scon) #scon = scon.strip() scon = ‘\n‘.join(scon.split()) print scon outfile.write(sti+‘\n‘+line+‘\n‘+scon) #将标题和内容写进文件中 #i=i+1 #print #print urllistprint ‘=========================下载结束=======================‘#关闭文件outfile.close()ot.close()#取出指定文件夹下的所有文件名targetDir=s+d+nameffor line in os.listdir(targetDir): p=re.compile(r‘neirong[0-9]{1}‘) #用正则匹配 if p.match(line)!=None: print "需要删除的文件"+s+d+namef+d+line+‘!!‘ os.remove(s+d+namef+d+line) #匹配成功就删除这个文件,os.remove()中需要完整路径 else: print ‘保留文件!‘ continue
有时候会显示连接失败,然后程序报错,应该判断一下 requests.get(url).status_code != 200 不过我加了以后发现运行更慢,每个页面都判断,汗,可能是因为我这里网速几K的原因才会异常
下面是修改后的完善版,慎用,速度极其的慢,判断的东西和次数增加的缘故:
#-*-coding:utf8-*-#下载盗墓笔记小说#2014-10-14#ZJLfrom bs4 import BeautifulSoupimport requestsimport reimport os#打开网页将所需的URL读取出来放进一个列表中r = requests.get(‘http://www.nanpaisanshu.org/‘).content #打开要读取的网页content=BeautifulSoup(r).findAll(‘a‘,href=http://www.mamicode.com/re.compile(r‘\Ahttp://www.nanpaisanshu.org/[a-z]+\Z‘)) #在网页中找到需要的信息sc = str(content) #转换为string类型lists=[]lists = sc.split(‘,‘) lists = list(set(lists)) #删除列表中重复信息lisy=[]for line in lists: p=line.split(‘"‘)[1] #按 " 分割,取出需要的信息写进数组 lisy.append(p) #这里已经拥有需要的url #print p#print lisy#把读取到的URL遍历打开,将所有网页保存到html文件中s = os.getcwd()#当前路径d = os.sep #系统分隔符namef=‘aaa‘ #文件加名称#b = os.path.exists( s+d+namef) #判断是存在f=os.path.exists(s+d+namef) #判断是存在if f==False: os.mkdir(s+d+namef) #如果文件夹不存在就新建一个else: print u‘已经存在‘+nameffilenm = s+d+namef+d #路径i=1for line in lisy: r = requests.get(line) #遍历打开所有url print r.content print ‘\n‘ tfile=open(filenm+‘neirong‘+str(i)+‘.html‘,‘w‘) i=i+1 tfile.write(r.content) #将网页内容写入文件#将URL文件中的符合要求的URL读取出来写进一个txt文件中for i in range(1,len(lisy)+1): fp = open(filenm+‘neirong‘+str(i)+‘.html‘, "r") of = open(filenm+‘neirong‘+str(i)+‘.txt‘,‘w‘) content = fp.read() #将文件内容读取 p=re.compile(r‘http://www\.nanpaisanshu\.org/.*?\.html‘) #正则匹配 #print p.findall(content) #print type(p.findall(content)) for line in p.findall(content): #print line+‘\n‘ #if line !=‘http://www.nanpaisanshu.org/9701.html‘: of.write(line+‘\n‘) #将匹配到的文件写入另一个文件中 #else: #continue #of.write(str(p.findall(content)))#关闭文件of.close()fp.close()tfile.close()#将txtfor i in range(1,len(lisy)+1): ot=open(filenm+‘neirong‘+str(i)+‘.txt‘,‘r‘) if os.path.exists(filenm+‘quanbu‘+str(i)+‘.txt‘)==True: print "已经存在"+filenm+‘quanbu‘+str(i)+‘.txt‘+‘会先删除再创建‘ os.remove(filenm+‘quanbu‘+str(i)+‘.txt‘) outfile=open(filenm+‘quanbu‘+str(i)+‘.txt‘,‘a+‘) #防止第二次下载时内容在文件后面追加(不知道会不会重新新建文件覆盖掉原来的文件所以这么做) else: print "新建"+filenm+‘quanbu‘+str(i)+‘.txt‘ outfile=open(filenm+‘quanbu‘+str(i)+‘.txt‘,‘a+‘) li=[] for line in ot: line = line.replace(‘\n‘,‘‘) li.append(line) #将url文件中的数据放进列表中 li = sorted(li) #给列表排序 for line in li: #print line #line = line.replace(‘\n‘,‘‘) if requests.get(line).status_code != 200: print ‘因为网络原因,这个章节为空!‘ outfile.write(‘因为网络原因,这个章节为空‘) #判断网络连接情况,防止连接失败后程序报错 elif requests.get(line).status_code == 200: print ‘连接成功!‘ r = requests.get(line).content #遍历打开所有url title=BeautifulSoup(r).find("div",{‘class‘:"post_title"}).h2 #取出标题 content=BeautifulSoup(r).findAll("div",{‘class‘:"post_entry"}) #取出内容 sti=str(title).replace(‘<h2>‘,‘‘).replace(‘</h2>‘,‘‘) #处理标题,只保留文字 #处理内容,只保留文字 scon = str(content).replace(‘<p>‘,‘ ‘).replace(‘</p>‘,‘ ‘).replace(‘<br/>‘,‘\n‘) #print str(urllist) scon = re.sub("<.*>", "", scon) scon = re.sub("(.*?);","",scon) #scon = scon.strip() scon = ‘\n‘.join(scon.split()) print scon outfile.write(sti+‘\n‘+line+‘\n‘+scon) #将标题,链接,内容写进文件中 #i=i+1 #print #print urllistprint ‘=========================下载结束=======================‘#关闭文件outfile.close()ot.close()#取出指定文件夹下的所有文件名targetDir=s+d+nameffor line in os.listdir(targetDir): p=re.compile(r‘neirong[0-9]{1}‘) #用正则匹配 if p.match(line)!=None: print "需要删除的文件"+s+d+namef+d+line+‘!!‘ os.remove(s+d+namef+d+line) #匹配成功就删除这个文件,os.remove()中需要完整路径 else: print ‘保留文件!‘ continue
python 网站爬虫 下载在线盗墓笔记小说到本地的脚本
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。