赞
踩
其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽然是个晒图APP,但是它的图不管是手机端还是网页端都是不提供下载的,连右键另存为都没有。当然,稍微懂一点计算机的在网页端翻翻源码找找下载链接也是能下载,但对大众来说,看到好看的图,又不能下载是一件很讨厌的事。
之前我是怎么下的呢,我先把PO文地址发给inskeeper微信公众号,然后对面就会返回图给我。
这次老师让我们做爬虫,我一下就想到了这件事,公众号能够根据链接给我返图,很明显是服务器端根据链接用爬虫把图爬了下来。我就想自己写一个爬虫,也能给个链接把图爬下来。而且,我还想更方便一点,给个某个人的IG首页地址,我就自动把他发过的所有图片和视频都一次性打包下载下来,想想就很爽啊。代码就是懒人的天堂,要是什么事都能一次码几行代码,以后千年万年再遇到这事打开运行一下就完事,那世界多美好啊!
我这次做的是爬图:
至于,用开发者模式写爬虫的基本姿势、静态多页怎么爬,动态瀑布流网页又怎么爬请自行参考Refenrence中链接网址,百度贴吧的源码我不记得是来自哪个网址了= = 如果原作者看到求原谅!!在评论备注吧感激不尽!!
我的代码主干基本来自大佬们的博客,只是做了增加或者改动,其中IG爬取的代码改动较大,我将POST方式改为了PUT方式,POST以及不能得到Json了。
这个是第一次写(改= =)Python,代码结构乱请原谅…比较久远的代码懒得改了= =
很简单,自行读代码+百度。忘了大佬原博客真的抱歉= =
这里我做到改动是,将小图链接进一步爬取转换成了大图链接。
源码如下:GitHub下载:BaiduBarOnePageCrawler.py
#!/usr/bin/python # coding:utf-8 # 实现一个简单的爬虫,爬取贴吧/图库图片 import requests import re # 根据url获取网页html内容 def getHtmlContent(url): page = requests.get(url) return page.text # 从html中解析出所有jpg图片的url # 百度贴吧html中jpg图片的url格式为:<img ... src="XXX.jpg" width=...> def getJPGs(html): # 解析jpg图片url的正则 jpgs = [] print(jpgs) #https: // www.instagram.com / p / BgfjlvlDg4H /?taken - by = tee_jaruji jpgReg1 = re.compile(r'"shortcode":"(.+?)"') print(jpgReg1) jpgs1 = re.findall(jpgReg1, html) print(jpgs1) for url1 in jpgs1: print('https://www.instagram.com/p/'+url1+'/?taken-by=tee_jaruji') html = getHtmlContent('https://www.instagram.com/p/'+url1+'/?taken-by=tee_jaruji') #750w,https://scontent-nrt1-1.cdninstagram.com/vp/cdb59589c0f5abc42a923bf73b5506d0/5B36AA4F/t51.2885-15/e35/29415875_200094744088937_5818414838958784512_n.jpg 1080w" #print(html) jpgReg2 = re.compile(r'750.+?{"src":"(https://.+?\.jpg)","config_width":1080') print(jpgReg2) jpgs2 = re.findall(jpgReg2,html) print(jpgs2) if len(jpgs2)!=0: jpgs.append(jpgs2[0]) print(jpgs) return jpgs # 用图片url下载图片并保存成制定文件名 def downloadJPG(imgUrl,fileName): # 可自动关闭请求和响应的模块 from contextlib import closing with closing(requests.get(imgUrl,stream = True)) as resp: with open(fileName,'wb') as f: for chunk in resp.iter_content(128): f.write(chunk) # 批量下载图片,默认保存到当前目录下 def batchDownloadJPGs(imgUrls,path = './img/'): # 用于给图片命名 count = 1 for url in imgUrls: print(url) downloadJPG(url,''.join([path,'{0}.jpg'.format(count)])) print('下载完成第{0}张图片'.format(count)) count = count + 1 # 封装:从百度贴吧网页下载图片 def download(url): html = getHtmlContent(url) #print(html) jpgs = getJPGs(html) batchDownloadJPGs(jpgs, './img/') def main(): url = 'https://www.instagram.com/tee_jaruji/' download(url) if __name__ == '__main__': main()
这个爬虫总共100行左右,一般是我后来加的注释,也就是说代码50行。
代码函数关系如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。