Python爬虫学习

爬取壁纸并保存到本地 目标网址 http://desk.zol.com.cn/dongman/ 要求: 1.爬取目标网站上 “动漫” 类别下所有的壁纸。
2.壁纸必须保存到脚本运行目录下的的 IMAGES文件夹内。(文件夹由脚本自动创建 没有就创建 否则不创建)
【Python爬虫学习】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 responsedef 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爬虫学习
文章图片

Python爬虫学习
文章图片

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

    推荐阅读