收集动漫壁纸[python图片爬虫]

不知道怎么就买了个pi3,自带wifi和蓝牙,这样就不用插一根usb 网卡还得考虑驱动的问题。

而且这么多的VPS开着流量也用不完,而且最近还在学校里弄到个工作室,这样就可以做一个爬虫挂在工作室里24小时不用断电。

raspbian自带python 2.7.X和3.4.X 默认python是运行2.X版本所以运行3得用python3

我的爬虫范例

我们这次就拿http://konachan.com/来作为例子

编写爬虫

  • 1.首先需要解析HTML内容 konachan的图片是以一串编号的模式访问的,而且是递增式,这样我们解析的难度就减少了很多

以“http://konachan.com/post/show/”为基础在后面加上数字id就可以获取到图片的sample页面

def getHtml(url):
        page = urllib.request.urlopen(url)#打开网页
        html = page.read()#读取网页
        html = html.decode('UTF-8')#以UTF8方式解析网页
return html#返回网页

这样就可以完成打开网页的基本操作,但是打开网页的过程可能会遇到各种异常,而如果不对产生的异常进行处理的话会导致程序中断,爬虫可能就会这样死在路上。


def getHtml(url):
        try:
                page = urllib.request.urlopen(url)
                html = page.read()
                html = html.decode('UTF-8')
        except:
                return "error"
        return html

  • 2.获取图片地址 然而上面打开的图片仅仅是sample,konachan是将压缩过的sample给用户看,如果喜欢则可以选择大图链接进行下载,这种模式可以增加访问者的加载速度也可以一定程度减轻服务器的负担,所以我们需要通过正则来获得原始图片的链接地址

konachan_larger

我们可以看到View larger version链接的class中一定会有highres-show这个属性,所以正则编写起来更方便

‘highres-show” href=”(.+?)"‘通过这个正则表达式就可以获取原始图片的url链接


def getImg(html):
        reg = r'highres-show" href="(.+?)"'
        imgre = re.compile(reg)
        imglist = re.findall(imgre,html)#获取大图链接
        if len(imglist)==0:#如果找不到说明页面没有图片
                return "empty"
        splited = imglist[0].split("/")#将url split
        fileName = splited[len(splited)-1]#获取文件名
        try:
                urllib.request.urlretrieve(imglist[0],fileName )#下载图片
        except:
                return "failed"#如果下载失败
        return fileName#返回图片名

  • 3.开始工作 完成
for i in range(1,300000): #爬取范围
        trueurl = url+str(i)
        html = getHtml(trueurl)
        if html=="error":
                continue
        print(str(i)+":"+getImg(html)+"\n")

这样一只单线程的爬虫就这样完成了,运行试试看。 你们可以根据自己任务的需要对爬虫进行修改,来爬取自己需要的内容

ps:konachan将tag都会加入到文件名上,所以你可以根据文件名来排除某些内容