Python实现微博爬虫

想获取某人发的所有微博信息,发现新浪微博的API里存在局限性,不仅需要申请高级接口,而且还要用户授权才能获取他发的全部微博。既然没有接口,那么就自己写个爬虫吧!
先附上项目代码地址:微博爬虫源码
项目的执行需要安装 selenium,requests以及BeautifulSoup库,还需要chromeDriver来配合。
首先,我们要在浏览器里打开微博去分析获取某个人的微博都需要哪些参数,以及调用了哪些请求。
分析得出结果如下:
获取微博的请求都需要有一个cookie,并且cookie存在的有效时间还是比较长的。

登录微博多次会需要验证码,为了避免验证码的阻碍,尽量把cookie存起来,等cookie失效了再去模拟登录获取cookie。

微博的每一页可以分为3屏,首屏的接口与2,3屏接口不一致。下面4,5两点的接口用的是MRJ台湾官方的微博为例子。

每一页的首屏接口为:http://weibo.com/mrj168?is_all=1&profile_ftype=1&page=1 page为第几页

每一页的2,3屏接口为:http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&pagebar=0&is_tag=0&is_search=0&pre_page=1&profile_ftype=1&id=1005051837498771&script_uri=%2Fmrj168&feed_type=0&__rnd=1490768727000&pl_name=Pl_Official_MyProfileFeed__22&is_all=1&domain_op=100505&page=1 需要修改的参数为pagebar,第二屏和第三屏分别为0,1。以及pre_page和page均为第几页。rnd为当前时间戳,单位是毫秒。id为100505+“微博的ID”,script_uri为“/”+“个性域名”或者"/"+"/u/"+"微博的ID"

通过以上的分析,把逻辑转换成代码。大致流程如下:

result = is_valid_cookie()
print result
if result == False:
    driver = webdriver.Chrome("/Users/fantasy/Downloads/chromedriver")#打开Chrome
    driver.maximize_window()#将浏览器最大化显示
    driver.get(weibo_url)#打开微博登录页面
    time.sleep(10)#因为加载页面需要时间,所以这里延时10s来确保页面已加载完毕
    cookie = login_weibo_get_cookies()
    save_cookie(cookie)
    save_cookie_update_timestamp(get_timestamp())
else :
    cookie = get_cookie_from_txt()
for x in xrange(1,page_size+1):
    profile_html = get_object_top_weibo_by_person_site_name_and_cookie(person_site_name,cookie,x)
    image_url_list = get_img_urls_form_html(profile_html)
    write_image_urls(image_url_list)
    for y in xrange(0,2):#有两次下滑加载更多的操作
        print "pagebar:"+str(y)
        html = get_object_weibo_by_weibo_id_and_cookie(weibo_id,person_site_name,cookie,y,x)
        image_url_list = get_img_urls_form_html(html)
        write_image_urls(image_url_list)

首先判断本地是否存在有效的Cookie,如果Cookie不存在或者过期了,那么使用webdriver去打开微博登录并获取Cookie,然后更新本地的Cookie和更新时间。如果Cookie有效,则直接读取本地的Cookie。
有了Cookie之后,我们就可以拿着Cookie去调用上面分析出的两个接口啦!
通过个性域名和Cookie及页码去请求某一页的首屏。

通过微博ID和个性域名及页码和第几屏去获取某一页的第几屏。

接口返回的内容并不是json,而是HTML格式的文本,所以需要我们自己去解析。这里我使用的是BeautifulSoup来分析HTML的元素的。
以每页首屏的接口为例子:

def get_object_top_weibo_by_person_site_name_and_cookie(person_site_name,cookie,page):#每一页顶部微博
    try:
        profile_url = weibo_url+person_site_name+"?"
        headers["Cookie"] = cookie
        profile_request_params["page"] = page
        response = requests.get(profile_url,headers=headers,params=profile_request_params)
        print response.url
        html = response.text
        soup = BeautifulSoup(html,"html.parser")
        script_list = soup.find_all("script")
        script_size = len(script_list)
        print "script_size:"+str(script_size)
        tag = 0
        for x in xrange(script_size):
            if "WB_feed WB_feed_v3 WB_feed_v4" in str(script_list[x]):
                tag = x
        print "tag:"+str(tag)
        # print script_list[script_size-1]
        html_start = str(script_list[tag]).find("<div")
        html_end = str(script_list[tag]).rfind("div>")
        # print str(script_list[tag])[html_start:html_end+4]
        return str(str(script_list[tag])[html_start:html_end+4])
    except Exception, e:
        print e
    finally:
        pass

直接使用find_all来获取所有图片,再用get("src")来获取图片的url。

然后我的微博爬虫就这样实现了,好像也不难的样子。。。但是面对微博接口返回的一大堆数据,需要耐心去分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 18,051评论 45 523
  • 今天过了个很满意的生日。 有收到很多祝福,我相信,这都是来自一份真心的小心意。毕竟都是独生子女90后,随心而为才是...
    轩轩糖阅读 153评论 0 1
  • 古人认为,地球外面是一层一层的天,按照月亮、水星、金星、太阳、火星、木星和土星所掌管的顺序一层一层向外排列,越来越...
    Jane爱星空阅读 407评论 0 6
  • 希望每天醒来都有阳光 和妈妈通通电话
    桥豆麻袋1号阅读 43评论 0 0