爬虫批量下小姐姐壁纸_下载图片

先打开想爬取的壁纸站点,分析一下:http://www.win4000.com/zt/xiaoqingxin.html

爬虫批量下小姐姐壁纸_xml_02


单击上面的套图封面会跳转到一个新的页面,如第一个封面的链接:http://www.win4000.com/zt/xiaoqingxin.html

单击切换到第二页,看到链接变成了 http://www.win4000.com/zt/xiaoqingxin_2.html ,

爬虫批量下小姐姐壁纸_下载图片_03


再 单 击 下 一 页, 链 接 变 成 了http://www.win4000.com/zt/xiaoqingxin_3.html,不难发现 URL 的拼凑规律。接下来介绍爬取流程。

  1. 获取每个套图封面跳转的网页地址,这里注意要抓取的页面有五个。
  2. 获得所有的套图链接后,打开套图链接,解析页面获得页数,遍历构造图片对应的网页链接。
  3. 解析网页链接,获得图片 URL,下载到本地。
    流程清晰了,接下来一步步来实现,先获得所有的套图链接,套图链接节点如下:
<li>
<a href="http://www.win4000.com/wallpaper_detail_148779.html" alt="小清新蓝色风景
图片桌面壁纸" title="小清新蓝色风景图片桌面壁纸" target="_blank">
<img src="http://pic1.win4000.com/wallpaper/2018-07-24/5b56d7e5acf53_270_185.jpg"
data-original="http://pic1.win4000.com/wallpaper/2018-07-24/5b56d7e5acf53_270_185.jpg
style="display: inline;">
<p>小清新蓝色风景图片桌面壁纸</p>
</a>
</li>

套图链接在 a 标签的 href 属性里,通过写代码来提取。代码如下:

#依次导入需要用到的库
import os
import requests as r
from bs4 import BeautifulSoup

#添加header头信息,应对网站简单的反爬机制
headers={
'Referer':'https://shop.freebuf.com/static/shop/css/style.css',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\
(KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.44'
}

base_url = "http://www.win4000.com"
theme_base_url = "http://www.win4000.com/zt/xiaoqingxin_"
# 利用列表表达式生成每页链接列表
theme_url_list = [theme_base_url + str(x) + '.html' for x in range(1, 6)]
# 套图链接列表
series_url_lists = []
# 获取所有套图的链接列表
def get_series_url_lists(url):
#resp为获取响应内容
resp = r.get(url)
#如果响应内容不为空,添加到result
if resp is not None:
result = resp.text
#bs解析网页内容
bs = BeautifulSoup(result, 'html.parser')
#查找带有tab_tj属性的div标签
ul = bs.find('div', attrs={'class': 'tab_tj'})
#提取出ul(div)标签中的a标签
a_s = ul.find_all('a')
#循环提取a标签的href属性,添加到series_url_lists中
for a in a_s:
series_url_lists.append(a.get('href'))
if __name__ == '__main__':
#遍历theme_url_list,一次提取出每个页面的图片封面url
for url in theme_url_list:
get_series_url_lists(url)
#打印筛选出的套图url数量
print(len(series_url_lists))

代码执行结果如下:

120

总共爬取到 120 条套图记录,接下来写提取套图里所有链接的方法。

<a href="http://www.win4000.com/meinv202633_3.html">
<img class="pic-large" src="http://pic1.win4000.com/pic/f/57/95f3b4f285.jpg" data-original="http://pic1.win4000.com/pic/f/57/95f3b4f285.jpg" url="http://pic1.win4000.com/pic/f/57/95f3b4f285.jpg" style="display: block;">
</a>

代码如下:

# 保存文件夹名
#os.getcwd()是获取当前文件位置
#os.path.join()拼接路径
save_root_dir = os.path.join(os.getcwd(), 'tmp/')
# 获取某个套图里的所有图片
def fetch_all_series_pic(url):
cur_page = 1
while True:
#current_url即为套图中每个图片的url
current_url = url
#根据数量来替换url
if cur_page > 1:
current_url = url.replace('.html', '_' + str(cur_page) + '.html')
#一次访问url
resp = r.get(current_url)
#如果404访问不到推出循环,下载下一套图
if resp.status_code == 404:
break
else:
#如果可以访问则继续深入解析
if resp is not None:
result = resp.text
bs = BeautifulSoup(result, 'lxml')
# 使用lxml来获取标题,用作文件夹名
title_name = bs.find('div', attrs={'class': 'ptitle'}).h1.text
save_dir = os.path.join(save_root_dir, title_name)
#如果save_dir不存在则创建文件夹
if not os.path.exists(save_dir):
os.makedirs(save_dir)
# 使用CSS选择器选择图片节点
imgs = bs.select('img.pic-large')
for img in imgs:
#根据src属性提取连接,并将保存地址传给download_pic函数
download_pic(img.attrs.get('src'), save_dir)
cur_page += 1

# 下载图片的方法
def download_pic(url, path):
print("下载图片:" + url)
try:
#将文件url以/分割取出最后一部分作为文件名
#如http://pic1.win4000.com/pic/f/57/95f3b4f285.jpg则取出95f3b4f285.jpg
pic_name = url.split('/')[-1]
#去访问文件url,得到图片信息
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__':
#循环调用get_series_url_lists(url)获得套图的url
for url in theme_url_list:
get_series_url_lists(url)
for url in series_url_lists:
fetch_all_series_pic(url)

上边是分了两步来实现功能
以下为最终完全版

import os
import requests as r
from bs4 import BeautifulSoup
base_url = "http://www.win4000.com"
theme_base_url = "http://www.win4000.com/zt/xiaoqingxin_"
# 利用列表表达式生成每页链接列表
theme_url_list = [theme_base_url + str(x) + '.html' for x in range(1, 6)]
# 套图链接列表
series_url_lists = []
# 获取所有套图的链接列表
def get_series_url_lists(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_lists.append(a.get('href'))

# 保存文件夹名
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')

resp = r.get(current_url)
if resp.status_code == 404:
break
else:
if resp is not None:
result = resp.text
bs = BeautifulSoup(result, 'lxml')
# 使用lxml来获取标题,用作文件夹名
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:
get_series_url_lists(url)
for url in series_url_lists:
fetch_all_series_pic(url)

(复制的话注意缩进,四个点是正确的)

爬虫批量下小姐姐壁纸_下载图片_04


执行效果如下:

爬虫批量下小姐姐壁纸_html_05


爬虫批量下小姐姐壁纸_html_06