前言
好久没上简书了,一是因为忙,二是因为感觉没啥可以写的。刚好这几天放假,闲下来,碰巧前段时间因为需要搞OCR、OpenCV,就开始接触Python,然后今天写点东西,巩固一下。
习惯了C++、Java这种强类型的语言,不太习惯这种若类型的动态语言,感觉很多调用的顺序及方法都要死记硬背的样子,不能像Java一样,看方法名、参数类型、返回类型等自己推敲使用方法。但是写久了也就习惯了。
想法
前两年,因为陆家嘴、优衣库等小视频的原因,导致Tumblr成为大家的焦点,最终导致被和谐。这对我这种小屌丝的打击程度不亚于被LPL又止步S联赛八强。还好,我掌握了爬梯子的技巧,通过梯子,观摩了不少小视频。但是,我发现以前看的小视频慢慢的都变得无法加载等情况,虽然说那些都是撸过的小视频,好马不吃回头草,但是,那是我的青春,怎么能这样忘记他们呢!!!
于是,从网上搜了下别人写好的爬虫,发现只能爬取转载或发表的视频,不能爬取like视频,要知道,我都是不转载,只点like的,那怎么办,那就自己动手写咯。
动手
代码其实不长,而且挺简单的,没有考虑太多,能用就行。废话不说,上代码。
import urllib.request
import urllib.error
import sqlite3
import re
class Tumblr(object):
def __init__(self, like_url, start_page):
# 设置代理,ss代理
proxies = {"http": "http://127.0.0.1:1080", "https": "http://127.0.0.1:1080"}
proxy_handler = urllib.request.ProxyHandler(proxies)
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
self.__likes_url = like_url
self.__page = start_page
self.__root_dir = 'F:\\Data\\tumblr\\'
def launch(self):
while True:
content = self.__request_likes(self.__page)
frams = self.__get_frame_url(content)
for fram in frams:
target_urls = self.__get_video_url(fram)
for video_url in target_urls:
self.__download_video(video_url)
self.__page = self.__page + 1
def __do_request(self, url_):
req = urllib.request.Request(url_)
res = urllib.request.urlopen(req)
return res.read().decode('utf-8')
def __request_likes(self, page):
print('Request page = %s' % page)
target_url = self.__likes_url.format(page)
return self.__do_request(target_url)
def __get_frame_url(self, content):
reg = r"(?<=iframe src=')\S*(?=')"
pattern = re.compile(reg)
results = pattern.findall(content)
print('Find results = %s' % len(results))
return results
def __get_video_url(self, url_):
reg = r'((?<=<source src=").*(?=" type="video/mp4"))'
pattern = re.compile(reg)
content = self.__do_request(url_)
result = pattern.findall(content)
print('Find video URL = %s' % result)
return result
def __download_video(self, url_):
pattern = re.compile(r'([^/]+$)')
file_name = pattern.findall(url_)[0]
dir_ = self.__root_dir + file_name + '.mp4'
try:
print('Download: %s ' % url_)
self.urlretrieve = urllib.request.urlretrieve(url_, dir_)
except Exception as e:
print(e)
# 启动
#
#url => 如:https://xxx.tumblr.com/likes/page/{} ,/likes/page/{} 是固定的,不要懂,xxx是你要爬取的
#page => 页面,整形,默认从0开始
#
ins = Tumblr(url, page)
ins.launch()
截图
过程
打码
战果
最后
学语言就是这样,用起来,学的自然快,嘿嘿嘿。。