TXT 文件?? (笑

这里爬的是 74xsw (咱好像也不怎么逛的网站)的英雄再临 ...

请注意这并不是教程,只是贴个代码仅供参考而已【雾

这里 用的 getTXT 的方式有两种,一种是每个章节分开 save ,另一种就是所有章节存进一个 TXT (然后你打开的时候可能会发现 notepad 炸掉了,虽说 notepad++ 貌似就不会有这个问题)

如果提示 Reloading 什么的话 ,呵呵,应该是这个网站又挂了(莫不是很多人拿这个网站爬虫练手???艹) ,是这个网站服务器不够强大,并不是你的问题(当然是你的问题也说不准)

不过 Reloading 最多 十来次就完事儿了吧...否则可能出了大问题 (请找出这句话的语病【雾)

另外如果说 你把代码关掉重开了的话他是会重头再存的(因为博主并没有考虑如何解决断线重连的问题,可能想到了然鹅懒得去搞,毕竟手调也挺快了 【滑稽】)

对于单个文件的存储这影响不大,毕竟就是浪费点时间,对于总文件存储的话,由于存储机制是每次向文档末尾 append 一个章节的内容,所以会有章节重复之类的大雾

所以说你可以删了文件重搞??? 或者说把代码里面的 Cnt>0 换换(换成 Cnt>x , x 为上一次存储的文档),这样就可以顺利解决这个问题辣

如果你觉得自己爬这个网站烧服务器良心有愧【雾】,可以在每次爬完一章之后 sleep 一下(咱一开始是这么弄的...)

顺便提一句,有些网站会搞些什么反爬装置,可能就是看你同一个 ip 的访问频率很机器(咳咳),就会给你 forbidden 之类的,这种情况你也可以用 sleep 一个随机的时间来解决...吧

貌似还有一个模拟火狐浏览器,google 浏览器访问网站之类的方法,可以逃过一些反爬识别的方法,但是咱没有弄【懒

Code



import os
import re
import urllib
import urllib.request
import ssl
import time # -- coding: utf-8 -- def getHtmlCode(Url):
html=urllib.request.urlopen(Url).read()
html=html.decode("gbk") reg=r'<li class="chapter"><a href="(.*?)">(.*?)</a></li>'
reg=re.compile(reg)
urls=re.findall(reg, html)
return urls def make_dir(floder): #create a path
path='F:\\PY\\'+floder+'\\'
if not os.path.isdir(path):
os.makedirs(path)
return path ############################### For single save ####################################### class SingleSave(object):
pass def saveTXT(self, url, title):
chapter_html=urllib.request.urlopen(url).read()
chapter_html=chapter_html.decode('gbk','ignore')
chapter_reg = r'&nbsp;&nbsp;&nbsp;&nbsp;(.*?)(<br />|&lt;/p&gt;</div>)'
chapter_reg=re.compile(chapter_reg, re.S)
chapter_content=re.findall(chapter_reg, chapter_html)
path=make_dir('TXT')
f=open('{}{}.txt'.format(path,title), 'w', encoding='gbk')
for content in chapter_content:
want=content[0]
want=want.replace("&nbsp;&nbsp;&nbsp;&nbsp;","")
want=want.replace("&nbsp;&nbsp;","\r\n ")
want=' '+want+'\r\n'
#print(want)
f.write(want)
f.close()
return 'Saved Complete' def stableSaveTXT(self, url, title):
try:
assert saveTXT(url,title)=='Saved Complete'
except:
print('Something goes wrong. Reloading... Please wait a moment')
stableSaveTXT(url,title) def getTXT(self, urls, Pre):
Cnt=1
print('Start downloading...')
for url in urls:
#print(url)
if Cnt>0:
chapter_url=url[0]
chapter_title=url[1]
stableSaveTXT(Pre+chapter_url, str(Cnt)+'-'+chapter_title)
print("The "+str(Cnt)+'th TXT is downloaded!')
time.sleep(0.5)
Cnt=Cnt+1 #################################### For total save ###################################### class TotSave(object):
pass def TOTsaveTXT(self, url, title):
chapter_html=urllib.request.urlopen(url).read()
chapter_html=chapter_html.decode('gbk','ignore')
chapter_reg = r'&nbsp;&nbsp;&nbsp;&nbsp;(.*?)(<br />|&lt;/p&gt;</div>)'
chapter_reg=re.compile(chapter_reg, re.S)
chapter_content=re.findall(chapter_reg, chapter_html)
path=make_dir('TXT')
f=open('{}{}.txt'.format(path,'0-TOT'), 'a',encoding='gbk')
f.write("\r\n"+title+"\r\n")
for content in chapter_content:
want=content[0]
want=want.replace("&nbsp;&nbsp;&nbsp;&nbsp;","")
want=want.replace("&nbsp;&nbsp;","\r\n ")
want=' '+want+'\r\n'
#print(want)
f.write(want)
f.close()
return 'Saved Complete' def TOTstableSaveTXT(self, url, title):
try:
assert TOTsaveTXT(url,title)=='Saved Complete'
except:
print('Something goes wrong. Reloading... Please wait a moment')
TOTstableSaveTXT(url,title) def TOTgetTXT(self, urls, Pre):
Cnt=1
print('Start downloading...')
for url in urls:
#print(url)
if Cnt>0:
chapter_url=url[0]
chapter_title=url[1]
TOTstableSaveTXT(Pre+chapter_url, str(Cnt)+'-'+chapter_title)
print("The "+str(Cnt)+'th TXT is downloaded!')
time.sleep(0.5)
Cnt=Cnt+1
print('Download Completely!') ############################################################################### if __name__=='__main__':
urllist=getHtmlCode('https://www.74xsw.com/9_9353/')
print('Got the urllist!')
TotSave().TOTgetTXT(urllist,'https://www.74xsw.com/')
print('All Done.\n')

优雅的用两种方式爬网络 txt 文件【雾的更多相关文章

  1. 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  2. (转)DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...

  3. 【转】DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...

  4. DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接 ...

  5. 这里介绍两种将矩阵写入TXT文件的方法。

    方法1 fid = fopen('data.txt','wt'); % data.txt为写入文件名 matrix = M; % M为要存储的矩阵 [m,n]=size(matrix); for i= ...

  6. [Swift]Alamofire:设置网络请求超时时间【timeout】的两种方式

    两种方式作用相同,是同一套代码的两种表述. 第一种方式:集聚. 直接设置成员属性(全局属性),这种方法不能灵活修改网络请求超时时间timeout. 声明为成员属性: // MARK: - 设置为全局变 ...

  7. WebView加载页面的两种方式——网络页面和本地页面

    WebView加载页面的两种方式 一.加载网络页面 加载网络页面,是最简单的一种方式,只需要传入http的URL就可以,实现WebView加载网络页面 代码如下图: 二.加载本地页面 1.加载asse ...

  8. 解决 SharePoint 2010 拒绝访问爬网内容源错误的小技巧(禁用环回请求的两种方式)

    这里有一条解决在SharePoint 2010搜索爬网时遇到的“拒绝访问错误”的小技巧. 首先要检查默认内容访问帐户是否具有相应的访问权限,或者添加一条相应的爬网规则.如果目标资源库是一个ShareP ...

  9. iOS 通过URL网络获取XML数据的两种方式

    转载于:http://blog.csdn.net/crayondeng/article/details/8738768 下面简单介绍如何通过url获取xml的两种方式. 第一种方式相对简单,使用NSD ...

随机推荐

  1. POJ 3613 [ Cow Relays ] DP,矩阵乘法

    解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...

  2. R_Studio(聚类)针对iris数据比较几种聚类方法优劣

    聚类分析 百度百科:传送门 聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程 聚类与分类的不同在于,聚类所要求划分的类是未知的 聚类分析是一种探索性的分析,在分类的过程中,人们 ...

  3. 实现图像添加label

    void CmapwingisTest2View::OnToolsAddTiffLayer() { TCHAR szFilters[]= _T("TIFF Files (*.tif)|*.t ...

  4. C++入门经典-例2.1-利用实数精度进行实数比较

    1:代码如下: // 2.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" void main() { float eps = 0.000 ...

  5. SSM三大框架整合配置详解

    首先,导入框架所需要的全部jar包(此处省略...........) 第一步:先从mybatis框架开始 我们只需要在mybatis的核心配置文件sqlConfigXml里写上这么一段话,代表的是给p ...

  6. TCP定时器 之 重传/延迟ACK/保活 定时器初始化

    创建socket时会创建传输控制块,之后调用初始化函数对控制块进行初始化,其中包括对定时器的初始化,tcp会调用tcp_init_xmit_timers函数来初始化这些定时器,本文将详细分析tcp_i ...

  7. Ajax+PHP实现的进度条--实例

    之前重点学习PHP,所以javascript.Ajax都比较弱一点.现在也开始补课了,今天实现了一个进度条的例子,感觉Ajax实现动态页面真的很厉害,并没有想象中的那么难理解. 进度条作为反应实时传输 ...

  8. 【Spark机器学习速成宝典】模型篇05决策树【Decision Tree】(Python版)

    目录 决策树原理 决策树代码(Spark Python) 决策树原理 详见博文:http://www.cnblogs.com/itmorn/p/7918797.html 返回目录 决策树代码(Spar ...

  9. vue中limitBy,filterBy,orderBy的用法

    1.limitBy的用法 <body> <div id="box"> <ul> <li v-for="val in arr | ...

  10. EC