Python3网络爬虫(十):这个帅哥、肌肉男横行的世界(爬取帅哥图)

运行平台: Windows Python版本: Python3.x IDE: Sublime text3

1 前言

    之前,感觉网上类似于《爬取妹子图》这样的爬虫教程有很多,所以我就没有写爬取图片的实战教程。 最近,有关注我爬虫教程的朋友说,希望我可以出个爬取图片的教程。那么,今天就谈一谈如何爬取图片吧。其实爬取图片相对于一些抓包分析的东西,还是简单很多的,只要找到图片的地址,我们就能够下载下来。别人的爬取图片教程都是爬取《妹子图》,有爬“煎蛋”网的,有爬“妹子图”网的,妹子图片那叫一个劲爆啊!可谓目不暇接。看的我身体也一天不如一天了。出于对广大朋友身体的考虑,今天咱就不爬妹子图了,咱爬《帅哥图》!(PS:我不会告诉你,我是想看看有没有美女程序员光临!)

2 预备知识

    为了也能够学习到新知识,本次爬虫教程使用requests第三方库,这个库可不是Python3内置的urllib.request库,而是一个强大的基于urllib3的第三方库。

    requests库的基础方法如下:

    官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

    因为官方给出的《快速上手》教程已经整理的很好了,并且本次教程使用的也是最简单的requests.get(),因此第三方库requests的使用方法,不再累述。详情请看官方中文教程,有urllib2基础的人,还是好上手的。

3 实战

3.1 背景

    爬取《帅啊》网的帅哥图片!

    URL : http://www.shuaia.net/index.html

    先看一眼网站的样子:

3.2 requests安装

    在cmd中,使用如下指令安装第三方库requests:

pip3 install requests

    或者:

easy_install requests

3.3 爬取单页目标连接

    通过审查元素,我们不难发现,目标的地址存储在class属性为”item-img”的<a>标签的href属性中。这时候,有人可能会问为啥不用下面的<img>标签的src属性?因为这个图片是首页的浏览图片,根据这个地址保存下来的图片,太小了,并且不清清楚。秉承着热爱“高清无码”的精神,这种图片可不是我想要的。因此,先获取目标的地址,也就是我们点击图片之后,进入的网页地址,然后根据下一个网页,找到图片的地址。

    代码:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests

if __name__ == '__main__':
    url = 'http://www.shuaia.net/index.html'
    headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    }
    req = requests.get(url = url,headers = headers)
    req.encoding = 'utf-8'
    html = req.text
    bf = BeautifulSoup(html, 'lxml')
    targets_url = bf.find_all(class_='item-img')
    list_url = []
    for each in targets_url:
        list_url.append(each.img.get('alt') + '=' + each.get('href'))
    print(list_url)

    我们将爬取的信息保存到list中,图片名字和图片地址使用”=”连接,运行结果:

3.4 爬取多页目标连接

    翻到第二页的时候,很容易就发现地址变为了:www.shuaia.net/index_2.html。第三页、第四页、第五页依此类推。

    代码:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests

if __name__ == '__main__':
    list_url = []
    for num in range(1,20):
        if num == 1:
            url = 'http://www.shuaia.net/index.html'
        else:
            url = 'http://www.shuaia.net/index_%d.html' % num
        headers = {
                "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
        }
        req = requests.get(url = url,headers = headers)
        req.encoding = 'utf-8'
        html = req.text
        bf = BeautifulSoup(html, 'lxml')
        targets_url = bf.find_all(class_='item-img')

        for each in targets_url:
            list_url.append(each.img.get('alt') + '=' + each.get('href'))
    print(list_url)

    我们少爬取一些,爬取前19页的目标连接:

3.5 单张图片下载

    进入目标地址,审查元素。可以看到,图片地址保存在了class属性为”wr-single-content-list “的div->div->img的src属性中。

    代码:

target_url = 'http://www.shuaia.net/rihanshuaige/2017-05-18/1294.html'
filename = '张根硕拍摄机车型男写真帅气十足' + '.jpg'
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    }
img_req = requests.get(url = target_url,headers = headers)
img_req.encoding = 'utf-8'
img_html = img_req.text
img_bf_1 = BeautifulSoup(img_html, 'lxml')
img_url = img_bf_1.find_all('div', class_='wr-single-content-list')
img_bf_2 = BeautifulSoup(str(img_url), 'lxml')
img_url = 'http://www.shuaia.net' + img_bf_2.div.img.get('src')
if 'images' not in os.listdir():
    os.makedirs('images')
urlretrieve(url = img_url,filename = 'images/' + filename)
print('下载完成!')

    我们将图片保存在程序文件所在目录的imgase目录下:

3.6 整体代码

    已经获取到了每张图片的连接,我们就可以下载了。整合下代码,先少下载一点,下载前2页的图片。

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
import requests
import os
import time

if __name__ == '__main__':
    list_url = []
    for num in range(1,3):
        if num == 1:
            url = 'http://www.shuaia.net/index.html'
        else:
            url = 'http://www.shuaia.net/index_%d.html' % num
        headers = {
                "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
        }
        req = requests.get(url = url,headers = headers)
        req.encoding = 'utf-8'
        html = req.text
        bf = BeautifulSoup(html, 'lxml')
        targets_url = bf.find_all(class_='item-img')

        for each in targets_url:
            list_url.append(each.img.get('alt') + '=' + each.get('href'))

    print('连接采集完成')

    for each_img in list_url:
        img_info = each_img.split('=')
        target_url = img_info[1]
        filename = img_info[0] + '.jpg'
        print('下载:' + filename)
        headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
        }
        img_req = requests.get(url = target_url,headers = headers)
        img_req.encoding = 'utf-8'
        img_html = img_req.text
        img_bf_1 = BeautifulSoup(img_html, 'lxml')
        img_url = img_bf_1.find_all('div', class_='wr-single-content-list')
        img_bf_2 = BeautifulSoup(str(img_url), 'lxml')
        img_url = 'http://www.shuaia.net' + img_bf_2.div.img.get('src')
        if 'images' not in os.listdir():
            os.makedirs('images')
        urlretrieve(url = img_url,filename = 'images/' + filename)
        time.sleep(1)

    print('下载完成!')

    运行结果如下:

    最终下载的图片:

4 总结

    图片是不是很帅?还算满意吧?

    这种爬取方法是比较简单的,速度慢。服务器有防爬虫程序,所以不能爬太快,每下载一个图片需要加个1秒延时,否则会被服务器断开连接。当然,解决办法还是有的,因为不是本文重点,以后有机会再细说。

    爬取图片的原理就是这样了,如果想爬取妹子图的可以去看看,包你满意。

PS: 如果觉得本篇本章对您有所帮助,欢迎关注、评论、顶!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

Python拉勾爬虫——以深圳地区数据分析师为例

拉勾因其结构化的数据比较多因此过去常常被爬,所以在其多次改版之下变得难爬。不过只要清楚它的原理,依然比较好爬。其机制主要就是AJAX异步加载JSON数据,所以至...

3416
来自专栏用户2442861的专栏

Python对文件进行批量随机重命名

http://blog.csdn.net/vipygd/article/details/7959440

2212
来自专栏我和PYTHON有个约会

爬虫正传-江湖路远-0102-少侠师承何处

少侠初入江湖,尚不知江湖险恶,入门级别的爬虫很快就被人识破,并对爬虫程序的发起IP地址进行了封锁 WHY?因为少侠不知江湖套路,爬虫程序在网络上直接裸奔,只要...

873
来自专栏耕耘实录

存储进阶:RAID简介

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1453
来自专栏数据小魔方

左手用R右手Python系列——百度地图API调用与地址解析/逆解析

地理位置信息的解析与逆解析可能是我们在分析地理位置数据时所面临的最棘手的问题了,好在现在很多主流的在线 地图厂商地给开发者提供了免费的API接口调用。 这一篇以...

5237
来自专栏ShaoYL

iOS定位--CoreLocation框架

42510
来自专栏不止思考

RAID磁盘阵列是什么(一看就懂)

在单机时代,采用单块磁盘进行数据存储和读写的方式,由于寻址和读写的时间消耗,导致I/O性能非常低,且存储容量还会受到限制。另外,单块磁盘极其容易出现物理故障,经...

974
来自专栏小樱的经验随笔

如何手动写一个Python脚本自动爬取Bilibili小视频

国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶~~

3942
来自专栏肖洒的博客

【爬虫】(四)西电研究生教务系统技术文档

关于教务系统的一系列爬取工作已经初步完成,Holi爬虫组的工作也算正式进入优化阶段。 我们需要根据后台组的需要,转换成CVS或数据库形式。需要和后台组进行商量。...

7531
来自专栏顶级程序员

一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)

今天是农历小年,顶级程序员祝大家小年夜快乐~ ? 单机部署(stand-alone):只有一个饮水机提供服务,服务只部署一份 集群部署(cluster):有多...

3737

扫码关注云+社区

领取腾讯云代金券