2017/5/9 微博爬取用户信息

作业思路

在这次作业爬取的是新浪微博的用户信息,日爬取量25000个用户,寄存在云服务器上运行(不过服务器每次都因为内存不够把进程给杀了,汗...)
作业选取的网址是新浪微博手机版网页,主要思路就是解析json数据,不过函数之间的逻辑有点绕,也就是爬取用户的粉丝的粉丝,重复进行,不过没有加入去重函数和结束函数,思路看图:

作业逻辑

还有一个点需要注意的是如何使cookies保持长时间的有效,这是这个脚本的一个关键点,所以在这里选择了requests里的session这个方法,可以更新请求的头,而cookies就是在请求的头里,经过验证,在爬取的过程中没有遇到失效的情况,倒是请求过快以及多次启动脚本容易产生请求403的结果,也就是IP被封。更具体的解释在代码的注释里有。

作业结果

图一
图二

作业代码

# -*- coding: utf-8 -*-
import requests
import json
import re
import time
import MySQLdb

# 这个是爬取一个用户的粉丝的100个ID
def start_url(url):
    s = requests.Session()
    r = s.get(url, headers=headers)
    totaldata = json.loads(r.text)
    totalurl = []
    # 这个是单页里的粉丝的一层信息
    for i in totaldata["cards"][0]["card_group"]:
        item = {}
        item["nickname"] = i["user"]["screen_name"]
        item["id"] = i["user"]["id"]
        item["fans"] = i["user"]["followers_count"]
        item["follows"] = i["user"]["follow_count"]
        item["url"] = i["user"]["profile_url"]
        print "正在处理: " + str(i["user"]["id"])
        time.sleep(2)
        user_data(item)
        totalurl.append(item["id"])
        s.headers.update(headers)


    for one in totalurl:
        change_url(one)


#这个函数是生成新的用户的URL,所以应该是返回上一个函数,这样可以解析指数增长的用户
#这里是生成了10页用户的URL,再将这10页URL传到上一个函数里,提取每一页里的10个粉丝的信息
#这里所要保证的是传入的每一个ID都是不同的,输出来的是每一个ID所对应的每一页的URL
def change_url(page):
    baseurl = "https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_%s&luicode=10000011&lfid=1005053846717719&featurecode=20000180" %page
    for one in range(1,11):
        try:
            url = baseurl + "&page={}".format(one)
            time.sleep(2)
            start_url(url)
        except:
            continue


#这个函数用来获取用户的更具体的信息,需要接受上面的生成器,一方面生成ID,一方面是接收一些信息来传递到存库函数中保存起来。
def user_data(user_id):
    one_url = "http://m.weibo.cn/api/container/getIndex?containerid=230283%s_-_INFO" %user_id["id"]
    two_url = "&title=%s" %user_id["nickname"]
    three_url = "&luicode=10000011&lfid=230283%s&featurecode=20000180" %user_id["id"]
    url = one_url + two_url + three_url
    s = requests.Session()
    r = s.get(url, headers=headers)
    totaldata = json.loads(r.text)

    i = totaldata["cards"][0]["card_group"]

    data = {}
    data["nickname"] = user_id["nickname"]
    try:
        data["biaoqian"] = i[3]["item_content"]
    except:
        data["biaoqian"] = "空"

    try:
        data["sex"] = i[1]["item_content"]
    except:
        data["sex"] = "未知"

    try:
        data["place"] = i[2]["item_content"]
    except:
        data["place"] = "未知"

    data["lv"] = totaldata["cards"][1]["card_group"][0]["item_content"] #等级
    try:
        data["res_time"] = totaldata["cards"][1]["card_group"][2]["item_content"] #注册时间
    except:
        data["res_time"] = "空"
    data["id"] = user_id["id"]
    data["fans"] = user_id["fans"]
    data["follows"] = user_id["follows"]
    data["url"] = user_id["url"]
    print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    insert(data)


def mysql_conn():
    conn=MySQLdb.connect(
        host='127.0.0.1',
        user = "root",
        passwd = "882645",
        charset = "utf8",
        db='Lagou',
        port = 3306
    )
    return conn

#建表
def create_table():
    create_sql='''
    CREATE TABLE `weibos`(
    LIST INT(11) NOT NULL AUTO_INCREMENT,
    nickname VARCHAR(255),
    biaoqian VARCHAR(255),
    sex VARCHAR(255),
    place VARCHAR(255),
    id VARCHAR(255),
    fans VARCHAR(255),
    follows VARCHAR(255),
    lv VARCHAR(255),
    res_time VARCHAR(255),
    url VARCHAR(255),
    PRIMARY KEY (`LIST`)
    )ENGINE=INNODB DEFAULT CHARSET =utf8
    '''
    conn=mysql_conn()
    with conn:
        cursor = conn.cursor()
        cursor.execute(create_sql)
        conn.commit()

#插入记录
def insert(it):
    sql='insert into weibos (nickname,biaoqian,sex,place,id,fans,follows,lv,res_time,url) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    conn = mysql_conn()
    with conn:
        cursor = conn.cursor()
        try:
            cursor.execute(sql,(it['nickname'],it['biaoqian'],it['sex'],it['place'],it['id'],it['fans'], it['follows'],it["lv"],it["res_time"],it['url']))

            cursor.connection.commit()

        except BaseException as e:
            print u"错误在这里>>>>", e, u"<<<<错误在这里"

        conn.commit()

if __name__ == '__main__':

    headers = { "Connection":"keep-alive",
                "Accept":"application/json, text/plain, */*",
                "X-Requested-With":"XMLHttpRequest",
                "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36",
                "DNT":"1",
                "Accept-Encoding":"gzip, deflate, sdch",
                "Accept-Language":"zh-CN,zh;q=0.8",
                "Cookie":"_T_WM=10f51ed94c4f4324c8adfaeeaf3b6c7a; ALF=1496672460; SCF=Asenm4RgczizSoBCdtR_GtVS4yjQ0rI-fnnSnq1Z5h60mMnfCGjbxHYIsFwmxprk8h9DOikPiXPXiPKHXPyqVPQ.; SUB=_2A250CsRrDeRhGeNJ7VsZ8i_PyTiIHXVX9OwjrDV6PUNbktBeLWPgkW0aj2ty_KahcQEYR7pWKwQDBQsJCg..; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5VPg2H0mI-Z6NLOPLMSPkK5JpX5KMhUgL.Fo-NSo.Reo20eoB2dJLoI7DhqPi79gyyMGW4; SUHB=0k1CYdpYNb60Hz; SSOLoginState=1494135867; H5_INDEX=0_all; H5_INDEX_TITLE=Carpehappy; M_WEIBOCN_PARAMS=featurecode%3D20000180%26oid%3D4103787444327240%26luicode%3D10000011%26lfid%3D231051_-_fans_-_2322168320"}


    start = "http://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_2322168320&luicode=10000011&lfid=1005052322168320&featurecode=20000180&page=1"
    # 创表

    create_table()
    start_url(start)






# 个人信息页:https://m.weibo.cn/api/container/getIndex?containerid=2302833936433808_-_INFO&title=%25E5%259F%25BA%25E6%259C%25AC%25E4%25BF%25A1%25E6%2581%25AF&luicode=10000011&lfid=2302833936433808&featurecode=20000180
# 粉丝页:https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_3936433808&luicode=10000011&lfid=1005053936433808&featurecode=20000180&page=2
# 最多只能100多条信息

吐槽一下,为什么我的这个IP打开简书特别慢,几乎是打不开的状态...,无奈换了个IP才登上,为了登个简书也是够拼的。

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

推荐阅读更多精彩内容