avatar

Python爬取壁纸网站

参考:《Python网络爬虫从入门到实践》
爬取网站地址:http://www.win4000.com/

打开壁纸网站

壁纸地址:http://www.win4000.com/zt/dongman.html

  1. 获取每个套封面跳转的网页地址,注意抓取的页面有五页。
  2. 获取所有的套图链接后,打开套图链接,解析页面获得页数,遍历构造图片对应的网页链接。
  3. 解析网页链接,获得图片url,将其下载到本地

获取所有套图链接:

1
2
3
4
5
6
7
8
9
10
11
12
<li>
<a href="http://www.win4000.com/wallpaper_detail_166894.html" alt="精致唯美二次元风景插画桌面壁纸" title="精致唯美二次元风景插画桌面壁纸" target="_blank">
<img src="http://static.win4000.com/home/images/placeholder.jpg" data-original = "http://pic1.win4000.com/wallpaper/2020-03-26/5e7c4f9c9fdc4_270_185.jpg" />
<p>精致唯美二次元风景插画桌面壁纸</p>
</a>
</li>
<li>
<a href="http://www.win4000.com/wallpaper_detail_166892.html" alt="性感唯美动漫美女高清桌面壁纸" title="性感唯美动漫美女高清桌面壁纸" target="_blank">
<img src="http://static.win4000.com/home/images/placeholder.jpg" data-original = "http://pic1.win4000.com/wallpaper/2020-03-26/5e7c4c635cf72_270_185.jpg" />
<p>性感唯美动漫美女高清桌面壁纸</p>
</a>
</li>

其中的a标签的href属性值便是该套图的链接,提取代码如下:

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
import requests as r
from bs4 import BeautifulSoup

base_url = 'http://www.win4000.com'
theme_base_url = 'http://www.win4000.com/zt/dongman_'

# 利用列表表达式生成每页链接列表
theme_url_list = [theme_base_url + str(x) + '.html' for x in range(1,6)]

#套图链接列表
series_url_list = []

# 获取所有的套图链接列表
def ger_series_url_list(url):
resp = r.get(url)
if resp is not None:
result = resp.text
bs = BeautifulSoup(result,'html.parser')
ul = bs.find('div',attrs={'class':'tab_tj'})
a_s = ul.find_all('a')
for a in a_s:
series_url_list.append(a.get('href'))

if __name__ == "__main__":
for url in theme_url_list:
ger_series_url_list(url)
print(len(series_url_list))

执行结果如下:

1
120

总共爬取到120条套图数据。

下载每个套图的图片到本地

使用replace()函数来改变url,代码如下:

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
import os

# 保存文件名
save_root_dir = os.path.join(os.getcwd(),'tmp/')

# 获取某个套图里的所有图片
def fetch_all_series_pic(url):
cur_page = 1
while True:
current_url = url
if cur_page >1:
current_url = url.replace('.html','_' + str(cur_page) + '.html') # replace()改变url链接
resp = r.get(current_url)
if resp.status_code == 404:
break
else:
if resp is not None:
result = resp.text
bs = BeautifulSoup(result,'lxml')
# 使用lxm来获取标题,用作文件名
title_name = bs.find('div',attrs={'class':'ptitle'}).h1.text
save_dir = os. path.join(save_root_dir,title_name)
if not os.path.exists(save_dir): # 如果没有保存文件的文件夹,则创建一个
os.makedirs(save_dir)
# 使用CSS选择器选择图片节点
imgs = bs.select('img.pic-large')
for img in imgs:
download_pic(img.attrs.get('src'),save_dir)
cur_page +=1

def download_pic(url,path):
print('下载图片:' + url)
try:
pic_name = url.split('/')[-1]
img_resp = r.get(url).content
with open(path + '/' + pic_name,'wb+') as f:
f.write(img_resp)
except Exception as reason:
print(str(reason))

if __name__ == "__main__":
for url in theme_url_list:
ger_series_url_list(url)
for url in series_url_list:
fetch_all_series_pic(url)

最终代码:

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
56
57
58
59
60
61
62
63
64
65
66
67
import requests as r
from bs4 import BeautifulSoup
import os

base_url = 'http://www.win4000.com'
theme_base_url = 'http://www.win4000.com/zt/dongman_'

# 利用列表表达式生成每页链接列表
theme_url_list = [theme_base_url + str(x) + '.html' for x in range(1,6)]

#套图链接列表
series_url_list = []

# 保存文件名
save_root_dir = os.path.join(os.getcwd(),'tmp/')

# 获取所有的套图链接列表
def ger_series_url_list(url):
resp = r.get(url)
if resp is not None:
result = resp.text
bs = BeautifulSoup(result,'html.parser')
ul = bs.find('div',attrs={'class':'tab_tj'})
a_s = ul.find_all('a')
for a in a_s:
series_url_list.append(a.get('href'))

# 获取某个套图里的所有图片
def fetch_all_series_pic(url):
cur_page = 1
while True:
current_url = url
if cur_page >1:
current_url = url.replace('.html','_' + str(cur_page) + '.html')
resp = r.get(current_url) # replace()改变url链接
if resp.status_code == 404:
break
else:
if resp is not None:
result = resp.text
bs = BeautifulSoup(result,'lxml')
# 使用lxm来获取标题,用作文件名
title_name = bs.find('div',attrs={'class':'ptitle'}).h1.text
save_dir = os. path.join(save_root_dir,title_name)
if not os.path.exists(save_dir): # 如果没有保存文件的文件夹,则创建一个
os.makedirs(save_dir)
# 使用CSS选择器选择图片节点
imgs = bs.select('img.pic-large')
for img in imgs:
download_pic(img.attrs.get('src'),save_dir)
cur_page +=1

def download_pic(url,path):
print('下载图片:' + url)
try:
pic_name = url.split('/')[-1]
img_resp = r.get(url).content
with open(path + '/' + pic_name,'wb+') as f:
f.write(img_resp)
except Exception as reason:
print(str(reason))

if __name__ == "__main__":
for url in theme_url_list:
ger_series_url_list(url)
for url in series_url_list:
fetch_all_series_pic(url)

代码执行结果如图,所有的图片都下载到对应的文件中:
20200326-1-1

文章作者: Techoc
文章链接: https://techoc.xyz/posts/49869dda/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Techoc's

评论