1. """
    2. 需求分析:
    3. 1.从 http://www.kanunu8.com/book3/6879 爬取《动物农场》所有章节的网址
    4. 2.再通过一个多线程爬虫将每一章的内容爬取下来
    5. 3.在本地创建一个“动物农场”文件夹,并将小说中的每一章分别保存到这个文件夹中
    6. """
    7. """
    8. 涉及知识点:
    9. 1.使用requests获取网页源代码
    10. 2.使用正则表达式获取内容
    11. 3.文件操作
    12. """
    13. import re, requests, os
    14. from multiprocessing.dummy import Pool
    15. class GetNovel(object):
    16. def __init__(self, url, headers):
    17. self.url = url
    18. self.headers = headers
    19. def get_toc(self):
    20. """获取每一章节的链接"""
    21. html = requests.get(self.url, headers=headers, verify=False).content.decode('gbk')
    22. toc_url_list = []
    23. # 包含章节链接的内容
    24. toc_block = re.findall('正文(.*?)</tbody>', html, re.S)[0]
    25. # 章节链接
    26. toc_url = re.findall('href="(.*?)"', toc_block, re.S)
    27. for url in toc_url:
    28. toc_url_list.append(self.url + url)
    29. return toc_url_list
    30. def get_article(self, toc_url):
    31. """获取文章的标题和内容"""
    32. print(toc_url)
    33. html = requests.get(toc_url, headers=headers, verify=False).content.decode('gbk')
    34. # 文章标题
    35. chapter_name = re.search('size="4"> (.*?)</font>', html, re.S).group(1)
    36. # 文章内容
    37. text_block = re.search('<p>(.*?)</p>', html, re.S).group(1).replace('<br />', '')
    38. # 创建文件夹
    39. # exist_ok:只有在目录不存在时创建目录,目录已存在时不会抛出异常
    40. os.makedirs('动物农场', exist_ok=True)
    41. with open(os.path.join('动物农场', chapter_name +'.txt'), 'w', encoding='utf-8') as f:
    42. f.write(text_block)
    43. def save_article(self, toc_url_list):
    44. pool = Pool(5)
    45. pool.map(self.get_article, toc_url_list)
    46. def run(self):
    47. toc_url_list = self.get_toc()
    48. self.save_article(toc_url_list)
    49. if __name__ == '__main__':
    50. start_url = 'http://www.kanunu8.com/book3/6879/'
    51. headers = {
    52. 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
    53. }
    54. getnovel = GetNovel(start_url, headers)
    55. getnovel.run()
    56. """
    57. 总结:
    58. 01.os.makedirs('动物农场', exist_ok=True)---exist_ok=True只有在目录不存在时创建目录,目录已存在时不会抛出异常
    59. """