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()
            

最后为代码运行结果




总结

  • 写爬虫需要细致观察网页网址差别 找出所需要的点 果断舍弃无用的
  • 要注意网页字符编码类型 不然容易出现乱码
  • 尽量使用函数封装 一是使代码清晰明了 二是可以反复调用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容