今天呢,继续撸微博,但愿新浪的大神们不在啊啊啊。html
缘起git
前面写了一篇文章,主要是有感于文章马伊琍的婚姻,才爬了下他们微博下的评论,结果有位老哥说github
正当我准备再次 F12 查 ID,造 URL 的时候,做为一名非专业码农的惰性就体现出来了,每次都这么搞,是否是有点太繁琐了。因而,做为各种轮子的深度依赖者,此次我准备本身造个轮子。json
因而乎,在上述设想的指引下,我开始了轮子之旅api
首先想到的就是利用微博的搜索功能,而后再看看能获得些啥 这个搜索 URL:markdown
"s.weibo.com/user?q=林志玲"cookie
能够直接调,爽的飞起!网络
具体分析过程就不详细写了,从中咱们能够拿到用户的 UID,很重要。ide
import requests
from bs4 import BeautifulSoup
url = 'https://s.weibo.com/user?q=林志玲'
res = requests.get(url).text
content = BeautifulSoup(res, 'html.parser')
user = content.find('div', attrs={'class': 'card card-user-b s-pg16 s-brt1'})
user_info = user.find('div', attrs={'class': 'info'}).find('div')
href_list = user_info.find_all('a')
if len(href_list) == 3:
title = href_list[1].get('title')
if title == '微博我的认证':
uid = href_list[2].get('uid')
print(uid)
else:
print("this is not a big VIP")
复制代码
由于这种搜索,可能会搜索出不少结果,张3、李四啥的都出来了,咱们只关心大 V,对于非大 V,就取第一个喽。函数
下面要隆重解释一个 URL
"m.weibo.cn/api/container/getIndex"
这个地址能够在微博的 m 站上找到,有时候,爬 m 站的地址要更容易些。 对于这个地址,咱们主要有两个做用,使用不一样的参数,调用两次
markdown 里 url 展现有些奇怪,能够看 Postman 的截图
首先咱们这样调用该 URL
"m.weibo.cn/api/container/getIndex?type=uid&value=1312412824"
value 为上面拿到的用户 UID
看 Postman
接着咱们再这样调用该 URL
"m.weibo.cn/api/container/getIndex?containerid=1076031312412824&page=0"
containerid 就是上一步获得的 ID
继续看 Postman
最后,咱们能够再结合前面文章获取评论的方法,那么该用户下的博客和评论内容就都到手喽。
此处先省去菜鸟被虐的一万点伤害值
先来个配置文件,毕竟大型项目都是这么玩的,我这也是大型项目
sleep_time = 5 # 延迟时间,建议配置5-10s
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"Cookie": "your cookie"
}
day = 60 # 最久抓取的微博时间,60即为只抓取两个月前到如今的微博
复制代码
抽象出一些公共的函数,不能把代码写的太丑了
tools.py 文件
def checkTime(inputtime, day):
try:
intime = datetime.datetime.strptime("2019-" + inputtime, '%Y-%m-%d')
except:
return "时间转换失败"
now = datetime.datetime.now()
n_days = now - intime
days = n_days.days
if days < day:
return True
else:
return False
复制代码
这个是用来检查时间间隔的,后面在抓取微博时,若是时间过久远的,就不抓了。
还有一个函数是用来解析 blog 数据的,由于是 json 数据,解析起来很简单,就很少说了
def get_blog_info(cards, i, name, page):
...
复制代码
定义一个 WeiBo 类
class WeiBo(object):
def __init__(self, name, headers):
self.name = name
self.headers = headers
复制代码
后面全部的操做,都是基于该类来的
类中的方法
def get_uid(self): # 获取用户的 UID
...
def get_userinfo(self, uid): # 获取用户信息,包括 containerid
...
def get_blog_by_page(self, containerid, page, name): # 获取 page 页的微博信息
...
def get_blog_by_text(self, containerid, blog_text, name): # 一个简单的搜索功能,根据输入的内容查找对应的微博
...
def get_comment(self, mblog_id, page): # 与上个函数配合使用,用于获取某个微博的评论
...
def download_comment(self, comment): # 下载评论
...
def download_pic(self): # 灵感来源于“胖虎”哥的“养分快线”文章,暂未实现
pass
复制代码
这里我的感受逻辑写的仍是有点臃肿,没办法,菜!各位大神若是路过,还请不要嫌弃。
主要就是配合 input 函数,来获取用户的输入,而后根据不一样状况调取 WeiBo 类里的方法。
至此,一个勉强可用的轮子基本完成了,可把我累(牛)坏(逼)了(坏)啦(了)
扯了这么多,终于到了见成果的时候了,先来看个动图
那么最后仍是要扣题呀,把那段缘结束掉。看看志玲姐姐微博下的评论,究竟是咋样
其实拿到评论数据以后,简单浏览了下,确实有不少难以启齿的评论,可是呢,这个事情我以为仍是没有必要太上纲上线了,哈哈哈,总之祝福吧
(此处请自动过滤掉一些些不和谐因素)
下面, 前方, 高能,
最后的最后,献上代码:
完!