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

作業(yè)思路

在這次作業(yè)爬取的是新浪微博的用戶信息坝初,日爬取量25000個用戶凡伊,寄存在云服務(wù)器上運行(不過服務(wù)器每次都因為內(nèi)存不夠把進程給殺了唧席,汗...)
作業(yè)選取的網(wǎng)址是新浪微博手機版網(wǎng)頁擦盾,主要思路就是解析json數(shù)據(jù),不過函數(shù)之間的邏輯有點繞淌哟,也就是爬取用戶的粉絲的粉絲迹卢,重復(fù)進行,不過沒有加入去重函數(shù)和結(jié)束函數(shù)徒仓,思路看圖:

作業(yè)邏輯

還有一個點需要注意的是如何使cookies保持長時間的有效腐碱,這是這個腳本的一個關(guān)鍵點,所以在這里選擇了requests里的session這個方法掉弛,可以更新請求的頭症见,而cookies就是在請求的頭里,經(jīng)過驗證殃饿,在爬取的過程中沒有遇到失效的情況谋作,倒是請求過快以及多次啟動腳本容易產(chǎn)生請求403的結(jié)果,也就是IP被封乎芳。更具體的解釋在代碼的注釋里有遵蚜。

作業(yè)結(jié)果

圖一
圖二

作業(yè)代碼

# -*- 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)


#這個函數(shù)是生成新的用戶的URL,所以應(yīng)該是返回上一個函數(shù)奈惑,這樣可以解析指數(shù)增長的用戶
#這里是生成了10頁用戶的URL吭净,再將這10頁URL傳到上一個函數(shù)里,提取每一頁里的10個粉絲的信息
#這里所要保證的是傳入的每一個ID都是不同的肴甸,輸出來的是每一個ID所對應(yīng)的每一頁的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


#這個函數(shù)用來獲取用戶的更具體的信息寂殉,需要接受上面的生成器,一方面生成ID原在,一方面是接收一些信息來傳遞到存庫函數(shù)中保存起來友扰。
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"
    # 創(chuàng)表

    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打開簡書特別慢晤斩,幾乎是打不開的狀態(tài)...焕檬,無奈換了個IP才登上,為了登個簡書也是夠拼的澳泵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末实愚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兔辅,更是在濱河造成了極大的恐慌腊敲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件维苔,死亡現(xiàn)場離奇詭異碰辅,居然都是意外死亡,警方通過查閱死者的電腦和手機介时,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門没宾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌彬,“玉大人,你說我怎么就攤上這事循衰〔玻” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵会钝,是天一觀的道長伐蒋。 經(jīng)常有香客問我,道長迁酸,這世上最難降的妖魔是什么先鱼? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮奸鬓,結(jié)果婚禮上焙畔,老公的妹妹穿的比我還像新娘。我一直安慰自己串远,他們只是感情好闹蒜,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抑淫,像睡著了一般绷落。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上始苇,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天砌烁,我揣著相機與錄音,去河邊找鬼催式。 笑死函喉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的荣月。 我是一名探鬼主播管呵,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哺窄!你這毒婦竟也來了捐下?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤萌业,失蹤者是張志新(化名)和其女友劉穎坷襟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體生年,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡婴程,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抱婉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档叔。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡桌粉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衙四,到底是詐尸還是另有隱情番甩,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布届搁,位于F島的核電站,受9級特大地震影響窍育,放射性物質(zhì)發(fā)生泄漏卡睦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一漱抓、第九天 我趴在偏房一處隱蔽的房頂上張望表锻。 院中可真熱鬧,春花似錦乞娄、人聲如沸瞬逊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽确镊。三九已至,卻和暖如春范删,著一層夾襖步出監(jiān)牢的瞬間蕾域,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工到旦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旨巷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓添忘,卻偏偏與公主長得像采呐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搁骑,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容