zoukankan      html  css  js  c++  java
  • 优雅的用两种方式爬网络 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.
    ')
    
    
    
    
    
  • 相关阅读:
    5月7号 跨页面传值
    实体类、数据访问类、属性扩展
    完整修改删除,防止数据库字符串攻击
    ADO.NET 增、删、改、查
    类库、委托、is as运算符、泛型集合
    抽象类、接口
    多态、虚方法、重写
    访问修饰符、封装、继承
    面向对象基础知识
    Java Script 练习题
  • 原文地址:https://www.cnblogs.com/Judge/p/11730428.html
Copyright © 2011-2022 走看看