BeautifulSoup 实现

提前创建好文件夹,用于存放图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from bs4 import BeautifulSoup
import requests
import time

# 记录开始时间
start_time = time.time()

# 目标URL
url = "https://pvp.qq.com/web201605/herolist.shtml"

# 创建一个会话对象
session = requests.session()

# 发送GET请求获取网页内容
response = session.get(url)
print(f'状态码: {response}')

# 检查请求是否成功
if response.status_code != 200:
pass
else:
print("服务器连接正常")

# 使用BeautifulSoup解析HTML内容,指定解析器为html.parser
soup = BeautifulSoup(response.content.decode('gbk'), 'html.parser')

# 查找所有class为'herolist clearfix'的<ul>元素
items = soup.find_all('ul', class_='herolist clearfix')

# 查找第一个<ul>中的所有<li>元素
items2 = items[0].find_all('li')

# 遍历每个<li>元素
for item in items2:
# 提取<img>标签的src属性
img_url = item.find('img')['src']
# 提取<a>标签的文本作为名称
name = item.find('a').text
# 构建完整的图片URL
new_url = "https:" + img_url
# 发送GET请求获取图片内容
url_content = session.get(new_url).content
# 将图片内容写入文件
with open("./wang2/" + name + ".jpg", "wb") as f:
f.write(url_content)
print(f"{name}下载完成")

# 记录结束时间
end_time = time.time()
# 打印下载完成信息和用时
print(f"下载完成,用时{end_time - start_time}秒")
1
2
3
4
5
6
...
墨子下载完成
赵云下载完成
小乔下载完成
廉颇下载完成
下载完成,用时57.759543895721436秒

PyQuery 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# -*- coding: gbk -*-
import requests
import re
from pyquery import PyQuery as pq
import time

# 记录开始时间
start_time = time.time()

# 目标URL
url = "https://pvp.qq.com/web201605/herolist.shtml"

# 创建一个会话对象
session = requests.session()

# 发送GET请求获取网页内容
response = session.get(url)
print(f'状态码: {response}')

# 检查请求是否成功
if response.status_code != 200:
pass
else:
print("服务器连接正常")

# 解析网页内容,使用GBK编码
content = response.content.decode('gbk')
doc = pq(content)

# 使用CSS选择器选择所有位于herolist类的元素下的直接子元素<li>
items = doc('.herolist>li')

# 将选择的元素转换为可迭代的生成器
items = items.items()
print(items) # 打印生成器对象

# 遍历每个<li>元素
for item in items:
# 提取<img>标签的src属性
url = item.find("img").attr("src")
# 构建完整的图片URL
new_url = "https:" + url
# 提取<a>标签的文本作为名称
name = item.find("a").text()
# 发送GET请求获取图片内容
url_content = session.get(new_url).content
# 将图片内容写入文件
with open('./wangzhe/' + name + '.jpg', 'wb') as f:
f.write(url_content)
print(f'{name}下载完成')

# 记录结束时间
end_time = time.time()
# 打印下载完成信息和用时
print(f'下载完成,用时{end_time - start_time}秒')
1
2
3
4
5
...
赵云下载完成
小乔下载完成
廉颇下载完成
下载完成,用时65.03721570968628秒

re 暂不能实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests
import re
import time

start_time = time.time()
url = "https://pvp.qq.com/web201605/herolist.shtml"

session = requests.session()

response = session.get(url)
print(f'status_code: {response}')
if response.status_code != 200:
pass
else:
print("ok")

r = r'<li>(.*?)</li>'
# print(re.findall(r,response.text, re.DOTALL))
items = re.findall(r,response.content.decode('gbk'), re.DOTALL)
# print(items)
for item in items:
print(item)
r1 = r'<img*>'
item2 = re.findall(r1,item, re.DOTALL)
print(item2)

这个返回的结果

1
2
3
4
5
6
7
...
<a href="herodetail/'+this.ename+'.shtml" target="_blank"><img src="'+imgurl+this.ename+'.jpg" width="91" alt="'+this.cname+'">'+this.cname+'</a>
[]
<a href="herodetail/' + data[f].id_name + '.shtml" target="_blank"><img src="' + _imgurl + _ename + '.jpg" width="91" height="91" alt="' + _cname + '">' + _cname + '</a>
[]
<a href="herodetail/' + dataList[j].id_name + '.shtml" target="_blank"><img src="' + imgurl + dataList[j].ename + '.jpg" width="91px" alt="' + dataList[j].cname + '">' + dataList[j].cname + '</a>
[]

看样子是需要结合 js 去解析的,所以此处不行,而前两种方法可以。


结果图

image-20250413191158854

关键点小总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
soup: 
# 使用 BeautifulSoup 解析 HTML 内容,指定解析器为 'html.parser'
soup = BeautifulSoup(response.content.decode('gbk'), 'html.parser')

# 查找所有 class 为 'herolist clearfix' 的 <ul> 元素
img_url = soup.find_all('ul', class_='herolist clearfix')

# 假设 item 是从 img_url 中遍历得到的 <li> 元素,提取 <a> 标签的文本作为名称
name = item.find('a').text


=========================================================================================================
pq:
# 使用 PyQuery 解析 HTML 内容
doc = pq(content)

# 使用 CSS 选择器选择所有位于 herolist 类的元素下的直接子元素 <li>
items = doc('.herolist>li')

# 假设 item 是从 items 中遍历得到的 <li> 元素,提取 <img> 标签的 src 属性
url = item.find("img").attr("src")

# 提取 <a> 标签的文本作为名称
name = item.find("a").text()

后记

闲得慌,后面挑战难点的