目录
1、CSS选择器
.rank-body .book-mid-info .author a:nth-child(4)
Css选择器 css\js\python\...
定位页面元素:
css--->样式
js-->操作元素
python-->操作元素
class\id\标签【必须】
.d1
#d1
div
各种选择器之间的组合【必须】
div .d1 : div中的所有.d1(层级)
div.d1 : class属性的值为d1的那些div(并列)
div>d1 : div中所有的直接子元素.d1(直接层级)伪类选择器【了解+会查询】
:first-child
:last-child
:nth-child()
:hover :active
等等
伪元素【了解+会查询】等等
<style>
div div:nth-child(2) { /*:nth-child:选择的元素在家里排行老几*/
background: red;
}
div div:nth-of-type(1) { /*:nth-of-type:是第几个div元素*/
background: blue;
}
</style>
<body>
<div>
<p>pppp</p>
<div>第一行</div>
<div>第二行</div>
<div>第三行</div>
</div>
</body>
2、网络爬虫
2.1、练习1
1.扩展,爬取前100条数据
2.统计,在前100中,哪个类型的小说的数量最多,有多少?(下午的课堂来讲解)
# 1.扩展,爬取前100条数据
# 2.统计,在前100中,哪个类型的小说的数量最多,有多少?(下午的课堂来讲解)
import requests
from bs4 import BeautifulSoup as BS
# 伪装成浏览器
hds = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
bookinfos = {}; # map
for i in range(5):
resp = requests.get('https://www.qidian.com/rank/yuepiao/year2022-month01-page{}/'.format(i + 1), headers=hds);
ct = resp.content.decode('utf-8');
bs = BS(ct, 'lxml');
names = bs.select('.rank-body .book-mid-info h2 a');
types = bs.select('.rank-body .book-mid-info .author a:nth-child(4)');
# 定位元素后,要么就是获取属性值-->['属性名'],要么就是获取元素内容-->.get_text()。
for i in range(20):
name = names[i];
tp = types[i];
bookinfos[name.get_text()] = tp.get_text();
print(len(bookinfos)) # 100
print(bookinfos) # {'星门': '玄幻', '明克街13号': '都市', '大魏读书人': '仙侠', ...}
'''
统计,在前100中,哪个类型的小说的数量最多,有多少?
(重中之重)基础是否扎实--->
@1、对各种数据(结构)的操作是否熟练:字符串、集合、map、对象等
@2、对面向对象的理解是否到位:封装、继承、多态、接口、构造、重写、重载等
@3、对高级用法是否了解:IO、异常、多线程、反射、注解、枚举等
@4、数据库的使用:单表多表的查询、内连接与外连接、分组与函数、事务处理
@5、Servlet/jsp:Web流程的理解是否准确到位
(提升)框架阶段 【势如破竹 ---> 2周左右,吃透】
(高薪突破)企业技术阶段【高并发,高性能 高可用---->学习各种中间件的使用】
'''
# 1、取出所有的类型(取值)
# print(dir(bookinfos)) # 查看方法['__class__', ... ]
vs = list(bookinfos.values());
print(vs) # ['玄幻', '都市', '仙侠', '科幻', '都市', '轻小说', '玄幻', '轻小说', ...]
# 有哪些不同的类型?
# list-->set:自动去重
# python中有set吗?有!
notsame = set(vs); # 所有的不重复的类型
# 2、遍历,计算每个类型出现的次数。
tj = {}; # 类型:次数(tj:统计)
for v in notsame:
tj[v] = vs.count(v); # count求v在vs集合中出现的次数
ls = list(tj.items()); # [(键,值),(),(),()]
ls.sort(key=lambda x: x[1], reverse=True)
print(ls) # [('都市', 19), ('仙侠', 18), ('历史', 15), ('轻小说', 15), ('玄幻', 13), ...]
2.2、练习2
将某个(星门)小说按照章节下载到.txt文件中【下载免费部分】
思路(步骤):
1.请求小说目录,找到每个章节的超链接地址。
2.请求每个章节地址,获取章节内容,写入到txt文件中。
'''
将某个(星门)小说按照章节下载到.txt文件中【下载免费部分】
思路(步骤):
1.请求小说目录,找到每个章节的超链接地址
2.请求每个章节地址,获取章节内容,写入到txt文件中
'''
import requests
from bs4 import BeautifulSoup as BS
# 伪装成浏览器
hds = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
# 小说首页路径
url = 'https://book.qidian.com/info/1027669580/#Catalog';
resp = requests.get(url, headers=hds);
ct = resp.content.decode('utf-8');
# print(ct)
print(ct.index('李家的剑')) # 19156 找到了,说明爬取到的html中包含我们想要的内容;使用BeautifulSoup解析即可
bs = BS(ct, 'lxml');
sa = bs.select('.volume-wrap .volume:first-child .book_name a'); #:nth-child(1)
zjinfo = {}; # 名称:url地址
for a in sa:
zjinfo[a.get_text()] = 'https:' + a['href'];
# print(zjinfo)
# 2、请求每个章节地址,获取章节内容,写入到txt文件中
# 做个demo:请求第一章的内容,保存到txt文件中
u2 = 'https://read.qidian.com/chapter/Bo4cJRb-5zhY1sEsPcaxkg2/LH6CZhsVBjDgn4SMoDUcDQ2/';
resp = requests.get(u2, headers=hds);
ct = resp.content.decode('utf-8');
print(ct.index('纯净的笑容')) # 19318 可以使用BS解析,获取想要的内容
# print(ct)
bs = BS(ct, 'lxml');
sps = bs.select('.main-text-wrap .read-content p'); # 通过打印ct,再次确认元素选择器结构
print(len(sps)); # 89:89个自然段的内容
cts = [];
# 遍历,获取每一个内容,放入到cts中
for p in sps:
cts.append(p.get_text());
print(cts); # ['\u3000\u3000\u3000\u3000银城。', ...]
# 写入文件
f = open(r'C:\Users\lwx\Desktop\星门\{}'.format('第一章 巡检司.txt'), 'w');
f.write('\n'.join(cts)); # 将cts中所有字符串拼接,使用\n换行,间隔
f.close();
先五伦,后八德。人伦大道以此分。
君臣义,父子亲。君正臣忠护国心。
为人子,孝双亲。父慈子奉父子亲。
夫妇情,尽责任。妻贤夫爱情谊深。
兄弟序,长幼分。兄宽弟忍哥们亲。
朋友信,友情真。不论贫富视同仁。
孝为首,万善源。百善孝顺第一先。
生命体,父母赐。不孝敬老畜不如。
万宝失,可再得。万金难买父母身。
讲明理,兄弟情。同气连枝一母生。
忠字义,为诚心。天地人伦无假心。
信字解,人言诚。言而有信君子风。
礼为敬,待人先。非礼勿为敬为先。
义字理,合正道。正义善为无祸端。
廉字解,主清白。端端正正不贪财。
耻字义,须解开。知耻羞恶善德怀。
为人道,谨记怀。五伦八道永记怀。