爬虫批量下小姐姐壁纸

爬虫批量下小姐姐壁纸_第1张图片先打开想爬取的壁纸站点,分析一下:http://www.win4000.com/zt/xiaoqingxin.html爬虫批量下小姐姐壁纸_第2张图片
单击上面的套图封面会跳转到一个新的页面,如第一个封面的链接:http://www.win4000.com/zt/xiaoqingxin.html
单击切换到第二页,看到链接变成了 http://www.win4000.com/zt/xiaoqingxin_2.html ,爬虫批量下小姐姐壁纸_第3张图片
再 单 击 下 一 页, 链 接 变 成 了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)

(复制的话注意缩进,四个点是正确的)
爬虫批量下小姐姐壁纸_第4张图片
执行效果如下:
爬虫批量下小姐姐壁纸_第5张图片
爬虫批量下小姐姐壁纸_第6张图片
博客:http://www.qin2001.top

你可能感兴趣的:(else)