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. 消金ABS

    对于持牌消金公司来说,发行ABS需满足至少3年经营期限的硬性规定,目前已开业的24家消金公司里,有15家符合此项规定. 2019年下半年以来,个人消费金融领域共发行了15个资产证券化产品,发行规模达4 ...

  2. 【原】linux下部署web

    本机安装xshell.新建->主机处输入ip->确定,按提示输入用户名和密码 安装jdk(一般Linux上都已经安装好了) 安装tomcat. (1)在tomcat官网上下载tar.gz版 ...

  3. 浏览器表单自动填充默认样式 - autofill问题解决

    这不知道是个什么神仙网站,解决办法写的这么清楚,页面有这么让人舒服 https://lhajh.github.io/css/chrome/2018/04/17/The-chrome-browser-f ...

  4. JavaScript算术运算符

    ㈠运算符(操作符) ⑴通过运算符可以对一个或多个值进行运算,并获取运算结果 ⑵比如:typeof就是运算符,可以来获得一个值得类型               它会将该值的类型以字符串的形式返回   ...

  5. [Docker]docker搭建私有仓库(ssl、身份认证)

    docker搭建私有仓库(ssl.身份认证) 环境:CentOS 7.Docker 1.13.1 CentOS 7相关: https://www.cnblogs.com/ttkl/p/11041124 ...

  6. luoguP5024 保卫王国

    题目链接 问题分析 其实是比较明显的动态DP. 懒于再推一遍式子,直接用 最小权点覆盖=全集-最大权独立集,然后就和这道题一样了.题解可以看这里. 然后必须选或者不选的话,就直接把相应的点权变成\(- ...

  7. 编译报错:File ended while scanning use of xxx

    出现这个问题的原因是使用某些命令时,给出的参数不完整或者漏了半个大括号: 比如, Runaway argument? {adaptivity, dynamically changing environ ...

  8. HNOI2012矿场搭建

    做完Mining Your Own Business后觉得这个题没什么意思了,数据范围小的连边数不清空都能A. 题解直接看这篇吧.做题的经历也挺……对吧. #include<iostream&g ...

  9. ubuntu 下vscode 修改主题 注释斜体

    找到vscode的程序目录 全局搜索extensions 找到目录 /home/your_usr_name/.vscode/extensions 这里修改 注释字体 直接删掉fontStyle for ...

  10. Hadoop-2.7.5完全分布式搭建

    1.在虚拟机上安装Hadoop完全分布式准备工作 1)这里使用的是VMWare软件,在VMWare上安装一个CentOS6.5,并再克隆两个机器配置相关MAC地址,以及配置机器名 2)三台虚拟机配置好 ...