Python爬虫: 单网页 所有静态网页 动态网页爬取
前言:所有页代码主干均来自网上!!!感谢大佬们。
其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽然是个晒图APP,但是它的图不管是手机端还是网页端都是不提供下载的,连右键另存为都没有。当然,稍微懂一点计算机的在网页端翻翻源码找找下载链接也是能下载,但对大众来说,看到好看的图,又不能下载是一件很讨厌的事。
之前我是怎么下的呢,我先把PO文地址发给inskeeper微信公众号,然后对面就会返回图给我。
这次老师让我们做爬虫,我一下就想到了这件事,公众号能够根据链接给我返图,很明显是服务器端根据链接用爬虫把图爬了下来。我就想自己写一个爬虫,也能给个链接把图爬下来。而且,我还想更方便一点,给个某个人的IG首页地址,我就自动把他发过的所有图片和视频都一次性打包下载下来,想想就很爽啊。代码就是懒人的天堂,要是什么事都能一次码几行代码,以后千年万年再遇到这事打开运行一下就完事,那世界多美好啊!
我这次做的是爬图:
- 爬虫1.0:爬取百度贴吧帖子某一页的所有图片(小图–>原图)
- 爬虫2.0:爬取百度贴吧某一个帖子所有页面的所有图片(静态单页–>静态多页)
- 爬虫3.0:爬取Instagram某PO主的所有历史图片和视频(静态网页–>动态网页(json瀑布流网页))
至于,用开发者模式写爬虫的基本姿势、静态多页怎么爬,动态瀑布流网页又怎么爬请自行参考Refenrence中链接网址,百度贴吧的源码我不记得是来自哪个网址了= = 如果原作者看到求原谅!!在评论备注吧感激不尽!!
我的代码主干基本来自大佬们的博客,只是做了增加或者改动,其中IG爬取的代码改动较大,我将POST方式改为了PUT方式,POST以及不能得到Json了。
这个是第一次写(改= =)Python,代码结构乱请原谅…比较久远的代码懒得改了= =
爬虫1.0:爬取百度贴吧帖子某一页的所有图片(小图–>原图)
很简单,自行读代码+百度。忘了大佬原博客真的抱歉= =
这里我做到改动是,将小图链接进一步爬取转换成了大图链接。
源码如下: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()
爬虫2.0:爬取百度贴吧某一个帖子所有页面的所有图片(静态单页–>静态多页)
这个爬虫总共100行左右,一般是我后来加的注释,也就是说代码50行。
代码函数关系如下: