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()
最后为代码运行结果
文章图片
文章图片
文章图片
总结
- 写爬虫需要细致观察网页网址差别 找出所需要的点 果断舍弃无用的
- 要注意网页字符编码类型 不然容易出现乱码
- 尽量使用函数封装 一是使代码清晰明了 二是可以反复调用
推荐阅读
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- 一起来学习C语言的字符串转换函数
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期