zoukankan      html  css  js  c++  java
  • 【爬虫】biqukan抓取2.0版

    #!python3.7
    import requests,sys,time,logging,random
    from lxml import etree
    logging.basicConfig(level=logging.ERROR, format=' %(asctime)s - %(levelname)s: %(message)s') #DEBUG ERROR format显示格式可按自己喜好调整
    
    #logging.disable(logging.CRITICAL) #调试日志是否显示开关
    logging.debug('程序现在开始!') #调试日志开始标记
    '''
    时间:2019.3.15
    功能:实现www.biqukan.com/1_1094/5403177.html小说下载为txt
    版本:2.0
    新增:加入了页面没有返回200成功码,异常处理;2.3功能合并;调试日志;
    '''
    global headers
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
        }
    
    ##0.获取所有章节url
    def get_url_list(catalog_url):
        res=requests.get(catalog_url,headers=headers)
        
        if res.status_code==200:
            text=res.text
            html=etree.HTML(text)
            hrefs=html.xpath('//div[@class="listmain"]/dl/dt[2]/following-sibling::*/a/@href')
    
            #logging.debug('0.获取到的章节列表是:',hrefs) #【调试0】
            return hrefs
        raise Exception('页面没有正确返回哦!'+res.text) #【调试】如果没有返回200则按错误抛出返回的状态码
    
    ##1.获取页面
    def get_one_page(url):
        
        res=requests.get(url,headers=headers)
        if res.status_code==200:
            return res.text
        else:
            while res.status_code!=200:
                print('页面没有正确返回,正在重试请稍等哦!'+res.text)
                res=requests.get(url,headers=headers)
                time.sleep(random.randint(1, 5))
            return res.text
    
    ##2.解析页面 3.写入txt文件
    def parse_one_page(text):
        html=etree.HTML(text)
        title=html.xpath('//div[@class="content"]/h1//text()')
        content=html.xpath('//div[@class="showtxt"]//text()') #去掉换行
        contents=''.join(content).replace('xa0'*8,'
    '*2)#把列表转换为一整段文本,并把8个空格换为2个换行
    
        #logging.debug('2.解析到的标题是:',title)#【调试2】
        #logging.debug('2.解析到的内容是:',contents)
        
        #写入文件
        with open('一念永恒.txt','a',encoding='utf-8')as f:
            f.write(title[0]+'
    '+contents+'
    ')
                        
    ##主函数
    def main():
        #0.获取章节列表的网址
        catalog_url='https://www.biqukan.com/1_1094/'
        urls=get_url_list(catalog_url)
        
        #把网址传入详情抓取页面,并保存
        for i in range(len(urls)):
            rel_url='https://www.biqukan.com'+urls[i]
            #1.获取一个页面text
            text=get_one_page(rel_url)
            #2.解析3.写入文件
            parse_one_page(text) 
            
            #显示下载进度
            sys.stdout.write("  已下载:%.3f%%" %  float(i/len(urls)) + '
    ')
            sys.stdout.flush() 
    
    ##执行入口    
    if __name__=='__main__':
        main()
  • 相关阅读:
    Java 练习题02 (包装类 (对字符串进行排序))
    Java 练习题01(运算符)
    理解有参构造器和无参构造器的作用
    反射;获取类的字节码对象;Class类实例化对象;获取类中的公共构造方法/成员变量/成员方法并执行;暴力反射 (Java Day27)
    网络编程;InetAddress类;UDP协议和TCP协议;Socket编程;UDP编程;TCP编程 (Java Day26)
    序列化 & 反序列化
    几种常用的认证机制
    MySql交换两列
    架构设计思想
    REST资源的URL设计
  • 原文地址:https://www.cnblogs.com/chenxi188/p/10538221.html
Copyright © 2011-2022 走看看