近期闲着没事想看小说,找到一个全是南派三叔的小说的站点,决定都下载下来看看,于是动手,在非常多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
#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
#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 站点爬虫 下载在线盗墓笔记小说到本地的脚本的更多相关文章

  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. C#个人笔记

    1.扩展方法:类名前面加static ,方法参数前 加this,如:对string类进行扩展 public static class string    {        public static ...

  2. 【Web】CGI与Servlet技术对比

    CGI:Common Gateway Interface,通用网关接口. 1.CGI处理步骤 首先,客户端(即Web浏览器)根据某资源的URL向Web服务器提出请求:Web服务器的守护进程(HTTP ...

  3. codeblock快捷键

    一款开源的C/C++ IDE(集成开发环境),基于wxWidgets GUI体系,跨平台支持. 从别处粘贴的,方便以后看,啦啦啦…… 编辑器 快捷键 功能 Ctrl+Z 恢复上一次操作 Ctrl+Sh ...

  4. Python3.5.1 下使用HTMLParser报错

    pip 安装HTMLParser之后,import HTMLParser 使用的时候,报错"ImportError:Can't not find module markupbase" ...

  5. 笔记之Cyclone IV 第一卷第二章Cyclone IV器件的逻辑单元和逻辑阵

    逻辑单元 (LE) 在 Cyclone IV 器件结构中是最小的逻辑单位.LE 紧密且有效的提供了高级功能的逻辑使用.每个 LE 有以下特性 ■ 一个四口输入的查找表 (LUT),以实现四种变量的任何 ...

  6. JSpider是一个用Java实现的WebSpider

    JSpider是一个用Java实现的WebSpider,JSpider的执行格式如下: jspider [URL] [ConfigName] URL一定要加上协议名称,如:http://,否则会报错. ...

  7. WTL---WxWidget---MFC 何去何从

    C++程序员打交道最多的就是MFC了,这个我不想多说,说来都是泪(C#年年更新,C++十年才出了一个featurePack还不是很好用) 现在另外两支队伍越来越庞大(所谓穷则思变,呵呵),一是WTL, ...

  8. Spark Core源代码分析: Spark任务模型

    概述 一个Spark的Job分为多个stage,最后一个stage会包含一个或多个ResultTask,前面的stages会包含一个或多个ShuffleMapTasks. ResultTask运行并将 ...

  9. MySQL教程及经常使用命令1.1

    在线教程 21分钟 MySQL 新手教程 w3school在线教程(MYSQL) 变量 查看系统变量 show global variables 查看详细变量 show global variable ...

  10. Duanxx的C++得知:计算位数

    一旦计算出一个数值数字,基本上它是不断分裂使用10.重新计,看看有多少个数字. 今天发现能够考虑先将数字转换为字符串,然后通过string.length获得数值的位数,这样做方便的多. string ...