打通中脉七轮方法详述的视频和图片姿势讲解

本文面向初学者。
很多同学问我:&我非常想学Python编程,但是找不到兴趣点&。 还有的同学呢,找到了很好的兴趣点,但是无从下手,&玄魂老师,我想下载tumblr上的视频, 怎么下载,Python能实现吗?你懂得(这里有一个淫笑的表情)&。
好吧,我表示对他所要表达的意思秒懂了,宅男都喜欢看别人开车。今天本人姑且装一把老司机, 带大家来分析下如何下载tumblr上的图片和视频。请大家准备好纸巾,哦不,是准备好开发工具, 我们开始写代码。
1.1 需求分析
下载一个站点上的图片和视频,无非就是写一个简易的爬虫,这里我不去使用现有的爬虫框架, 也可以很容易的完成任务。编写指定页面的爬虫,需要对目标页面的HTML结构进行分析,如果 是AJAX请求,需要进行多次的请求分析;如果存在身份验证,则要进一步处理Cookie等数据。一般的 爬虫的基本结构如下图:
即使编写一个最小的爬虫,我们也要有一个任务调度器,用来生成任务条目到队列中, 针对不同的任务类型,要编写不同的下载器。不考虑分布式部署的情况下,每一个下载器(Downloader) 应该在一个线程中执行任务。今天我们的要编写的爬虫略微简单,考虑到入门级同学,过多的 概念就不介绍了,以免发蒙。
如果你还不知道Tumblr是什么的话,请百度。 Tumblr(中文名:汤博乐) 成立于2007年,是目前全球最大的轻博客网站,也是轻博客网站的始祖。Tumblr(汤博乐)是一种介于传统博客和微博之间的全新媒体形态,既注重表达,又注重社交,而且注重个性化设置,成为当前最受年轻人欢迎的社交网站之一。雅虎公司董事会日决定,以11亿美元收购Tumblr。
这是一个高大上的网站,很多设计师,动图爱好者的聚集地。不过目前需要FQ访问。
下面我们来看一下tumblr的个人空间。
如图,每个tumblr的个人空间都是一个二级域名,你甚至可以绑定你自己的域名。在个人主页上, 是一个微博式的消息列表,有文字,图片,视频等形式。消息的展现,是页面上的JavaScript脚本 通过请求Tumblr的Api来获取返回信息,然后添加到页面上的。通过API,可以省掉很多麻烦,至少 我们不必分析整个页面的html来提取需要的信息了。
下面我们看一下接口:
上面的代码是一个接口模板,第一个参数是要访问的用户空间的用户名;第二个参数是媒体类型, 图片为&photo&,视频为&video&;第三个参数为请求的资源数;第四个参数为从第几个资源开始 请求。 下面我们构造一个photo的请求,看看返回的数据是什么样的。
我们看到返回的数据是XML格式的数据,基本的层级为Tumblr&posts&post。图片的URL在post的photo-url字段中,视频与此类似,就不再演示了。 获取到媒体资源的url之后,就可以进行下载了。
我们再构造一个video类型的请求。
video类型的资源的url,需要从player属性中进行进一步匹配才能得出最后的结果。
在具体编码之前,我们需要对可能遇到的技术难点进行一个评估,并找到解决方案。
1.2 技术点分析
1.2.1 如何发送http请求
这里推荐 request模块(https://pypi.python.org/pypi/requests/)。在我们要实现的功能 中,直接使用request模块的get方法就可以了。
1.2.2 如何处理xml数据
使用request模块发送并接收数据之后,要处理返回的XML数据,因为我们只需要获取photo-uri字段的 值就可以了,所以这里推荐使用xmltodict模块(https://pypi.python.org/pypi/xmltodict)。 xmltodic模块,将xml文档处理成类似Json对象,方便我们对数据进行访问。
1.2.3 如何实现Queue
python中自带Queue模块,可以满足我们目前的队列需求,由于python2.7和python3.0中 对queue模块的命名进行的变更,编程的时候需要注意。如果考虑兼容两个版本的话,可以 考虑引入six模块(https://pypi.python.org/pypi/six)。six模块是一个专门用于解决 从python2.x到python3.x的兼容性问题的模块,它对python版本变更导致到部分模块不能应用的问题 进行了内部处理,需要处理类似兼容问题的时候,可以考虑或者参考该模块的实现方式。
1.2.4 如何实现多线程
关于Python多线程,请自行搜索相关文章进行学习,例子很多,这里就不详细说明了。
1.2.5 如何处理json
考虑到Tumblr需要FQ访问,如果本机不使用VPN的话,可能需要配置代理,代理采用json配置方式。 处理.使用python内置的json模块(https://docs.python.org/2/library/json.html)就可以了。
1.2.6 如何使用正则表达式
为了精确匹配url信息,我们需要使用正则表达式对xml数据的中字段值进行进一步处理,使用 内置的re模块(https://docs.python.org/2/library/re.html)就可以了。
1.3 搭建程序基本框架
通过上面的分析,我们编写一个下载Tumblr图片和视频的简易爬虫已经没有技术障碍了,下面 我们搭建基本框架。
以下代码非玄魂原创,参考自/dixudx/tumblr-crawler,做了部分修改
1 # 设置请求超时时间
2 TIMEOUT = 10
4 # 尝试次数
5 RETRY = 5
7 # 分页请求的起始点
8 START = 0
10 # 每页请求个数
11 MEDIA_NUM = 50
13 # 并发线程数
14 THREADS = 10
16 # 是否下载图片
17 ISDOWNLOADIMG=True
19 #是否下载视频
20 ISDOWNLOADVIDEO=True
22 #任务执行类
23 class DownloadWorker(Thread):
def __init__(self, queue, proxies=None):
Thread.__init__(self)
self.queue = queue
self.proxies = proxies
def run(self):
while True:
medium_type, post, target_folder = self.queue.get()
self.download(medium_type, post, target_folder)
self.queue.task_done()
def download(self, medium_type, post, target_folder):
def _handle_medium_url(self, medium_type, post):
def _download(self, medium_type, medium_url, target_folder):
44 #调度类
45 class CrawlerScheduler(object):
def __init__(self, sites, proxies=None):
self.sites = sites
self.proxies = proxies
self.queue = Queue.Queue()
self.scheduling()
def scheduling(self):
def download_videos(self, site):
def download_photos(self, site):
def _download_media(self, site, medium_type, start):
67 #程序入口
68 #初始化配置
首先,我们定义了一些全局变量,看注释就明白用途了,不做过多解释。
现在看上面的类和方法的定义。DownloadWorker类,执行具体的下载任务,因为每个下载任务 要在单独的线程中完成,所以我们将DownloadWorker类继承Thread类。DownloadWorker接收从CrawlerScheduler 传递过来的Queue,它会从queue中请求任务来执行。同时如果用户配置了代理,在执行http请求的时候会使用代理。 run方法是线程启动方法,它会不停的从queue中请求任务,执行任务。download方法,首先调用_handle_medium_url 方法,获取当前任务的url,然后调用_download方法执行具体的下载任务。
CrawlerScheduler类,根据配置中需要处理的用户名,创建任务队列,初始化任务线程,启动线程执行任务。 scheduling方法,创建并启动工作线程,然后调用download_videos和download_photos方法。 download_videos和download_photos方法分别调用_download_media方法,创建具体的任务队列。_download_media 方法,首先根据传入的site创建对应的本地文件夹,然后请求Tumblr的接口,获取用户所有的图片或者视频数据压入队列。
除了上面的核心方法之外,我们创建两个配置文件proxies.json和sites.txt文件。proxies.json用来配置 代理,默认为空。
可以根据你使用的代理,进行具体的配置,比如:
"http": "http://10.10.1.10:3128",
"https": "127.0.0.1:8787"
"http": "socks5://user:pass@host:port",
"https": "socks5://127.0.0.1:1080"
sites.txt文件用来配置我们要请求的用户空间,只需要配置用户名即可,例如:
want2580,luoli-qaq
1.4 具体实现
这里大家使用最新的python版本就可以了,安装Python的时候一定要将pip一同安装。 根据1.2节的分析,我们需要安装如下模块:
requests&=2.10.0xmltodictsixPySocks&=1.5.6
为了方便,可以将这些依赖放到一个requirements.txt文件中。
然后执行命令:
pip install -r requirements.txt
基本环境准备完毕之后,在具体实现逻辑之前先引入依赖的模块。
# -*- coding: utf-8 -*-
import sys
import requests
import xmltodict
from six.moves import queue as Queue
from threading import Thread
import json
下面我们先来完善CrawlerScheduler类的scheduling方法。
def scheduling(self):
# 创建工作线程
for x in range(THREADS):
worker = DownloadWorker(self.queue,
proxies=self.proxies)
#设置daemon属性,保证主线程在任何情况下可以退出
worker.daemon = True
worker.start()
for site in self.sites:
if ISDOWNLOADIMG:
self.download_photos(site)
if ISDOWNLOADVIDEO:
self.download_videos(site)
根据全局变量THREADS定义的最大线程数,创建DownloadWorker对象,并调用start方法,启动线程。 接下来根据传入的sites,循环调用download_photos和download_videos方法。下面我们看download_photos和download_videos方法 的实现。
def download_videos(self, site):
self._download_media(site, "video", START)
# 等待queue处理完一个用户的所有请求任务项
self.queue.join()
print("视频下载完成 %s" % site)
def download_photos(self, site):
self._download_media(site, "photo", START)
# 等待queue处理完一个用户的所有请求任务项
self.queue.join()
print("图片下载完成 %s" % site)
这两个方法,只是调用了_download_media方法,传入各自的类型,和分页请求的其实索引值,目前都是从0开始。 下面看核心的_download_media方法。
def _download_media(self, site, medium_type, start):
#创建存储目录
current_folder = os.getcwd()
target_folder = os.path.join(current_folder, site)
if not os.path.isdir(target_folder):
os.mkdir(target_folder)
base_url = "http://{0}./api/read?type={1}&num={2}&start={3}"
start = START
while True:
media_url = base_url.format(site, medium_type, MEDIA_NUM, start)
response = requests.get(media_url,
proxies=self.proxies)
data = xmltodict.parse(response.content)
posts = data["tumblr"]["posts"]["post"]
for post in posts:
# select the largest resolution
# usually in the first element
self.queue.put((medium_type, post, target_folder))
start += MEDIA_NUM
except KeyError:
_download_media方法,会在当前程序执行目录创建以用户名命名的子文件夹,用来存储图片和视频文件。这里 使用os.getcwd()来获取当前程序执行的觉得路径,然后通过os.path.join(current_folder, site)构造目标文件夹 路径,通过os.path.isdir(target_folder)来判断是否已经存在该文件夹,如果没有则通过os.mkdir(target_folder) 创建文件夹。
接下来,_download_media方法循环进行分页请求,来获取图片或视频资源信息。通过requests.get(media_url,proxies=self.proxies) 发送http get请求,通过response.content获取返回的数据,然后利用xmltodict.parse(response.content)来 反序列化xml数据到data对象。调用 data["tumblr"]["posts"]["post"],获取当前返回数据中的所有媒体资源。 然后循环调用self.queue.put((medium_type, post, target_folder))方法,将每一个post字段压入队列。此时压入队列的post包含了 一个图片或者视频的各项数据,需要在worker线程执行的时候进一步处理才能得到具体的url,后面我们继续分析。
scheduling类的实现已经完成了,在scheduling类的scheduling方法中启动了线程,每个worker对象的run方法 都会执行。
def run(self):
while True:
medium_type, post, target_folder = self.queue.get()
self.download(medium_type, post, target_folder)
self.queue.task_done()
run 方法,通过self.queue.get()方法,从任务队列中获取一条任务,每个任务包含媒体类型(图片或则视频), 每个媒体的post信息以及下载文件保存的目标文件夹。run方法将这些信息传入download方法。
def download(self, medium_type, post, target_folder):
medium_url = self._handle_medium_url(medium_type, post)
if medium_url is not None:
self._download(medium_type, medium_url, target_folder)
except TypeError:
download方法首先通过_handle_medium_url方法获取具体的资源的url,然后调用_download执行下载。
def _handle_medium_url(self, medium_type, post):
if medium_type == "photo":
return post["photo-url"][0]["#text"]
if medium_type == "video":
video_player = post["video-player"][1]["#text"]
hd_pattern = re.compile(r'.*"hdUrl":("([^\s,]*)"|false),')
hd_match = hd_pattern.match(video_player)
if hd_match is not None and hd_match.group(1) != 'false':
return hd_match.group(2).replace('\\', '')
except IndexError:
pattern = re.compile(r'.*src="(\S*)" ', re.DOTALL)
match = pattern.match(video_player)
if match is not None:
return match.group(1)
except IndexError:
return None
raise TypeError("找不到正确的下载URL "
"/xuanhun/tumblr-crawler"
"提交错误信息:\n\n"
"%s" % post)
_handle_medium_url方法,根据媒体的不同采用了不同的资源获取方法。不过获取图片的方法这里还是有缺陷的, 因为用户在一个post中可能会发送一组图片,目前的方法只处理了第一张图片。如果是视频,先取出video-player 的文本内容,然后通过正则表达式匹配出视频的url,具体匹配原理,你只要参考视频请求返回的xml内容就明白了, 这里就不详细分析了。下面我们看如何下载资源。
def _download(self, medium_type, medium_url, target_folder):
medium_name = medium_url.split("/")[-1].split("?")[0]
if medium_type == "video":
if not medium_name.startswith("tumblr"):
medium_name = "_".join([medium_url.split("/")[-2],
medium_name])
medium_name += ".mp4"
file_path = os.path.join(target_folder, medium_name)
if not os.path.isfile(file_path):
print("Downloading %s from %s.\n" % (medium_name,
medium_url))
retry_times = 0
while retry_times & RETRY:
resp = requests.get(medium_url,
stream=True,
proxies=self.proxies,
timeout=TIMEOUT)
with open(file_path, 'wb') as fh:
for chunk in resp.iter_content(chunk_size=1024):
fh.write(chunk)
# try again
retry_times += 1
os.remove(file_path)
except OSError:
print("Failed to retrieve %s from %s.\n" % (medium_type,
medium_url))
_download方法先构造存储文件的路径,如果文件存在则不再反复下载,这样可以保证在下载出现错误的情况下, 我们可以手动重启程序,多次下载。通过
resp = requests.get(medium_url,
stream=True,
proxies=self.proxies,
timeout=TIMEOUT)
发送get请求,获取流数据,然后每次从流中请求1024bit数据写入磁盘,直到流结束为止:
with open(file_path, 'wb') as fh:
for chunk in resp.iter_content(chunk_size=1024):
fh.write(chunk)
至此所有核心代码都完善完毕,是不是很简单呢?确实很简单,这就是Python的强大之处。最后我们完善下程序的入口。
def usage():
print(u"未找到sites.txt文件,请创建.\n"
u"请在文件中指定Tumblr站点名,并以逗号分割,不要有空格.\n"
u"保存文件并重试.\n\n"
u"例子: site1,site2\n\n"
u"或者直接使用命令行参数指定站点\n"
u"例子: python tumblr-photo-video-ripper.py site1,site2")
def illegal_json():
print(u"文件proxies.json格式非法.\n"
u"请参照示例文件'proxies_sample1.json'和'proxies_sample2.json'.\n"
u"然后去 / 进行验证.")
if __name__ == "__main__":
sites = None
proxies = None
if os.path.exists("./proxies.json"):
with open("./proxies.json", "r") as fj:
proxies = json.load(fj)
if proxies is not None and len(proxies) & 0:
print("You are using proxies.\n%s" % proxies)
illegal_json()
sys.exit(1)
if len(sys.argv) & 2:
#校验sites配置文件
filename = "sites.txt"
if os.path.exists(filename):
with open(filename, "r") as f:
sites = f.read().rstrip().lstrip().split(",")
sys.exit(1)
sites = sys.argv[1].split(",")
if len(sites) == 0 or sites[0] == "":
sys.exit(1)
CrawlerScheduler(sites, proxies=proxies)
我们定义了usage方法,提示用户如何使用,illegal_json方法提示代理配置错误。 在程序的入口处,先判断是否有代理配置,如果有则取出信息。sites的配置支持从文件和命令行参数传入两种方式。最后 初始化CrawlerScheduler,启动抓取程序。
至此,程序构造完毕,总共才200行左右的代码,没有什么能阻挡荷尔蒙的迸发,进军吧,少年们,把撸鸡鸡的手解放出来撸撸代码,你也能做老司机! 玩笑归玩笑,希望这能激发你编程的欲望,自己动手敲一敲,会学到很多的,也许就爱上编程了呢。
最后,全部完整代码,我已经放到github上了(/xuanhun/tumblr-crawler),如果你在微信中阅读本文,点击阅读原文,可以跳转过去。我认为我已经 讲解的够详细了,同时源代码已经给到了,你还是搞不定的话,只能说编程不适合你。当然,不能勉强所有人都喜欢 编程,我把这个代码打包成了exe工具,作为宅男福利,作为对不劳而获的惩罚,你需要在微信订阅号(xuanhun521)本篇文章下面打赏&=10元,我会在微信订阅号后台统一回复给你工具包和使用方法。
请关注微信订阅号(xuanhun521,下方二维码),回复&python&,可查看更多python基础及黑客编程内容。问题讨论请加qq群:Hacking&(1群):&& Hacking&(2群):。
玄魂工作室-精彩不断
阅读(...) 评论()祥云老师讲瑜伽:打通中脉的奥秘!
祥云老师讲瑜伽:打通中脉的奥秘!
学富探索历史
打通中脉是多少瑜伽人的梦想,那么打通中脉真的就那么难吗?中脉是个外来词,我们中国道家、中医的经络系统中都没有中脉这个概念,那是不是中国人没有找到这条中脉。应该没有这种可能性,几千年来,中国人把人体上很细小的经络就搞的清清楚楚,不可能漏掉这么重要的一条经络。因此,只有两种可能,一种是中脉就是我们中医经络中的一条脉,只是名称不同;第二种是中脉和我们中医经络中的经络就不是一回事。中脉出自古印度医学阿育吠陀,目前提到打通中脉的主要是瑜伽和密宗。在瑜伽典籍《哈达瑜伽之光》中,中脉有很多名称:空径、梵穴、大道、火葬场、希瓦神径、中道等,中脉也是非常重要的概念,“昆达里尼被唤醒后才能进入这条中脉,生命气也就是能量才能进入中脉”。在哈他瑜伽的习练阶段,终极目标就是打通中脉,打通中脉就可以进入三摩地瑜伽的习练了。对中脉的描述为起源于海底轮,循行于脊柱中部,像一根直而空心的管道沿脊柱中部上行,止于头部的顶轮。中脉依次连接海底轮、生殖轮、脐轮、心轮、喉轮、眉间轮、顶轮七个脉轮。中脉是其它所有经络的主干,中脉对脉轮起到联络沟通的作用,汇聚左脉右脉以及各个脉轮的能量。中脉与中医的督脉在循行位置上在脊柱段基本一致,都在脊柱之内,功能上,中医讲督脉有统率全身阳经的作用,任脉有统领全身阴经的作用,这和中脉统领全身经脉的功能类似,只是在起始点上中脉与任督二脉有所差别。瑜伽中,中脉是昆达里尼能量的一个通道,沿脊柱上行,可以认定就是道家和中医经络的督脉。在密宗的一些资料中,中脉是说从会阴到百会,人体正中的一个通道,也是灵体离开人体的一个通道。也就是道家讲的内丹炼成,元神出体,而这个元神出体的通道在密宗中有些也叫中脉,道家称为黄庭线。这个通道不是真实存在的,只是一条线路,没有练到最高阶段这条线路是不会有的。搞清楚了中脉的感念就明白,在瑜伽中,中脉是能量的通道,就是中医经络中的督脉,所说的打通中脉,和中国道家、中医讲的打通任督二脉是一会事。中国道家讲的打通任督二脉,其实也只是要打通督脉,因为任脉本身就通着。道家的打通任督二脉同样被认为是非常难的,非常高深,其实并不是这样的,道是最高点家的打通任督二脉和瑜伽中的打通中脉都只是修行的起步,是入门的一道坎,说重要是真的,但并不难。内经图打通任督二脉之所以难,是因为保守的观念导致的,各门各派都密不外传,师父传徒弟也都留一点,甚至还有观点认为传授别人打通任督二脉是泄露天机的,必遭天谴。这样传到现在就剩个外形了,但并不是全部失传,而是隐藏在古籍文献中,这些内修方法古人也想流传给后人,但却不能明说,要么写的很隐晦,要么就写一部分,让后人去悟,所幸的是祥云老师解开了这个谜团。瑜伽的古籍文献对于打通中脉的要领记载的倒是非常全面,可惜的是缺少运用方法,就好像摆了一片零散的原件,没有装配图,组装不起来。导致现在瑜伽习练者把要领当成功法去练,比如呼吸法,实际讲的是每一个习练阶段的呼吸要领,而不是一个单独的瑜伽功法,这样在瑜伽中打通中脉也就成了可望而不可即的事。祥云老师无论是中国道家的打通任督二脉、还是瑜伽中的打通中脉,没有方法确实是难上加难,有了方法也就都不难了。现在这一方法已经找到,祥云老师依据这一方法已经辅导一百多名瑜伽人打通了中脉,身体、功力等各方面都发生了本质的变化。为了让更多的人受益,祥云老师编辑出版了《瑜伽元气内修》,通过这本书使大家对瑜伽有一个全新的认识,达到一个新的高度。祥云老师的著作
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
学富探索历史
百家号 最近更新:
简介: 读万卷书,行万里路。
作者最新文章视频:自拍时这十大姿势千万不能摆
&gt雷人囧事
视频介绍:
自拍时这十大姿势千万不能摆您当前的位置:&>&&>&}

我要回帖

更多关于 自我打通中脉的修法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信