import requests
import os
from lxml import html
import time def get_title_url(tree):
'''一级 获取标题'''
# 史书典籍
# 格式:/book/sanguoyanyi.html
History_book_url_list = tree.xpath("//div[@class='index-li'][3]/ul/li/a/@href")
# 格式:三国演义
History_book_name_list = tree.xpath("//div[@class='index-li'][3]/ul/li/a/text()")
return History_book_url_list,History_book_name_list def get_article_url(tree):
'''二级 获取文章标题'''
# 三国演义典籍
# 格式:/book/sanguoyanyi/1.html
book_url_list = tree.xpath("//div[@class='book-mulu']/ul/li/a/@href")
# 格式:第一回·宴桃园豪杰三结义 斩黄巾英雄首立功
book_name_list = tree.xpath("//div[@class='book-mulu']/ul/li/a/text()")
return book_url_list,book_name_list def get_article(tree):
'''三级 获取文章内容'''
# 第一回·宴桃园豪杰三结义 斩黄巾英雄首立功
# 格式:/book/sanguoyanyi/1.html
article_list = tree.xpath("//div[@class='chapter_content']/p/text()")
return ''.join(article_list) def get_request(url,headers):
'''获取页面'''
response = requests.get(url=url,headers=headers)
tree = html.fromstring(response.text)
return tree def save_mkdir(two):
'''三级 保存文章夹'''
# 一级文件夹
if os.path.exists('史书典籍'):
pass
else:
os.mkdir('史书典籍')
# 二级文件夹
if os.path.exists('史书典籍/'+ two):
pass
else:
os.mkdir('史书典籍/'+ two) def police_2(a):
'''二级中断检测'''
b = None
if os.path.exists('史书典籍/police_2.txt'):
with open('史书典籍/police_2.txt', 'r') as f:
b = f.read()
f.close()
if b is None:
return True
elif b is '':
return True
if a < int(b):
return False
# 写入并返回True
with open('史书典籍/police_2.txt', 'w') as f:
f.write(str(a))
f.close()
return True def police_3(a):
'''三级中断检测'''
b = None
if os.path.exists('史书典籍/police_3.txt'):
with open('史书典籍/police_3.txt', 'r') as f:
b = f.read()
f.close()
if b is None:
return True
elif b is '':
return True
if a < int(b):
return False
# 写入并返回True
with open('史书典籍/police_3.txt', 'w') as f:
f.write(str(a))
f.close()
return True def main():
'''主函数'''
# 根路由
root = 'http://www.shicimingju.com'
# 头部
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
} # 获取root页面
tree1 = get_request(root,headers)
# 获取一级名字和路由
History_book_url_list, History_book_name_list = get_title_url(tree1)
# 获取二级页面
for i in range(len(History_book_url_list)):
if police_2(i) is False:
continue
# 二级路由
url2 = root + History_book_url_list[i]
print("爬取>>>"+History_book_name_list[i]+'开始')
tree2 = get_request(url2,headers)
# 获取二级名字和路由
book_url_list,book_name_list = get_article_url(tree2)
# 文章夹保存
save_mkdir(History_book_name_list[i])
# 下载文章
for j in range(len(book_url_list)):
if police_3(j) is False:
continue
time.sleep(1)
# 三级路由
url3 = root + book_url_list[j]
print("爬取:" + book_name_list[j])
# 文章
tree3 = get_request(url3, headers)
txt = get_article(tree3)
# 文章标题
txt_name = book_name_list[j]
# 文章保存
file_path = '史书典籍/{}/{}.txt'.format(History_book_name_list[i],(txt_name.replace(' ','')).replace('·',''))
with open(file_path,'w',encoding='utf-8') as f:
f.write(txt)
f.close()
print("爬取>>>" + History_book_name_list[i] + '结束') if __name__ == '__main__':
main()

python-爬虫-史书典籍的更多相关文章

  1. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  2. python爬虫成长之路(一):抓取证券之星的股票数据

    获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为python3.5,意在抓取证券之星上当天所 ...

  3. python爬虫学习(7) —— 爬取你的AC代码

    上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...

  4. python爬虫学习(6) —— 神器 Requests

    Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 H ...

  5. 批量下载小说网站上的小说(python爬虫)

    随便说点什么 因为在学python,所有自然而然的就掉进了爬虫这个坑里,好吧,主要是因为我觉得爬虫比较酷,才入坑的. 想想看,你可以批量自动的采集互联网上海量的资料数据,是多么令人激动啊! 所以我就被 ...

  6. python 爬虫(二)

    python 爬虫 Advanced HTML Parsing 1. 通过属性查找标签:基本上在每一个网站上都有stylesheets,针对于不同的标签会有不同的css类于之向对应在我们看到的标签可能 ...

  7. Python 爬虫1——爬虫简述

    Python除了可以用来开发Python Web之后,其实还可以用来编写一些爬虫小工具,可能还有人不知道什么是爬虫的. 一.爬虫的定义: 爬虫——网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区 ...

  8. Python爬虫入门一之综述

    大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...

  9. [python]爬虫学习(一)

    要学习Python爬虫,我们要学习的共有以下几点(python2): Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy ...

  10. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

随机推荐

  1. NoSQL数据库技术实战-第1章 NoSQL与大数据简介 NoSQL产生的原因

    NoSQL产生的原因: 关系型数据库不擅长的操作,是NoSQL应运而生的原因: 大量的数据写入操作书上写的是“大量数据的写入操作“,我理解的应该是“大量的数据写入操作”,因为大量的数据写入操作才会引起 ...

  2. ios 打包下

    一.打包真机方式 二.编译打包 三.配置打包信息 以下为打的包:

  3. 解决nginx无法访问的问题

    解决nginx无法访问的问题 解决方案-->恢复Nginx默认配置: cd /usr/local/nginx/conf rm nginx.conf cp nginx.conf.default n ...

  4. Java-FtpUtil工具类

    package cn.ipanel.app.newspapers.util; import java.io.BufferedReader; import java.io.DataInputStream ...

  5. python 中pip配置清华源

    anaconda配置镜像 Mac and Linux conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda ...

  6. beautifulsoap常用取节点方法

    取某个class的元素 soup.find('div', {'class', 'description'}) 取某个属性的值 download_content.find('li').find('a') ...

  7. spring-boot的三种启动方式

    spring-boot的启动方式主要有三种: 1. 运行带有main方法类 2. 通过命令行 java -jar 的方式 3. 通过spring-boot-plugin的方式 一.执行带有main方法 ...

  8. java+根据多个url批量下载文件

    1.基本流程 当我们想要下载网站上的某个资源时,我们会获取一个url,它是服务器定位资源的一个描述,下载的过程有如下几步: (1)客户端发起一个url请求,获取连接对象. (2)服务器解析url,并且 ...

  9. Program Transformation Semantics (程序转换语义学)

    本文是Inside The C++ Object Model Chapter 2 部分的读书笔记.讨论编译器调用拷贝构造函数时的策略(如何优化以提高效率),侯捷称之为"程序转化的语义学&qu ...

  10. android 开发随手记

    1.Fragment 跳转到Activity 修改数据,修改完后从Activity 返回(返回键)Fragment ,要求刷新Fragment界面的数据 解决办法: 在Fragment中注册一个监听广 ...