首页 编程教程正文

python 爬取小说《狼狗》

piaodoo 编程教程 2020-02-22 22:08:43 1014 0 python教程

本文来源吾爱破解论坛

本帖最后由 山野村夫-陈墨 于 2019-10-22 00:00 编辑

由于朋友想看这本书,刚好不能下载,所以有了今年的故事。当然,如果人家不让爬,那这就是一场事故的前奏了。
这个暂且不谈,我们说说这个 程序。
结果哩,是这样的。

4WE0[WRXNPRYX~QC32[7IH2.png (73.34 KB, 下载次数: 1)

下载附件  保存到相册

2019-10-20 23:22 上传




0{NM[NRG3MOPL250UW{BV.png (51.23 KB, 下载次数: 0)

下载附件  保存到相册

2019-10-20 23:22 上传


程序是这样的:
核心就是用到的是Xpath工具找到小说标题和内容。
[Python] 纯文本查看 复制代码
'''
        爬取  小说天堂 《狼狗》 1-73章

    第一章:https://www.xstt5.com/dangdai/4236/252445.html
    最后一章:https://www.xstt5.com/dangdai/4236/252517.html

    2019年10月20日
'''

import  requests
from lxml import  etree
import  time

'''
    请求网页数据,利用Xpath找到标题和内容
        标题作为文件名
'''
def request(url):
    header = {
            "Referer":"https://uland.taobao.com/sem/tbsearch?refpid=mm_26632258_3504122_32538762&clk1=f165a3cac48d521b64f09db3154c2140&keyword=%E5%AE%89%E5%85%A8%E5%A5%97%20%E7%94%B7&minPrice=20&maxPrice=200&spm=a2e15.8261149.07626516001.dsortpricerange",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
          }
    str = requests.get(url= url,headers = header)

    str = etree.HTML(str.content.decode())
    #获取标题
    title_str = str.xpath("//*[@id=\"main\"]/div[1]/h1/text()")
    #获取文章
    news_str = str.xpath("//*[@id=\"main\"]/div[2]/text()")
    #保存数据
    f = open("狼狗/{}.txt".format(title_str[0]), "w+")
    f.write(title_str[0])
    f.write("\n\n")
    for  item  in news_str:
        f.write(item)
        f.write("\n")
    f.close()

    print("{}  is over".format(title_str[0]))
    #设置睡眠时间,防止反爬
    time.sleep(0.5)


def  get_url(page_number):
        url = "https://www.xstt5.com/dangdai/4236/{}.html".format(str(page_number))
        print(url)
        request(url)


def  get_txt():

     #url的部分数据范围
      min_page=252445
      max_page=252517
      #请求10次数据再多休眠一次
      number = 0
      for p  in range(min_page, max_page+1):
           get_url(p)
           number += 1
           if(number % 10 == 0):
               time.sleep(3)


if __name__ == "__main__":
    get_txt()


问题呢 ?是这样的:
(1)没有异常处理机制,如果一不小心被反爬,那么后面的章节都会失败;
(2)单线程处理,真的很花时间;
(3)txt排版有问题。一行好几句话,阅读难受。

那么,下次,就处理这些问题。

/**************************************************************************************************************************************************************/
很好,定期完成任务。解决了上面是三个问题的程序出来了,不想充帖子数了,直接在 下面更新吧。
本次新添加的内容:
(1)异常处理机制,防止某一章的失败影响整个程序;
          [Python] 纯文本查看 复制代码
try:    print("running")
except  BaseException:
pass

   " BaseException"不管什么异常,都pass,

(2)多线程。一个线程爬取数据,一个线程处理txt文档。当然使用多线程,如果有共享变量就用到了互斥锁
threading.Lock(), 它有两个方法acquire()打开互斥锁,release()释放互斥锁。

[Python] 纯文本查看 复制代码
'''
        爬取  小说天堂 《狼狗》 1-73章

    第一章:https://www.xstt5.com/dangdai/4236/252445.html
最后一章:https://www.xstt5.com/dangdai/4236/252517.html

    2019年10月20日
'''

import  requests
from lxml import  etree
import  time
import  threading

'''      
        第一部分
    请求网页数据,利用Xpath找到标题和内容
        标题作为文件名
'''

def request(url):
    header = {
            "Referer":"https://uland.taobao.com/sem/tbsearch?refpid=mm_26632258_3504122_32538762&clk1=f165a3cac48d521b64f09db3154c2140&keyword=%E5%AE%89%E5%85%A8%E5%A5%97%20%E7%94%B7&minPrice=20&maxPrice=200&spm=a2e15.8261149.07626516001.dsortpricerange",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
          }
    str = requests.get(url= url,headers = header)

    str = etree.HTML(str.content.decode())
    #获取标题
    title_str = str.xpath("//*[@id=\"main\"]/div[1]/h1/text()")
    #获取文章
    news_str = str.xpath("//*[@id=\"main\"]/div[2]/text()")
    #保存数据
    f = open("狼狗/原件/{}.txt".format(title_str[0]), "w+")
    f.write(title_str[0])
    f.write("\n\n")
    for  item  in news_str:
        f.write(item)
        f.write("\n")
    f.close()
    #打开互斥锁
    lock.acquire()
    title_list.append(title_str[0]+".txt")
    lock.release()
    #释放互斥锁
    print("{}  is over".format(title_str[0]))
    #设置睡眠时间,防止反爬
    time.sleep(0.5)


def  get_url(page_number):
    try:
        url = "https://www.xstt5.com/dangdai/4236/{}.html".format(str(page_number))
        print(url)
        request(url)
    except BaseException:
        pass

def  get_txt():

     #url的部分数据范围
      min_page=252445
      max_page=252517
      #请求10次数据再多休眠一次
      number = 0
      for p  in range(min_page, max_page+1):
           get_url(p)
           number += 1
           if(number % 10 == 0):
               time.sleep(3)


'''
       第二部分
    重新修改txt文档格式
    
'''
def  rewrite_txt(name_txt):
    with open("狼狗/修改/{}".format(name_txt), "w")  as  outf:
        with open("狼狗/原件/{}".format(name_txt),"r") as inf:
            while True:
                tmp_str = inf.readline()
                if not  tmp_str:
                    break
                while(tmp_str[:60]):
                     outf.write(tmp_str[:60])
                     if tmp_str[:60][0]!='\n':
                        outf.write("\n")
                     tmp_str = tmp_str[60:]


def  get_txt_name():

     try :
         '''
         次数读取第一个元素的理由是:避免读取的数据和删除的数据不一致
          (1)列表没有元素,读取时索引异常,不进行删除;
          (2)列表有元素,读取到元素title_list[0],request()即使添加元素,也会添加到title_list[0]后面
         '''
         name_str = title_list[0]
         del title_list[0]
         return name_str
     except BaseException:
         pass
         return None


def rewrite():

    while True:
        name_txt = get_txt_name()
        print(name_txt)
        if name_txt:
            rewrite_txt(name_txt)
        else:
            time.sleep(3)
        if len( threading.enumerate()) == 2  and  len(title_list) == 0:
            break



#标题列表,保存爬到的小说标题
title_list = []
#互斥锁
lock = threading.Lock()

if __name__ == "__main__":
    threading.Thread(target=get_txt).start()
    #首先爬取数据
    time.sleep(3)
    threading.Thread(target=rewrite).start()

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7674.html

搜索