2020-03-13

仙女姐姐@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的反爬机制,或者找一些图量大的网站琢磨一下。这个过程中,肯定会积累很多的优质图片,不只有仙女,还会有那些不太上得了台面的东西,我就不说了,我挺相信我的眼光的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容

  • 同学们,关于今天的语文课,霍老师开始敲黑板,讲重点了!快拿出小本本,睁大小眼睛,记一记吧! 3月13日语文课 课文...
    霍小莹会努力哒阅读 1,074评论 0 2
  • 20上师大学科语文经验贴来啦~ 嗨喽,学弟学妹们,我是一位刚参加完20届考研的学姐,我本科是一个普通的二本院校,专...
    woainicxj阅读 209评论 0 0
  • 我把小母鸡从屋顶扔了下去,母鸡惊慌失措的扑扇着臂膀,一开始它飞翔的线型比较平缓,不断下滑,那一刻我看到它利用...
    Older漫阅读 183评论 0 0
  • 大学已经毕业了,短短的一年换了好几份工作,每一份工作都没有坚持太长时间,不是嫌弃工作太累。就是嫌弃工资太低,没有什...
    张伟_d525阅读 240评论 0 0
  • 183. Customers Who Never Order Question: Suppose that a w...
    廖少少阅读 625评论 0 0