python 站点爬虫 下载在线盗墓笔记小说到本地的脚本
近期闲着没事想看小说,找到一个全是南派三叔的小说的站点,决定都下载下来看看,于是动手,在非常多QQ群里高手的帮助下(本人正則表達式非常烂。程序复杂的正则都是一些高手指导的),花了三四天写了一个脚本
须要 BeautifulSoup 和 requests 两个库
(我已经把凝视写得尽量具体)
这个程序的运行速度非常慢,求高手告诉我优化的方法。!
- #-*-coding:utf8-*-
- from bs4 import BeautifulSoup
- import requests
- import re
- import os
- #打开网页将所需的URL读取出来放进一个列表中
- r = requests.get('http://www.nanpaisanshu.org/').content #打开要读取的网页
- content=BeautifulSoup(r).findAll('a',href=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'已经存在'+namef
- filenm = s+d+namef+d #路径
- i=1
- for 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()
- #将txt
- for 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 urllist
- print '=========================下载结束======================='
- #关闭文件
- outfile.close()
- ot.close()
- #取出指定目录下的全部文件名称
- targetDir=s+d+namef
- for 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
- #ZJL
- from bs4 import BeautifulSoup
- import requests
- import re
- import os
- #打开网页将所需的URL读取出来放进一个列表中
- r = requests.get('http://www.nanpaisanshu.org/').content #打开要读取的网页
- content=BeautifulSoup(r).findAll('a',href=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'已经存在'+namef
- filenm = s+d+namef+d #路径
- i=1
- for 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()
- #将txt
- for 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 urllist
- print '=========================下载结束======================='
- #关闭文件
- outfile.close()
- ot.close()
- #取出指定目录下的全部文件名称
- targetDir=s+d+namef
- for 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 站点爬虫 下载在线盗墓笔记小说到本地的脚本的更多相关文章
- Python 应用爬虫下载QQ音乐
Python应用爬虫下载QQ音乐 目录: 1.简介怎样实现下载QQ音乐的过程: 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网: https://y.qq.com/,在搜索栏上输入一首 ...
- Python 应用爬虫下载酷狗音乐
应用爬虫下载酷狗音乐 首先我们需要进入到这个界面 想要爬取这些歌曲链接,然而这个是一个假的网站,虽然单机右键进行检查能看到这些歌曲的链接,可进行爬取时,却爬取不到这些信息. 这个时候我们就应该换一种思 ...
- python3爬虫——下载unsplash美图到本地
最近发现一个网站www.unsplash.com ( 没有广告费哈,纯粹觉得不错 ),网页做得很美观,上面也都是一些免费的摄影照片,觉得很好看,就决定利用蹩脚的技能写个爬虫下载图片. 先随意感受一下这 ...
- Python网络爬虫 - 下载图片
下载博客园的logo from urllib.request import urlretrieve from urllib.request import urlopen from bs4 import ...
- python从爬虫基础到爬取网络小说实例
一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...
- 初次尝试python爬虫,爬取小说网站的小说。
本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...
- 从零开始学Python网络爬虫PDF高清完整版免费下载|百度网盘
百度网盘:从零开始学Python网络爬虫PDF高清完整版免费下载 提取码:wy36 目录 前言第1章 Python零基础语法入门 11.1 Python与PyCharm安装 11.1.1 Python ...
- python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...
- python简易爬虫来实现自动图片下载
菜鸟新人刚刚入住博客园,先发个之前写的简易爬虫的实现吧,水平有限请轻喷. 估计利用python实现爬虫的程序网上已经有太多了,不过新人用来练手学习python确实是个不错的选择.本人借鉴网上的部分实现 ...
随机推荐
- 【Eclipse】修改java代码不强制重启
找到tomcat的server.xml文件,修改以下代码,重新发布重启.然后修改java代码就可以不用重启了. 将reloadable=“true”改成reloadable="false&q ...
- LINQ简单案例
1.在visual studio 创建一个解决方案,新建一个控制台程序Kong 2.新建两个类,分别为Master 类和Kongfu类 Master类中包含成员如下,并重写ToString方法 na ...
- BZOJ 2435: [Noi2011]道路修建( dfs )
NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...
- [javascript]在浏览器端应用cookie记住用户名
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 从零搭建LNMP环境
Linux就是环境所在的操作系统: Nginx则是一个「高性能的HTTP和反向代理服务器」,官网地址:http://nginx.org/: MySQL则是一个方便地对数据进行增删改查的数据库管理系统, ...
- [转]TOMCAT原理以及处理HTTP请求的过程、ContextPath ServletPath
一.TOMCAT 1 - Tomcat Server的组成部分 <Server> <Service> <Connector/> ...
- Chapter 12 外观模式
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个模式使得这一子系统更加容易使用. 外观模式三个阶段: 首先,在设计初期阶段,应该要有意识的将不同的两个层分离. 其次,在 ...
- Week3(9月23日):例子更Powerful更完整了,哇咔咔
Part I:提问 =========================== 1.控制器中动作方法的返回类型有哪些? 2.如果控制器代码如下,请问浏览器中如何输入什么路由访问? public clas ...
- c语言‘\0’ ,‘0’, “0” ,0之间的区别
首先比较一下‘\0’和‘0’的区别.有一个共同点就是它们都是字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节.请翻开你的ASCII字符集表吧,一般在你的C语言教材的附录上, ...
- oschina插件和扩展
Eclipse插件 2551FireFox插件 14IE插件 19Prototype扩展 220Chrome插件/扩展 72WordPress插件 33NetBeans插件 12IDEA插件 25Xc ...