优雅的用两种方式爬网络 txt 文件【雾
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' (.*?)(<br />|</p></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(" ","")
want=want.replace(" ","\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' (.*?)(<br />|</p></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(" ","")
want=want.replace(" ","\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 文件【雾的更多相关文章
- 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- (转)DLL中导出函数的两种方式(dllexport与.def文件)
DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...
- 【转】DLL中导出函数的两种方式(dllexport与.def文件)
DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...
- DLL中导出函数的两种方式(dllexport与.def文件)
DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接 ...
- 这里介绍两种将矩阵写入TXT文件的方法。
方法1 fid = fopen('data.txt','wt'); % data.txt为写入文件名 matrix = M; % M为要存储的矩阵 [m,n]=size(matrix); for i= ...
- [Swift]Alamofire:设置网络请求超时时间【timeout】的两种方式
两种方式作用相同,是同一套代码的两种表述. 第一种方式:集聚. 直接设置成员属性(全局属性),这种方法不能灵活修改网络请求超时时间timeout. 声明为成员属性: // MARK: - 设置为全局变 ...
- WebView加载页面的两种方式——网络页面和本地页面
WebView加载页面的两种方式 一.加载网络页面 加载网络页面,是最简单的一种方式,只需要传入http的URL就可以,实现WebView加载网络页面 代码如下图: 二.加载本地页面 1.加载asse ...
- 解决 SharePoint 2010 拒绝访问爬网内容源错误的小技巧(禁用环回请求的两种方式)
这里有一条解决在SharePoint 2010搜索爬网时遇到的“拒绝访问错误”的小技巧. 首先要检查默认内容访问帐户是否具有相应的访问权限,或者添加一条相应的爬网规则.如果目标资源库是一个ShareP ...
- iOS 通过URL网络获取XML数据的两种方式
转载于:http://blog.csdn.net/crayondeng/article/details/8738768 下面简单介绍如何通过url获取xml的两种方式. 第一种方式相对简单,使用NSD ...
随机推荐
- A.Equivalent Prefixes(ST算法)
Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld 题目描述 ...
- 高效的js原生代码
1.遍历元素 //不推荐 var element = document.getElementsByTagName('div'); for(var i=0; i<element.length; i ...
- 第十四周学习总结&课程实验报告
课程总结 一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统 ...
- C++类的默认成员函数
成员函数隐含this指针参数: 每成员函数一个隐式的指针形参(构造函数除外): 对象在调用成员函数时,编译器会将对象的地址传递给this指针: 1.构造函数(需用一个公有成员函数对私有的成员变量进行初 ...
- leetcode-easy-trees-Maximum Depth of Binary Tree
mycode 92.69% # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x ...
- 编写个shell脚本将/home/test 目录下大于10K的文件转移到/tmp目录下
#!/bin/sh cd /home/test for i in `ls -l |awk '{if($5>10240) {print $9}}'` do mv $i /tmp done
- [Java]算术表达式求值之一(中序表达式转后序表达式方案)
第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...
- 全面解读PHP-数据结构
一.常见数据结构 1.Array 数组 最简单且应用最广泛的数据结构之一 特性:使用连续的内存来存储,数组中的所有元素必须是相同的类型或类型的衍生(同质数据结构),元素可以通过下标直接访问. 2.Li ...
- jquery.validate.js使用之自定义表单验证规则
jquery.validate.js使用之自定义表单验证规则,下面列出了一些常用的验证法规则 jquery.validate.js演示查看 jquery validate强大的jquery表单验证插件 ...
- web开发(一)-Servlet详解
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6399262.html>,在此仅供学习参考之用. 一.什么 ...