前提
其实就是为了看妹子看美女,好吧,废话不多说直接进入主题
用到的东西
- python: 用来捉取数据及整理数据的
- php: 搭建管理后台
- mysql: 储存数据
- hexo: 生成静态博客文件
- coding.net/腾讯云开发者平台: 静态博客文件托管
- 阿里云: 域名注册及管理
分4个步骤
- 采集数据
- 整理数据
- 生成文件
- 上传文件
1.采集数据
1.获取uid
首先得搞到uid,这是数据之源泉。其实很简单,根据微博主页的地址 https://m.weibo.cn/u/5710240012 就可以得到uid为5710240012了。这里以路客文化为例,是的,我很喜欢他的街拍风格!
2.爬取微博内容并入库
爬取用户信息,获得用户微博的containerid,随便把信息入库,后面做博客会用到。根据 http://m.weibo.cn/api/container/getIndex?type=uid&value=5710240012 地址就可以获取用户信息了,是一个json格式的文件,解析一下就可以获取微博的containerid值。这里定义了一个获取用户信息的方法,里面包含containerid值。
def get_user_info(uid, cookie):
url = 'http://m.weibo.cn/api/container/getIndex?type=uid&value={uid}'.format(uid=uid)
resp = requests.get(url,cookies=cookie)
jsondata = resp.json().get('data')
nickname = jsondata.get('userInfo').get('screen_name')
mlog_num = jsondata.get('userInfo').get('statuses_count')
verified = jsondata.get('userInfo').get('verified')
verified_reason = jsondata.get('userInfo').get('verified_reason')
descreption = jsondata.get('userInfo').get('description')
gender = jsondata.get('userInfo').get('gender')
urank = jsondata.get('userInfo').get('urank')
mbrank = jsondata.get('userInfo').get('mbrank')
followers_counts = jsondata.get('userInfo').get('followers_count')
follow_counts = jsondata.get('userInfo').get('follow_count')
try:
uid = jsondata.get('userInfo').get('toolbar_menus')[0].get('params').get('uid')
fid = jsondata.get('userInfo').get('toolbar_menus')[1].get('actionlog').get('fid')
oid = jsondata.get('userInfo').get('toolbar_menus')[2].get('params').get('menu_list')[0].get('actionlog').get('oid')
cardid = jsondata.get('userInfo').get('toolbar_menus')[1].get('actionlog').get('cardid')
except:
uid = ''
fid = ''
oid = ''
cardid = ''
containerid = jsondata.get('tabsInfo').get('tabs')[1].get('containerid')
user_info = {'nickname':nickname,'mlog_num':mlog_num,'verified':verified,'verified_reason':verified_reason,
'gender':gender,'urank':urank,'mbrank':mbrank,'followers_count':followers_counts,
'follow_count':follow_counts,'uid':uid,'fid':fid,
'cardid':cardid,'containerid':containerid,'oid':oid,'desc':descreption}
# print(user_info)
return user_info
通过 https://m.weibo.cn/api/container/getIndex?filter=1&type=uid&value={uid}&containerid={containerid}&page={page}.format(uid=uid,containerid=containerid,page=page) 爬取微博内容,解析json文件获得pics值,同时入库。pics就是图片地址重点是***可以外链的***,如果不能哪么剩下的都是扯淡。
def download(uid, containerid):
reload(sys)
sys.setdefaultencoding('utf-8')
#page = 476
page = 0
times = 10 #每下载10页停止
temp = 1
flag = 0
while True:
# time.sleep(20)
temp += 1
if temp == times:
temp = 1
ticks = time.time()
print u'正在进行停顿,防止访问次数过多', ticks
time.sleep(10)
#当有十条数据重复则退出循环
if(flag>=10):
print u'重复,退出'
break
flag = 0
page += 1
print u'page=', page
url = 'https://m.weibo.cn/api/container/getIndex?filter=1&type=uid&value={uid}&containerid={containerid}&page={page}'.format(uid=uid,containerid=containerid,page=page)
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3088.4 Safari/537.36'}
resp = requests.get(url, headers=headers)
resp.encoding = 'utf-8'
jsondata = resp.json().get('data')
cards = jsondata.get('cards')
if(len(cards)>0):
for j in range(len(cards)):
card_type = cards[j].get('card_type')
scheme = cards[j].get('scheme')
if(card_type==9):
mblog=cards[j].get('mblog')
pid=mblog.get('id')
#判断数据是否存在
if(weibodb.checkExit(pid)):
print pid
flag = flag + 1
else:
created_at=mblog.get('created_at')
orgin_text=mblog.get('text')
textLength=mblog.get('textLength')
orgin_text = orgin_text.replace('\'','\\\'')
reposts_count=mblog.get('reposts_count')
comments_count=mblog.get('comments_count')
attitudes_count=mblog.get('attitudes_count')
pics = mblog.get('pics')
picsc = 0
if(pics):
picsc = len(pics)
#微博数据入库
weibodb.ins(uid, scheme, orgin_text, pid, created_at, textLength, reposts_count, comments_count, attitudes_count, picsc)
if(pics):
for k in range(len(pics)):
_url=pics[k].get('large').get('url')
_name=pics[k].get('pid')
_murl=pics[k].get('url')
_mwidth=pics[k].get('geo').get('width')
_mheight=pics[k].get('geo').get('height')
_width=pics[k].get('large').get('geo').get('width')
_height=pics[k].get('large').get('geo').get('height')
_croped=pics[k].get('large').get('geo').get('croped')
#图片数据入库
weibodb.insPics(pid, _url, _name, _width, _height, uid, _croped, _murl, _mwidth, _mheight)
#更新创建时间
weibodb.updCt()
else:
break;
2.整理数据
虽然捉取程序已经过滤了大部分没有的数据,不过个别数据还是需要人工过滤一下的。这里我用php搭建了一个简单的后台管理程序,把哪些不合格的数据人工过滤掉。
3.生成文件
前提假设你已经安装了hexo,hexo是什么?可以参考这里。那么剩下来就是生成hexo格式的markdown文件了。我是比较懒了,直接在代码里面生成文件,你也可以自己写个模板然后替换模板里面的变量生成。我把文件生成在 /你的博客/source/_posts 目录下面。cd到 /你的博客 目录运行 hexo g 命令生成html,生成的html会放在public目录下,这里也是静态博客的所有文件。
def main():
start='2018-09-06'
end='2018-09-06'
#start=sys.argv[1]
#end=sys.argv[2]
datestart=datetime.datetime.strptime(start,'%Y-%m-%d')
dateend=datetime.datetime.strptime(end,'%Y-%m-%d')
while datestart<=dateend:
dt = datestart.strftime('%Y-%m-%d')
print dt
results = weibodb.getUserList(dt)
title = "「街拍」"+dt
tags = '街拍'
content = ''
jiepais = ''
ls = ''
i = 0
for row in results:
profile_url = row.get('profile_url')
screen_name = row.get('screen_name')
#ls += "<em><a href='"+row.get('profile_url')+"'>@" + row.get('screen_name') + "</a> </em>"
uid = row.get('uid')
jiepais = weibodb.getJiepaiByUidDt(uid, dt)
content += "#### "+screen_name+"\n"
for jiepai in jiepais:
pid = str(jiepai.get('pid'))
pics = weibodb.getPicsByPid(pid)
orgin_text = jiepai.get('orgin_text')
dr = re.compile(r'<[^>]+>',re.S)
dd = dr.sub('',orgin_text)
content += "##### "+dd+"\n"
# content += u"##### ["+dd+"]("+jiepai.get('url')+")"+"\n\n"
# content += ""+dd+"\n"
for pic in pics:
murl = pic.get('murl').replace('orj360','mw690')
lurl = pic.get('murl').replace('orj360','large')
content += '<a data-fancybox="gallery" href="'+lurl+'"><img src="'+murl+'"></a>'
i += 1
# content += u"["+dd+"]("+jiepai.get('url')+") [@"+screen_name+"]("+profile_url+") "+"\n\n"
content += u"[查看来源]("+jiepai.get('url')+") [@"+screen_name+"]("+profile_url+") "+"\n"
content += ls
build(dt, title, tags, content.encode('utf8'))
datestart+=datetime.timedelta(days=1)
def build(dt, title, tags, content):
f = open("xxxx/jiepai/source/_posts/"+dt+".md","w")
f.write('---\n')
f.write('title: '+title+'\n')
f.write('date: '+dt+' 00:00:00\n')
f.write('categories: 街拍\n')
f.write('tags: ['+tags+']\n')
f.write('---\n')
f.write(content)
f.close
4.上传文件
经过上面的步骤,如果你有自己的服务器直接把public目录下的文件放到你的服务器就完成了。如果你要上传到Coding,哪么更简单hexo配置好后可以直接 hexo d 命令就完成了。 如何使用hexo,如何注册Coding,如何建立静态Pages应用,如何注册域名,如何把域名绑定到Coding Pages,我觉得已经有好多文章介绍了,我也不想写了......
后记
完成后大概是这样。喜欢街拍还是去博主哪里点赞,支持原创,谢谢。