仙女姐姐@chuu chloe和@什么七七——python图片爬虫

仙女姐姐@chuu chloe和@什么七七——python图片爬虫

两年以前用爬虫爬过一个学校网站,现在忘得那是一干二净。可不成想,望着众多的美女图片,我竟然也会有嫌麻烦的时候。或许我应该说,是眼前这让人眼花缭乱目不暇接的美好,让我感叹时间的宝贵,想要迅速将她们“一网打尽”,我找到高分chrome插件,却发现这些插件只能下载部分图片,于是我从头捡起爬虫,写下这篇整理性的文章。没有需求,哪来的学习的动力?

最简单的爬虫

首先必须说的是,我不需要写那种一爬爬全站的爬虫,我只看好看的XD。这次看到的是这位chuu chloe姐姐,大家或许见过,绝对一见倾心的那种。爬的网站是我时不时逛逛的宅男吧,上面有时会有高质量的图。我没有大量爬图,不会对网站产生什么影响。目标网址:http://zhainanba.net/21483.html。贴一张目标截图:

概览.jpg

我第一眼看到这位姐姐,就看呆了,已经说不出话来。我想说,看到她我好像看到了无人的纯白雪山——她值得我为她写一个爬虫。

初次尝试

爬虫重要的不是代码,而是分析网页的方法。老规矩F12进行审查。

审查元素1.jpg

很快注意到图片的url是由数字结尾,按尾数进行循环便能将这些图全爬下来。首先只写这么一个简单的规则找点感觉。

### 如果url规则简单到能一眼看出,直接用简单的版本。b                                                         
# 导入常用的爬虫包
import urllib.request 
import re 
import os 
import requests

# 定义一个路径函数,用来确定保存图片的路径
targetDir = input('图片存储路径')

def destFile(path):
    if not os.path.isdir(targetDir): # 如果路径不存在则创建
        os.mkdir(targetDir)
    pos = path.rindex('/') # 以最后一个斜杠后的字符作为图片名称
    t = os.path.join(targetDir,path[pos+1:])
    return t 

fail_url = [] # 这个列表是为了记录下之后可能出现的超时情况
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Referer': 'http://zhainanba.net/21483.html'}

注意到我这里的header里写了referer,第一次写没有写referer,是我小看了这个网站,我以为他不会有反爬措施,没想到还是采用了基本的反爬。。。referer简单来说就是标识“你是从哪个网站来到这个网站的”,如果不加referer的话会报404(推荐写header时把能加的信息都加上)。

爬虫代码

下面写爬虫体。我加了一个超时处理的步骤,因为在运行时发现有些图片在request时会卡住,可能网站有进一步的反爬措施,具体的之后得检查源码才能看出是网络问题还是有反爬机制。

if __name__ == "__main__":
        for i in range(1,31,1): # 爬尾号为1 - 30 的所有图片
        i = str(i)
        if len(i) < 2: # 之前注意到url中尾数小于10都补了零,这里也用简单的判断补上
            i = '0' + i
        else:
            pass
        link = 'http://ac.meijiecao.net/ac/img/znb/meizitu/20190611_meizitu_' + i + '.jpg' # 爬取的图片url
        print(link)
        try: 
            r = requests.get(link,headers = header,timeout=(10,10)) # 用timeout和try来防止超时
            filename = destFile(link)
            if r.status_code == 200: # 响应码为200时才进行写入,304和404都不写
                open(filename,'wb').write(r.content) 
                print(r.status_code,'Sucess!')
                del r 
            else:
                print(r.status_code,'Fail.')
                pass
        except:
            print(link,'Timeout.')
            fail_url.append(link) # 将超时的url加入列表
            pass

运行结果如下:

结果1.jpg

因为图片有水印,这里也不便于直接放出,给出链接:链接: https://pan.baidu.com/s/1leTJLlw8mm7AVlP_hb9ATg 提取码: 16ti

再战:采用BeautifulSoup

老是去查看url的尾数也不是长久之计,很多url都不规则,不可能每一次都去找规律,所以用网页解析器才是正道。简单的parser我选BeautifulSoup。bs4的全面用法我推荐Beautiful Soup 4.4.0 文档。这次换一个爬,@什么七七 这位小姐姐也是一位仙女。

# parse html with bs4, urls from zhainanba
from urllib import request
from bs4 import BeautifulSoup
fail_url = []
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Referer':'http://zhainanba.net/tag/%e7%bd%91%e7%bb%9c%e7%ba%a2%e4%ba%ba'} # referer和url需要自己更改,懂的都懂,不懂只能查

targetDir = input('图片存储路径')

def getHTMLcode(url):
    re_url = request.Request(url,headers=header)
    page_code = request.urlopen(re_url).read()
    return page_code.decode('utf8')

def getImg(page_code):
    soup = BeautifulSoup(page_code,'html.parser')
    image_list = soup.find(attrs={'class':'article-content'}) # 查看源码可知所有的图片都在article-content
    image = image_list.find_all('img') # 图片在article-content下的img里
    for img in image:
        img_url = img.get('src') # 图片的url在src里
        print(img_url)
        try: 
            r = requests.get(img_url,headers = header,timeout=(10,10)) # 用timeout和try来防止超时
            filename = destFile(img_url)
            if r.status_code == 200: # 响应码为200时才进行写入,304和404都不写
                open(filename,'wb').write(r.content) 
                print(r.status_code,'Sucess!')
                del r 
            else:
                print(r.status_code,'Fail.')
                pass
        except:
            print(img_url,'Timeout.')
            fail_url.append(img_url)
            pass

        
url = 'http://zhainanba.net/22631.html'
page_code = getHTMLcode(url)
getImg(page_code)

结果如下:

结果2.jpg

也分享在网盘里:

链接: https://pan.baidu.com/s/1jot8BkVSVB9JT-599fZSDA 提取码: bp63

总结

写爬虫不仅是为了短时间获得自己想获得的东西,也是为了以后的一些小项目做准备。其中的一个想法是,如果要训练仙女们的脸部模型,大批量的照片必不可少,所以之后可能要挑战sina的反爬机制,或者找一些图量大的网站琢磨一下。这个过程中,肯定会积累很多的优质图片,不只有仙女,还会有那些不太上得了台面的东西,我就不说了,我挺相信我的眼光的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值