优雅的用两种方式爬网络 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'&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;","
    ")
            want='    '+want+'
'
            #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("
"+title+"
")
        for content in chapter_content:
            want=content[0]
            want=want.replace("&nbsp;&nbsp;&nbsp;&nbsp;","")
            want=want.replace("&nbsp;&nbsp;","
    ")
            want='    '+want+'
'
            #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.
')




原文地址:https://www.cnblogs.com/Judge/p/11730428.html