你好,游客 登录
背景:
阅读新闻

我的第一个Python爬虫爬了12万多张照片

[日期:2017-09-07] 来源:简书  作者:idisreg [字体: ]

这篇文章记录一下我的第一个爬虫的产生的经历,其实我们学习任何一个新事物,只要找到学习方法,那么学习这件小事就变得很容易。

从接触网络的那一刻开始,我就迷上了网络。有时候看见别人的网页做的很炫酷,心里那个叫羡慕。看见别人会编程,就觉得别人很牛逼。自然而然的我也想学一门编程语言,可是那时候还是too young to simple.看见这个想着那个,反正就是在网上闲逛的时候,保存了很多很多的教程,就是没有看过,只是一味的保存, 没有看自然就没学到什么,最后,我只是成为的一个收藏家。

在大学大一的暑假,我觉得我要有所行动了,就把百度网盘之前的保存的极客学院的前端教程下载在电脑,在暑假期间就看了一遍,只是我没有照着视频教程把代码打一遍,只是觉得很简单,一看就懂,干嘛还要亲自动手打一遍,看看当时自己,现在都觉得有点搞笑。大家都知道,学习编程,只是看,是没有什么用的,只有亲自动手把代码打一遍,才有可能学会,一句话说完,就是要实践。那是不是说我这段经历一点卵用都没有,那倒不是,我一直坚信 现在学到的任何东西,都会在以后的某个时间节点派上用场,由于学过前端,我对网页的结构还是有一定的了解的,这对于网络爬虫来说是必须的知识呀。

再后来我转了专业,是以数据有着密不可分的专业,那么没有数据就不能快乐的玩耍啦。那么数据要从哪里来呢,后来在刷知乎的时候,得知Python可以很方便的爬取你需要的数据,那么好了,既然这么好,我就学这个Python就好了,之前总是在纠结究竟该学那们语言,浪费许多时间,现在想想真是不应该呀。

学习知识不要这里学点,那里学点,因为这样到头来你会什么都学不到。正确的方法是找到一个权威的学习资料,不要在和其他去比较,没必要把时间浪费在比较上,沉下心来就是学。
基础知识文字版的话,我这里推荐廖雪峰的Python3教程

基础知识视频版的话,我这里推荐中国MOOC大学的嵩天老师的Python教程

有了基础知识就可以选择方向了,Python有很多方向,比如 网络编程,网络爬虫等等,这里也要选定一个自己喜欢的方向,然后就是就是学,不要这个蜻蜓点水学一点,那个也学一点,这样到最后你会什么也学不到,因为任何一个方向,不是一两天就能学会的,学深入,也是够你学的很久的了。

学习什么东西,你找到正确的学习方法,就能很容易入门,而不是一直在门外徘徊,学习Python爬虫也是一个道理。学习Python爬虫这里我也推荐嵩天老师的Python网络爬虫与信息提取,虽然现在课程已经结束了,但是还是可以查看内容,看了这个教程你一定会回来来感谢我。

爬虫相关的库有很多,requests库和BeautifulSoup库是最为出名的两个第三方库,我建议大家应该看一遍这两个库的文档requests库学习文档中文版
BeautifulSoup库学习文档中文版

学习爬虫还要学习一些正则表达式,这里是正则表达式*30分钟入门教程

这是正则表达式的测试工具,在学习正则表达式时做测试必不可少!

学些了这些教程就可以开始写一个自己的教程了,还记得去年我关注了vivo手机的官方微信,当时他在举办一个自拍大赛,当时这个比赛结束的时候,我就打开这个比赛的网页看了一下,足足有3000多页的自拍照片,我就想着能不能把这些照片全部保存下来,如果一个一个保存,那是不可能实现的事情,可是又限于当时啥都不会,后来听说爬虫可以把照片,我就立志一定要学会爬虫,把这些美女照片全部爬取下来。所以,学习呀,还是要带有一定的目的性(动机)的,要不就坚持不下来了,不管动机是好的还是坏的,必须要有。

当我查看这个网页的源代码,发现图片居然在网页是看不见,而是通过JS加载的方式出来,搞到我一脸懵逼,因为我根本就没有学过怎么爬取JS加载的照片,后来我通过百度谷歌了解到了可以通过按F12查看Network的XHR查看这是地址,由于当时我查看到时候没有刷新网页,所以什么都没看见,后来在一个群里问了一句,没想到一个群成员不到几秒就给我回答了我。


聊天截图1.png

聊天截图2.png

说干就是干,就是当时这个人说这个方法有点小问题,这样是可以获取照片的,但是再写爬虫的时候,因为这个链接有一个 转义符,在浏览器在访问是可以访问到照片的,但是在爬虫虽然也是可以下到照片的,但是显示照片损坏,后来我加了一个状态码看了一下,发现返回的时候404,也就是说地址是不存在这个资源的,所以第一个版本以失败告终。

然后我换了一个思路,写两个正则表达式,获取两部分的内容,到时候在把他们连接起来不就OK了么,说干就是干,以下是代码:

# Script Name    : vivogeniessephotoscrawler
# Author        : idisreg
# Created        : 2017-04-09
# Description    : vivogeniesse自拍大赛照片爬虫
import os
import requests
import re
base_url = "https://geniesse.vivo.com.cn/index.php//Home/Index/officiaoWebGetImageList?page=1&num=126324"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3018.3 Safari/537.36'}
r = requests.get(base_url,headers = headers)
pat1 = '\d{4}\-\d{2}\-\d{2}'
pat2 = '[\/0-9a-z\.]{41}'
imglist1 = re.compile(pat1).findall(r.text)
imglist2 = re.compile(pat2).findall(r.text)
for i,j in zip(imglist1,imglist2):
    thisimgurl = 'https://files.vivo.com.cn/activity/attachments/geniesse/' + i + j
    # print(thisimgurl)
    root = "D://picss//"
    path = root + thisimgurl.split('/')[-1]
    try:
        if not os.path.exists(root):
            os.mkdir(root)
        if not os.path.exists(path):
            pic = requests.get(thisimgurl,headers = headers)
            with open(path,'wb') as f:
                f.write(pic.content)
                print("文件保存成功...")
        else:
            print("文件已存在...")
    except:
        print("爬取失败!")

代码足够简单,但是够用,利用这么一小段代码,我利用一天的时间爬取了12万多张自拍照片(只有2M的渣渣网络),看图:


爬取到的美女自拍照片.png

网络爬虫一点也不难,至少说入门并不是很难,所以朋友们你们还等什么?

收藏 推荐 打印 | 阅读: