自造微博轮子,再爬姐姐和奶奶殿下

今天呢,继续撸微博,但愿新浪的大神们不在啊啊啊。html

缘起git

前面写了一篇文章,主要是有感于文章马伊琍的婚姻,才爬了下他们微博下的评论,结果有位老哥说github

这还了得,我这小暴脾气不能忍啊,果断准备再次出手,拿下姐姐的微博评论。可是当我把瓜子都买好的时候。。。

正当我准备再次 F12 查 ID,造 URL 的时候,做为一名非专业码农的惰性就体现出来了,每次都这么搞,是否是有点太繁琐了。因而,做为各种轮子的深度依赖者,此次我准备本身造个轮子。json

设想

  1. 最起码是一个自动抓取的脚本,嗯,这是底线!
  2. 有个入口输入要爬取的人物(当前设定为大 V,和搜索到的第一我的)
  3. 以后,就交给程序,坐等数据

思路

因而乎,在上述设想的指引下,我开始了轮子之旅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

能获得该用户的用户信息,这里面有一个很重要的信息,containerid,保存下来,一会用。

调用二

接着咱们再这样调用该 URL

"m.weibo.cn/api/container/getIndex?containerid=1076031312412824&page=0"

containerid 就是上一步获得的 ID

继续看 Postman

获得的就是 blog 信息了,返回的是 json 数据,很棒。

最后,咱们能够再结合前面文章获取评论的方法,那么该用户下的博客和评论内容就都到手喽。

开搞

此处先省去菜鸟被虐的一万点伤害值

其中的千辛万苦,谁能知之。

1、配置文件

先来个配置文件,毕竟大型项目都是这么玩的,我这也是大型项目

config.py 文件

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即为只抓取两个月前到如今的微博
复制代码

2、工具箱

抽象出一些公共的函数,不能把代码写的太丑了

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):
    ...
复制代码

3、主逻辑

定义一个 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
复制代码

4、运行函数

这里我的感受逻辑写的仍是有点臃肿,没办法,菜!各位大神若是路过,还请不要嫌弃。

主要就是配合 input 函数,来获取用户的输入,而后根据不一样状况调取 WeiBo 类里的方法。

至此,一个勉强可用的轮子基本完成了,可把我累(牛)坏(逼)了(坏)啦(了)

成果展现

扯了这么多,终于到了见成果的时候了,先来看个动图

网络上爆炸的“乔碧萝殿下”,成为了我检(祭)验(刀)的第一人

那么最后仍是要扣题呀,把那段缘结束掉。看看志玲姐姐微博下的评论,究竟是咋样

其实拿到评论数据以后,简单浏览了下,确实有不少难以启齿的评论,可是呢,这个事情我以为仍是没有必要太上纲上线了,哈哈哈,总之祝福吧

(此处请自动过滤掉一些些不和谐因素)

下面, 前方, 高能,

前方是大型认亲现场,怕引发不适的请跳过。

持续发酵的事件背后,产生了各类赢家,斗鱼平台、主播晴子,固然还有 CXK 喽,不能说了

最后的最后,献上代码:

github.com/zhouwei713/…

完!

本站公众号
   欢迎关注本站公众号,获取更多信息