优雅的用两种方式爬网络 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'
  • (.*?)
  • ' 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'    (.*?)(
    |</p>
    )' 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'    (.*?)(
    |</p>
    )' 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 文件【雾)