Python爬虫学习

爬取壁纸并保存到本地 目标网址 http://desk.zol.com.cn/dongman/


要求:

1.爬取目标网站上 “动漫” 类别下所有的壁纸。

2.壁纸必须保存到脚本运行目录下的的 IMAGES文件夹内。(文件夹由脚本自动创建 没有就创建 否则不创建)

3.保存的图片必须以对应标题名和分辨率来命名,如:秋田君的小漫画 - 1920x1200.jpg。

4.图片分辨率应该是可选分辨率中最高的。

5.要有提示信息,格式:正在下载 (下载数量):(图片名字)。

6.要有错误处理并给出相应提示,如:图片下载失败、网络超时的处理等。


预备知识:

  • requests模块的基本了解,包括get,post等方法和status_code,history等属性。
  • 熟练使用BeautifulSoup(美丽汤)进行文本定位、筛选,常用方法有find_all,select等。
  • 基本的文件流操作,如文件夹是否存在的判断,新建文件夹等

首先设置请求头避免访问受限

base_url = "http://desk.zol.com.cn/dongman/"
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}

判断文件夹是否存在并创建

def check_folder():
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

获取网页代码 第一次运行出现中文乱码 于是对字符进行了转换

def get_response(url):
    response = requests.get(url)
    response.encoding = "gbk" #改变编码,解决出现中文乱码的问题
    return response

网站动漫条目下共41页 观察每页网址特征 写一个循环把所有图片的url获取下来放在一个list里
注意需要获取最大分辨率 有些没有分辨率选项 观察可知这些图片默认分辨率都是960x600

def get_resolution(url):
    resolution_li = BS(requests.get(url).text).find_all('dd',id="tagfbl")[0].find_all('a') #爬取详情页,找到分辨率选项
    if len(resolution_li) > 1: #a标签数量大于一,有分辨率选项
        return resolution_li[0].attrs['id']
    else: 
        return '960x600'

最后下载图片 并更改命名
在代码尾部添加错误处理提示
下面给出完整代码

import requests, os
from bs4 import BeautifulSoup as BS
base_url = "http://desk.zol.com.cn"
folder_path = './IMAGES/'
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
download_number = 1
image_list = list()


def check_folder():
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

def get_response(url): 
    response = requests.get(url)
    response.encoding = "gbk" #改变编码,解决出现中文乱码的问题
    return response


def get_resolution(url):
    resolution_li = BS(requests.get(url).text).find_all('dd',id="tagfbl")[0].find_all('a') #爬取详情页,找到分辨率选项
    if len(resolution_li) > 1: #a标签数量大于一,有分辨率选项
        return resolution_li[0].attrs['id']
    else: 
        return '960x600'

def download_image(image):
    print("正在下载%d : %s"%(download_number, image['title']))
    file_name = folder_path + image['title'] +' - %s.jpg'%image['resolution']
    with open(file_name, 'wb') as f:
        f.write(requests.get(image['url']).content)
        f.flush()
    f.close()

def main():
    check_folder() 
    for i in range(1,42):
        lis = BS( get_response("%s/dongman/%d.html"%(base_url, i)).text ).find_all('li', "photo-list-padding")
        for li in lis:
            img = li.a.img
            image_item_url = base_url+li.a.attrs['href']
            resolution = get_resolution(image_item_url)
            image_list.append({'url' : img.attrs['src'].replace('208x130', resolution ), 'title' : img.attrs['title'], 'resolution' : resolution}) #将图片信息存在list里 
    global download_number
    while(len(image_list)!=0):
        image = image_list[0]
        image_list.remove(image)
        try:
            download_image(image)
            download_number+=1
        except:
            print("%s下载过程出现错误,已重新加入下载队列,稍后继续尝试"%(image['title']))
            image_list.append(image)

if __name__=="__main__":
    main()
            

最后为代码运行结果


Python爬虫学习_第1张图片

Python爬虫学习_第2张图片

Python爬虫学习_第3张图片

总结

  • 写爬虫需要细致观察网页网址差别 找出所需要的点 果断舍弃无用的
  • 要注意网页字符编码类型 不然容易出现乱码
  • 尽量使用函数封装 一是使代码清晰明了 二是可以反复调用

你可能感兴趣的:(Python爬虫学习)