1. 程式人生 > >【python 新浪微博爬蟲】python 爬取新浪微博24小時熱門話題top500

【python 新浪微博爬蟲】python 爬取新浪微博24小時熱門話題top500

一、需求分析
模擬登陸新浪微博,爬取新浪微博的熱門話題版塊的24小時內的前TOP500的話題名稱、該話題的閱讀數、討論數、粉絲數、話題主持人,以及對應話題主持人的關注數、粉絲數和微博數。

二、開發語言
python2.7

三、需要匯入模組
import requests
import json
import base64
import re
import time
import pandas as pd

四、抓取流程
首先先手機端模擬登陸新浪
然後傳送請求得到網頁原始碼資料
之後用正則表示式解析資料

五、欄位說明

話題名稱:topic_name
閱讀數:topic_reading
討論數:topic_discuss
話題粉絲數:topic_fans
話題主持人:host_name
主持人關注數:host_follow
主持人粉絲數:host_fans
主持人微博數:host_weibo

六、抓取步驟
1、模擬登入新浪微博(手機版), 解密,用requests傳送post請求,session方法記住登入狀態。

###########模擬登入新浪
def login(username, password):
    username = base64.b64encode(username.encode('utf-8')).decode('utf-8')
    postData = {
        "entry": "sso",
        "gateway": "1",
        "from": "null",
        "savestate": "30"
, "useticket": "0", "pagerefer": "", "vsnf": "1", "su": username, "service": "sso", "sp": password, "sr": "1440*900", "encoding": "UTF-8", "cdult": "3", "domain": "sina.com.cn", "prelt": "0", "returntype": "TEXT"
, } loginURL = r'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)' session = requests.Session() res = session.post(loginURL, data = postData) jsonStr = res.content.decode('gbk') info = json.loads(jsonStr) if info["retcode"] == "0": print(U"登入成功") # 把cookies新增到headers中,必須寫這一步,否則後面呼叫API失敗 cookies = session.cookies.get_dict() cookies = [key + "=" + value for key, value in cookies.items()] cookies = "; ".join(cookies) session.headers["cookie"] = cookies else: print(U"登入失敗,原因: %s" % info["reason"]) return session session = login('新浪微博賬號', '新浪微博密碼')

2、定義列表資料結構儲存資料。

##################定義資料結構列表儲存資料
top_name = []
top_reading = []
top_discuss = []
top_fans = []
host_name = []
host_follow = []
host_fans = []
host_weibo = []
url_new1=[]
url_new2=[]

3、請求翻頁實現,用Fiddle 抓包工具 抓取請求url,點點選下一頁時,發現真正請求url,通過拼接 page 來實現翻頁

4、解析網頁採用正則表示式re.findall()

#####正則表示式匹配
    name=re.findall("Pl_Discover_Pt6Rank__5(.*?)</script>",html,re.S)
    for each in name:
        # print each

返回的是json ,資料,這裡有使用者的關注數,微博數,粉絲數。
通過解析json資料,得到這三個欄位。

方法如下:

url="http://m.weibo.cn/api/container/getIndex?type=uid&value=5710151998"
html=session.get(url).content
html=json.loads(html)
userInfo=html['userInfo']
statuses_count=userInfo['statuses_count']
followers_count=userInfo['followers_count']
follow_count=userInfo['follow_count']

print statuses_count,followers_count,follow_count

6、利用迴圈抓取資料之後,把資料組織成資料框的形式(表格)寫入excel

7、通過 time模組 time.sleep(4) 方法控制網路請求速度。

七、結果圖

這裡寫圖片描述

八、實現原始碼

# encoding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
import json
import base64
import re
import time
import pandas as pd

time1=time.time()


###########模擬登入新浪
def login(username, password):
    username = base64.b64encode(username.encode('utf-8')).decode('utf-8')
    postData = {
        "entry": "sso",
        "gateway": "1",
        "from": "null",
        "savestate": "30",
        "useticket": "0",
        "pagerefer": "",
        "vsnf": "1",
        "su": username,
        "service": "sso",
        "sp": password,
        "sr": "1440*900",
        "encoding": "UTF-8",
        "cdult": "3",
        "domain": "sina.com.cn",
        "prelt": "0",
        "returntype": "TEXT",
    }
    loginURL = r'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)'
    session = requests.Session()
    res = session.post(loginURL, data = postData)
    jsonStr = res.content.decode('gbk')
    info = json.loads(jsonStr)
    if info["retcode"] == "0":
        print(U"登入成功")
        # 把cookies新增到headers中,必須寫這一步,否則後面呼叫API失敗
        cookies = session.cookies.get_dict()
        cookies = [key + "=" + value for key, value in cookies.items()]
        cookies = "; ".join(cookies)
        session.headers["cookie"] = cookies
    else:
        print(U"登入失敗,原因: %s" % info["reason"])
    return session


session = login('此處填寫你的微博賬號', '此處填寫你的微博密碼')
##################定義資料結構列表儲存資料
top_name = []
top_reading = []
top_discuss = []
top_fans = []
host_name = []
host_follow = []
host_fans = []
host_weibo = []
url_new1=[]
url_new2=[]


#########################開始迴圈抓取
for i in range(1,501):
    try:
        print "正在抓取第"+str(i)+"頁。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。"
        url2="http://d.weibo.com/100803?pids=Pl_Discover_Pt6Rank__5&cfs=920&Pl_Discover_Pt6Rank__5_filter=hothtlist_type=1&Pl_Discover_Pt6Rank__5_page="+str(i)+"&ajaxpagelet=1&__ref=/100803&_t=FM_149273744327929"
        html=session.get(url2).content

        ###########正則表示式匹配#######################
        name=re.findall("Pl_Discover_Pt6Rank__5(.*?)</script>",html,re.S)
        for each in name:
            # print each
            k=re.findall('"html":"(.*?)"}',each,re.S)
            for each1 in k:
                k1=str(each1).replace('\\t',"").replace('\\n','').replace('\\','').replace('#','')
                # print k1
                k2=re.findall('alt="(.*?)" class="pic">',str(k1),re.S)
                for each2 in k2:
                    print each2
                    top_name.append(each2)

                k3=re.findall('</span><a target="_blank" href="(.*?)" class="S_txt1"  >',str(k1),re.S)
                for each3 in k3:
                    print each3
                    url_new1.append(each3)
                    heads={
                    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                    "Accept-Encoding":"gzip, deflate, sdch",
                    "Accept-Language":"zh-CN,zh;q=0.8",
                    "Cache-Control":"max-age=0",
                    "Connection":"keep-alive",
                    "Host":"weibo.com",
                    "Upgrade-Insecure-Requests":"1",
                    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"}

                    html2=session.get(each3,headers=heads).content
                    time.sleep(4)
                    p1=re.findall('Pl_Core_T8CustomTriColumn__12(.*?)</script>',str(html2),re.S)
                    for each3_1 in p1:
                        p2=str(each3_1).replace('\\t',"").replace('\\n','').replace('\\','').replace('#','')
                        # print p2
                        p3=re.findall('閱讀</span>r<td class="S_line1">r<strong (.*?)</strong><span class="S_txt2">討論</span>',str(p2),re.S)
                        for each3_2 in p3:
                            print str(each3_2).replace('class="">','').replace('class="W_f12">','').replace('class="W_f16">','').replace('class="W_f14">','').replace('class="W_f18">','')
                            top_discuss.append(str(each3_2).replace('class="">','').replace('class="W_f12">','').replace('class="W_f16">','').replace('class="W_f14">','').replace('class="W_f18">',''))

                        p4=re.findall('><strong class(.*?)</strong><span class="S_txt2">粉絲',str(p2),re.S)
                        for each3_3 in p4:
                            print str(each3_3).replace('="">','').replace('="W_f12">','').replace('="W_f16">','').replace('="W_f14">','').replace('="W_f18">','')
                            top_fans.append(str(each3_3).replace('="">','').replace('="W_f12">','').replace('="W_f16">','').replace('="W_f14">','').replace('="W_f18">',''))



                k4=re.findall('閱讀數:<span><span class="number">(.*?) </span></div> <div class="sub_box W_fl">',str(k1),re.S)
                for each4 in k4:
                    print each4
                    top_reading.append(each4)

                k5=re.findall('主持人:<span><a target="_blank" href="(.*?)" class="tlink S_txt1"',str(k1),re.S)
                for each5 in k5:
                    print each5
                    mm=re.findall('\d+',str(each5),re.S)
                    for mm_1 in mm:
                        pp1="http://m.weibo.cn/api/container/getIndex?type=uid&value="+str(mm_1)
                        html3=session.get(pp1).content
                        html3=json.loads(html3)
                        userInfo=html3['userInfo']
                        statuses_count=userInfo['statuses_count']
                        followers_count=userInfo['followers_count']
                        follow_count=userInfo['follow_count']
                        print statuses_count,followers_count,follow_count
                        host_follow.append(follow_count)
                        host_fans.append(followers_count)
                        host_weibo.append(statuses_count)
                        url_new2.append(pp1)



                k6 = re.findall('" class="tlink S_txt1"   >(.*?)</a></div> </div><div class="opt_box"', str(k1), re.S)
                for each6 in k6:
                    print each6
                    host_name.append(each6)

    except:
        pass





print len(top_name),len(top_reading),len(top_discuss),len(top_fans),len(host_name),len(url_new2),len(host_follow),len(host_fans),len(host_weibo)



data = pd.DataFrame({"top_name":top_name[0:501], "top_reading": top_reading[0:501],"top_discuss":top_discuss[0:501],"top_fans":top_fans[0:501],"host_name":host_name[0:501],\
                     "host_follow":host_follow[0:501],"host_fans":host_fans[0:501],"host_weibo":host_weibo[0:501]})


print len(data)
# 寫出excel
writer = pd.ExcelWriter(r'C:\\sina_weibo_topic500.xlsx', engine='xlsxwriter', options={'strings_to_urls': False})
data.to_excel(writer, index=False)
writer.close()

time2 = time.time()
print u'ok,爬蟲結束!'
print u'總共耗時:' + str(time2 - time1) + 's'

相關推薦

python 爬蟲python 24小時熱門話題top500

一、需求分析 模擬登陸新浪微博,爬取新浪微博的熱門話題版塊的24小時內的前TOP500的話題名稱、該話題的閱讀數、討論數、粉絲數、話題主持人,以及對應話題主持人的關注數、粉絲數和微博數。 二、開發語言 python2.7 三、需要匯入模組 import

寫一個簡單的爬蟲來批量網的新聞

工具:Anaconda 先進入該頁,新浪新聞:http://news.sina.com.cn/china/ 往下翻,找到這樣的最新訊息 先爬取單個頁面的資訊:(隨便點一個進去), 該新聞網址:http://news.sina.com.cn/c/nd/2018-06-08/doc-ihcscwxa1

python3[爬蟲實戰] 爬蟲之requests京東客服

爬取的內容為京東客服的微博及評論 思路:主要是通過手機端訪問新浪微博的api介面,然後進行資料的篩選, 這個主要是登陸上去的微博的url連結, 可以看到的介面: 這裡主要爬取的內容為: 說說,說說下面的評論條目 雖然很簡單,但是,不得不說句mmp,爬

Python爬蟲按時京東幾類自營手機型號價格引數並存入資料庫

一、最近剛好想換手機,然後就想知道京東上心儀的手機價格如何,對比手機價格如何,以及相應的歷史價格,然後就用Python requests+MySQLdb+smtplib爬取相關的資料 二、關於實現的主要步驟: 1、根據京東搜尋頁面,搜尋某型號(

Python3 爬蟲14_淘寶上的手機圖片

head 並且 淘寶網 pan coff urllib images 圖片列表 pic 現在我們想要使用爬蟲爬取淘寶上的手機圖片,那麽該如何爬取呢?該做些什麽準備工作呢? 首先,我們需要分析網頁,先看看網頁有哪些規律 打開淘寶網站http://www.taobao.com/

爬蟲Scrapy excel中500個網址首頁,使用Selenium模仿使用者瀏覽器訪問,將網頁title、url、文字內容組成的item儲存至json檔案

建立含有網址首頁的excel檔案 host_tag_網站名稱_主域名_子域名.xlsx 編輯讀取excel檔案的工具類專案FileUtils 新建專案FileUtils 編輯file_utils.py # -*- coding: utf-8 -*- """

Python3爬蟲Scrapy豆瓣電影TOP250

今天要實現的就是使用是scrapy爬取豆瓣電影TOP250榜單上的電影資訊。 步驟如下: 一、爬取單頁資訊 首先是建立一個scrapy專案,在資料夾中按住shift然後點選滑鼠右鍵,選擇在此處開啟命令列視窗,輸入以下程式碼: scrapy startprojec

Python3爬蟲了七萬條彈幕,看看RNG和SKT打得怎麼樣

一、寫在前面   直播行業已經火熱幾年了,幾個大平臺也有了各自獨特的“彈幕文化”,不過現在很多平臺直播比賽時的彈幕都基本沒法看的,主要是因為網路上的噴子還是挺多的,尤其是在觀看比賽的時候,很多彈幕不是噴選手就是噴戰隊,如果看了這種彈幕,真是讓比賽減分不少。      但和別的平臺

python寫網路爬蟲-評論

新浪微博需要登入才能爬取,這裡使用m.weibo.cn這個移動端網站即可實現簡化操作,用這個訪問可以直接得到的微博id。 分析新浪微博的評論獲取方式得知,其採用動態載入。所以使用json模組解析json程式碼 單獨編寫了字元優化函式,解決微博評論中的嘈雜干擾

[python爬蟲] Selenium內容及使用者資訊

登入入口 新浪微博登入常用介面:http://login.sina.com.cn/  對應主介面:http://weibo.com/但是個人建議採用手機端微博入口:http://login.weibo.cn/login/ 其原因是手機端資料相對更輕量型,同時基本資料都齊全,可能缺少些個人基本資訊,如"個人資料

Python用戶信息及內容

pro 目標 oss 來源 但是 blog .com 交流 exc 新浪微博作為新時代火爆的新媒體社交平臺,擁有許多用戶行為及商戶數據,因此需要研究人員都想要得到新浪微博數據,But新浪微博數據量極大,獲取的最好方法無疑就是使用Python爬蟲來得到。網上有一些關於使用Py

python股票資料—繪圖原創分享

目標:不做蠟燭圖,只用折線圖繪圖,繪出四條線之間的關係。 注:未使用介面,僅爬蟲學習,不做任何違法操作。   1 """ 2 新浪財經,爬取歷史股票資料 3 """ 4 5 # -*- coding:utf-8 -*- 6 7 import num

爬蟲

這周的第一個小任務:爬取動態網頁,拿新浪微博做例子,我爬取了指定使用者微博的基本資訊,包括暱稱,性別,粉絲數,關注人數和主頁地址,還有發過的所有微博的地址和資訊內容,如果轉發時沒有說任何內容的話只會顯示轉發了微博。 需要注意的是網頁版資訊量太大,用手機端的也就

python資料 (無需手動獲取cookie)

從java 轉為python from selenium import webdriver import selenium from selenium.webdriver.common.desired_capabilities import DesiredCapabi

Python 爬蟲實例(7)—— 軍事新聞

secure host agen cat hand .com cati ica sts 我們打開新浪新聞,看到頁面如下,首先去爬取一級 url,圖片中藍色圓圈部分 第二zh張圖片,顯示需要分頁,

Python爬蟲Python安裝

 pip 是一個現代的,通用的 Python 包管理工具。提供了對 Python 包的查詢、下載、安裝、解除安裝的功能。  IDLE 是一個Python Shell,一個純 Python下自帶的簡潔的整合開發環境(IDE)。IDLE是跟Python一起安裝的,不過

python爬蟲新聞的評論數以及部分評論

首先應該去找到評論數所對應的網頁元素: 可以大致猜測,這裡是用JavaScript·去計算評論數量的。 重新整理頁面,去觀測頁面的js部分,有沒有對應的連結,仔細檢視: 找到之後,點選Preview,看到內部結構: 可以看出count部分,total代表了參與人數,show欄位代

還在人工資料?不用定期敲爬蟲,也能自動化訊息的祕訣(內附Python程式碼)

RSS服務Python實做一、 安裝我們可以透過Python的套件包:「feedparser 」 。讓我們可以輕易的透過Python解析 RSS。Windows 安裝,開啟Command Line:pip install feedparserUbuntu安裝,開啟Terminal:sudo pip insta

爬蟲python爬蟲工具scrapy的安裝使用

關於使用方法及教程參考如下: Scrapy中文官方入門教程 本文章的安裝環境如下 window10 python3.X 文中使用的是python3.5,安裝方法如下 第一步,安裝pypiwin32 pip install pypiwin32 第二步,安裝Twisted

求助爬蟲python中BeautifulSoup之後的select()返回空字串

from bs4 import BeautifulSoup import requests import re headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit