Python实训day05pm【JS-DOM-获取元素节点对象、网络爬虫】

目录

1、CSS选择器

2、网络爬虫

2.1、练习1

2.2、练习2


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();

先五伦,后八德。人伦大道以此分。
君臣义,父子亲。君正臣忠护国心。
为人子,孝双亲。父慈子奉父子亲。
夫妇情,尽责任。妻贤夫爱情谊深。
兄弟序,长幼分。兄宽弟忍哥们亲。
朋友信,友情真。不论贫富视同仁。
孝为首,万善源。百善孝顺第一先。
生命体,父母赐。不孝敬老畜不如。
万宝失,可再得。万金难买父母身。
讲明理,兄弟情。同气连枝一母生。
忠字义,为诚心。天地人伦无假心。
信字解,人言诚。言而有信君子风。
礼为敬,待人先。非礼勿为敬为先。
义字理,合正道。正义善为无祸端。
廉字解,主清白。端端正正不贪财。
耻字义,须解开。知耻羞恶善德怀。
为人道,谨记怀。五伦八道永记怀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

upward337

谢谢老板~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值