栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

爬虫入门实践-车模图片下载

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

爬虫入门实践-车模图片下载

爱美之心人皆有之,去下载美女图片吧。
百度随便搜索一下:美女图,找到mm131.com网站。
以“性感车模”为例(http://www.mm131.com/chemo/),尝试编写一个下载图片的爬虫程序。

车模图片示例

结果:仅此“性感车模”一类图片达到惊人的16347张。
所以,实践中以切片选取部分来验证程序正确性,全部下载完太累,也太慢。


图片数量太惊人,请以切片实验

一、车模页面链接(导航)的构建
“性感车模”地址入口:http://www.mm131.com/chemo/
点击第3页,查看底部车模页面链接源代码,可以发现:


    首页
    上一页
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    下一页
    末页

于是构建出导航地址的完整链接:
第1页:http://www.mm131.com/chemo/
第2页:http://www.mm131.com/chemo/list_3_2.html
第3页:http://www.mm131.com/chemo/list_3_3.html
……
最后一页(末页):http://www.mm131.com/chemo/list_3_10.html

代码片断如下:

def model_nav_links():
    page_urls = []
    page_urls.append('http://www.mm131.com/chemo/')    for page_index in range(2, 11):
        page_urls.append('http://www.mm131.com/chemo/list_3_' + str(page_index) + '.html')    return page_urls

思考:为什么是10?如果更多呢?如何以程序方式获取页面数?

网站链接分析

二、页面上每位车模的链接入口
查看源代码发现,每位车模的链接入口并没有规律,类似http://www.mm131.com/chemo*;q=0.8"headers["Accept-Encoding"] = "gzip, deflate, sdch"headers["Accept-Language"] = "zh-CN,zh;q=0.8,en;q=0.6"headers["Cache-Control"] = "no-cache"headers["Connection"] = "keep-alive"headers["Host"] = get_from_host(img_url) headers["Pragma"] = "no-cache"headers["Referer"] = img_from_url headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64)<省略……>"

至此,辛苦的分析完毕!

Talk is cheap. Show me the code --Linus

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018-05-01 21:27# @Author  : AntsPi.com# @File    : car_show_model.pyimport osimport timeimport reimport requestsfrom bs4 import BeautifulSoupfrom urllib.parse import urlparsedef get_from_host(url):
    # 网址解析 from urllib.parse import urlparse
    urlParse = urlparse(url)    # print(urlParse.netloc)
    return urlParse.netlocdef get_html(url):
    try:
        headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/"
                                "537.36 (KHTML, like Gecko) Chrome/"
                                "42.0.2311.90 Safari/537.36"}
        r = requests.get(url, headers=headers, timeout=30)
        r.raise_for_status()
        r.encoding = 'gb2312'
        return r    except Exception as e:
        print('Error: ', e)        returndef model_nav_links():
    page_urls = []
    page_urls.append('http://www.mm131.com/chemo/')    for page_index in range(2, 11):
        page_urls.append('http://www.mm131.com/chemo/list_3_' + str(page_index) + '.html')    return page_urlsdef get_img_page_links(url):
    """构建某位车模的所有图片页面链接"""
    # url: 某位车模链接首页。返回:某位车模所有页面链接列表
    # 加入第1页
    img_pages = [url]    # 获取总页数img_page_total
    img_html = get_html(url).text
    img_soup = BeautifulSoup(img_html, 'html.parser')
    img_page_nums = img_soup.select('body > div.content > div.content-page > span')
    img_page_total = re.findall(r'共(d.*?)页', img_page_nums[0].string)[0]    # 生成相应的图片页面地址
    for i in range(2, int(img_page_total)+1):        # 页面构建方式:
        # 第1页:http://www.mm131.com/chemo/1603.html
        # 第2页:http://www.mm131.com/chemo/1603_2.html
        img_href = url.replace('.html', '_'+str(i)+'.html')
        img_pages.append(img_href)    return img_pagesdef download_img(url, dir_name):
    """下载1张图片"""
    # url: 车模页面的链接(页面里面含有1张图片)
    # dir_name: 下载后图片保存的文件夹名
    # 获取车模图片的地址
    img_html = get_html(url).text
    img_soup = BeautifulSoup(img_html, 'html.parser')
    img_href = img_soup.select('body > div.content > div.content-pic > a > img')    if img_href:
        img_url = img_href[0].get('src')    else:        # 最后一页是没有链接a标签的,要直接找img标签。
        img_href = img_soup.select('body > div.content > div.content-pic > img')
        img_url = img_href[0].get('src')    # 下载后的图片文件名
    only_file_name = os.path.basename(img_url)
    save_file_name = os.path.join(dir_name, only_file_name)    # 文件不存在 或 文件长度为0时,下载数据
    if not os.path.exists(save_file_name) or os.path.getsize(save_file_name) == 0:
        print('正在下载:{} ...'.format(save_file_name))
        get_img_data(url, img_url, save_file_name)
        time.sleep(0.5)    else:
        print('文件已存在:{} ...'.format(save_file_name))def get_img_data(img_from_url, img_url, file_name):
    """下载图片数据"""
    # img_from_url: 包含图片的页面链接地址
    # img_url: 图片的地址
    # file_name: 下载后的图片文件名
    # 构建请求头数据(字典)。不加会被网站拒绝(反爬虫)
    headers = {}
    headers["Accept"] = "image/webp,image*;q=0.8"
    headers["Accept-Encoding"] = "gzip, deflate, sdch"
    headers["Accept-Language"] = "zh-CN,zh;q=0.8,en;q=0.6"
    headers["Cache-Control"] = "no-cache"
    headers["Connection"] = "keep-alive"
    headers["Host"] = get_from_host(img_url)
    headers["Pragma"] = "no-cache"
    headers["Referer"] = img_from_url
    headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
    try:
        r = requests.get(img_url, headers=headers, timeout=30)
        r.raise_for_status()        if r.status_code == 200:            with open(file_name, 'wb') as fw:
                fw.write(r.content)    except Exception as e:
        print('Error: ', e)        returnif __name__ == '__main__':    # 图片计数
    img_total_num = 0
    # 车模页面的链接
    page_links = model_nav_links()    # 页面上车模们的链接及对应说明文字
    page_model_hrefs = []
    page_model_texts = []    # 实验时只用了 1 页page_links[:1]
    for page_link in page_links[:1]:
        page_html = get_html(page_link).text
        page_soup = BeautifulSoup(page_html, 'html.parser')
        page_a_links = page_soup.select('body > div.main > dl > dd a')        for page_a_link in page_a_links:            # page_a_link 的类型是:class 'bs4.element.Tag
            # 有img标签的是车模
            if page_a_link.find('img'):
                page_model_hrefs.append(page_a_link.get('href'))
                page_model_texts.append(page_a_link.find('img').get('alt'))        # 图片存放总文件夹
        model_save_dir = 'model'
        model_save_dir = os.path.join(os.getcwd(), model_save_dir)        if not os.path.exists(model_save_dir):
            os.mkdir(model_save_dir)        # 网页链接索引编号及网页链接。实验时取3位车模[:3]
        for i, page in enumerate(page_model_hrefs[:3]):            # 以车模的文字作为文件夹名
            img_save_dir = os.path.join(model_save_dir, page_model_texts[i])            if not os.path.exists(img_save_dir):
                os.mkdir(img_save_dir)            # 单个车模的页面链接page(某位车模的首页链接)
            for img_page_link in get_img_page_links(page):
                img_total_num = img_total_num + 1
                print('No.{}'.format(str(img_total_num)))
                download_img(img_page_link, img_save_dir)

原创初稿:2018-05-03



作者:代码小工蚁
链接:https://www.jianshu.com/p/915eee3261c6


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/225111.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号