国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

洞幺邦的個(gè)人空間 http://m.qingdxww.cn/space-uid-167716.html [收藏] [復(fù)制] [RSS]

博客

【洞幺邦】Python爬取指定微博用戶(hù)所有內(nèi)容

已有 452 次閱讀2021-6-28 17:14 | python, python爬蟲(chóng)

通過(guò)Python爬取微博指定用戶(hù)的所有內(nèi)容,下面帶領(lǐng)大家一步一步爬取微博用戶(hù)(以微博用戶(hù):https://weibo.com/u/6175460875 為例子)的所有微博內(nèi)容。運(yùn)行環(huán)境如下:電腦系統(tǒng):Windows10,Python版本:3.8,IDE:Pycharm2020.1,瀏覽器:谷歌瀏覽器。爬蟲(chóng)程序最后一次測(cè)試時(shí)間為2021年6月21日。

下面我們分步驟講述爬取和分析處理過(guò)程,想跟著我學(xué)技術(shù)的可以一起看看,想使用代碼的可以直接跳到最后復(fù)制我的代碼。


 **1. 使用瀏覽器獲取請(qǐng)求頭部信息**

打開(kāi)谷歌瀏覽器并且訪問(wèn)https://weibo.com/u/6175460875(其他微博頁(yè)面也可以),按F12打開(kāi)開(kāi)發(fā)者工具箱,如圖所示步驟復(fù)制Cookie和User-Agent信息留著備用:

我獲取到的信息是:

```c

"Cookie":"SUB=_2AkMXjLNHf8NxqwJRmfoRzWPmaox3zAzEieKh0EKcJRMxHRl-yT9jqn0ntRB6PAydqHF_kMSfPUJZ_Z3jMWJIHBy6j19j; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WWmnxcrYjVlNsejfucT6rxp; _s_tentry=passport.weibo.com; Apache=8321982383917.372.1624259696759; SINAGLOBAL=8321982383917.372.1624259696759; ULV=1624259696790:1:1:1:8321982383917.372.1624259696759:"

```

```c

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.54"

```

        

 **2. **獲取用戶(hù)主頁(yè)網(wǎng)頁(yè)源碼****

 

在這里我們使用的是urllib.request模塊來(lái)獲取源碼,注意,使用Python獲取源碼時(shí),需要進(jìn)行適當(dāng)偽裝,否則對(duì)方服務(wù)器會(huì)以為我們是爬蟲(chóng)程序而返回一個(gè)無(wú)用信息,偽裝的方法就是把Python爬蟲(chóng)程序的請(qǐng)求頭部信息改成第一步從瀏覽器獲取到的請(qǐng)求頭部信息,我們直接封裝一個(gè)函數(shù)用來(lái)獲取網(wǎng)頁(yè)源碼:

 ```python

 

def getHttpCode(url, coding="utf-8", method="GET"):

    #獲取網(wǎng)頁(yè)源碼的函數(shù),傳入的url為地址

import urllib.parse

    import urllib.request

    data = bytes(urllib.parse.urlencode({"name": "Ningbei"}), encoding=coding)

    headers = {

        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.54",

        "Cookie":"SUB=_2AkMXjLNHf8NxqwJRmfoRzWPmaox3zAzEieKh0EKcJRMxHRl-yT9jqn0ntRB6PAydqHF_kMSfPUJZ_Z3jMWJIHBy6j19j; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WWmnxcrYjVlNsejfucT6rxp; _s_tentry=passport.weibo.com; Apache=8321982383917.372.1624259696759; SINAGLOBAL=8321982383917.372.1624259696759; ULV=1624259696790:1:1:1:8321982383917.372.1624259696759:"

    }

    response = urllib.request.Request(url=url, data=data, headers=headers, method=method)

    response = urllib.request.urlopen(response).read().decode(coding)

    return response

```


 3.**通過(guò)網(wǎng)頁(yè)源碼獲取用戶(hù)信息**

 


```python

print(getHttpCode("https://weibo.com/u/6175460875"))#輸出獲取到的源碼

```


 獲取到的網(wǎng)頁(yè)源碼太長(zhǎng)我就不全發(fā)出來(lái)了,只發(fā)有用部分進(jìn)項(xiàng)講解。

在源碼前面可以看到頁(yè)面信息,后續(xù)步驟中需要用到的信息是oid(用uid變量保存),domain(用同名變量保存),page_id(用pageid變量保存),我們使用正則表達(dá)式可以把這些信息讀取出來(lái),封裝一個(gè)getUserInfo函數(shù)來(lái)獲取上述信息,函數(shù)返回一個(gè)包含用戶(hù)信息的字典。



```python

def getUserInfo(url):

    # 獲取用戶(hù)id等信息

    import re

    result = getHttpCode(url)

    domain = re.findall("\$CONFIG\['domain'\]='([0-9]+)';", result, re.DOTALL)

    uid = re.findall("\$CONFIG\['oid'\]='([0-9]+)';", result, re.DOTALL)

    pageid = domain[0] + uid[0]#觀察網(wǎng)頁(yè)源碼發(fā)現(xiàn),pageid就是domain和uid拼接得來(lái)

    result = {'uid': uid[0], 'pageid': pageid, 'domain': domain[0]}

    return result

```



**4. **分析網(wǎng)頁(yè)源碼,提取有效數(shù)據(jù)****

正常情況下,未登錄的用戶(hù)只能看到第一頁(yè)的數(shù)據(jù),通過(guò)小編的長(zhǎng)時(shí)間分析,得出以下重要結(jié)論,可以在未登錄情況下獲取所有信息(分析過(guò)程比較復(fù)雜,略):有效獲取微博的內(nèi)容地址:https://weibo.com/p/aj/v6/mblog/mbloglist?


微博內(nèi)容分多頁(yè)顯示,同一頁(yè)(page)會(huì)分3次顯示,需提交3個(gè)ajax請(qǐng)求,每個(gè)請(qǐng)求包含domain,id,ajwvr,pagebar,page,pre_page共6個(gè)參數(shù)才能抓取完整,domain,id,ajwvr為固定值(同一個(gè)用戶(hù))參數(shù),其他參數(shù)規(guī)律如下:


當(dāng)當(dāng)前頁(yè)面為第i頁(yè)時(shí),page=i;

第i頁(yè)第一部分的頁(yè)面參數(shù)為pagebar=0,pre_page=i-1

第i頁(yè)第二部分頁(yè)面參數(shù)為pagebar=0,page=i,pre_page=i

第i頁(yè)第三部分頁(yè)面參數(shù)為pagebar=1,page=i,pre_page=i


例如訪問(wèn)第2頁(yè)第2部分的數(shù)據(jù)則提交鏈接:https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&id=1005055705886600&pagebar=0&page=1&pre_page=1


服務(wù)器返回的結(jié)果是json格式的數(shù)據(jù),我們使用json.loads函數(shù)解析得到一個(gè)字典,字典里面 ‘data’的值就是http代碼,再使用BeautifulSoup模塊進(jìn)行解析,即可得到一個(gè)列表,里面是微博內(nèi)容信息。代碼如下:


```python

def getData(url):

    #url='https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&id=1005055705886600&pagebar=0&page=1&pre_page=1'

    import re

import json

from bs4 import BeautifulSoup

    result = getHttpCode(url)

    result = json.loads(result)

    result = result['data']

    soup = BeautifulSoup(result, "html.parser")

    soup = soup.find_all(class_='WB_text W_f14')

    result = []

    for i in soup:

        if i['node-type'] == 'feed_list_content':

            res = re.sub("<.*?>", "", str(i)).strip()

            result.append(res)

    return result

```


運(yùn)行結(jié)果如下:

**5.整合數(shù)據(jù)**


這步比較簡(jiǎn)單,直接上代碼:

```python

def getResult(url):

    #爬取指定微博用戶(hù)所有內(nèi)容核心函數(shù),url為微博用戶(hù)主頁(yè)鏈接

    url = url.split("?")[0]

    userInfo=getUserInfo(url)

    base='https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain={}&id={}'.format(userInfo['domain'], userInfo['pageid'] )

    result=[];

    for page in range(10):

        #當(dāng)期循環(huán)是獲取微博用戶(hù)前10頁(yè)的所有數(shù)據(jù),獲取多少頁(yè)就改成多大的值即可(數(shù)據(jù)過(guò)大也沒(méi)問(wèn)題,系統(tǒng)沒(méi)有爬取到內(nèi)容會(huì)自動(dòng)退出循環(huán)的。)

        list=getData(base + "&pagebar=0&page=" + str(page + 1) + "&pre_page=" + str(page))

        if len(list)==0:

         #list為空表示已經(jīng)沒(méi)有可爬取的內(nèi)容了,直接break

            break

        result.extend(list)

        result.extend(getData(base + "&pagebar=0&page=" + str(page + 1) + "&pre_page=" + str(page+1)))

        result.extend(getData(base + "&pagebar=1&page=" + str(page + 1) + "&pre_page=" + str(page+1)))

    return result

```


到了第5步就已經(jīng)完成爬取了,返回的是一個(gè)列表,列表內(nèi)容就是指定用戶(hù)的微博內(nèi)容。下面我們把所有代碼整合在一起如下:




```python

# -*- coding=utf-8 -*-

import re

import json

import urllib.request

import urllib.parse

from bs4 import BeautifulSoup


def getHttpCode(url, coding="utf-8", method="GET"):

    #獲取網(wǎng)頁(yè)源碼

    data = bytes(urllib.parse.urlencode({"name": "Ningbei"}), encoding=coding)

    headers = {

       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.54",

       "Cookie":"SUB=_2AkMXjLNHf8NxqwJRmfoRzWPmaox3zAzEieKh0EKcJRMxHRl-yT9jqn0ntRB6PAydqHF_kMSfPUJZ_Z3jMWJIHBy6j19j; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WWmnxcrYjVlNsejfucT6rxp; _s_tentry=passport.weibo.com; Apache=8321982383917.372.1624259696759; SINAGLOBAL=8321982383917.372.1624259696759; ULV=1624259696790:1:1:1:8321982383917.372.1624259696759:"

    }

    response = urllib.request.Request(url=url, data=data, headers=headers, method=method)

    response = urllib.request.urlopen(response).read().decode(coding)

    return response


def getUserInfo(url):

    #獲取用戶(hù)id等信息

    result = getHttpCode(url)

    domain=re.findall("\$CONFIG\['domain'\]='([0-9]+)';",result,re.DOTALL)

    uid=re.findall("\$CONFIG\['oid'\]='([0-9]+)';",result,re.DOTALL)

    pageid=domain[0]+uid[0]

    result={'uid': uid[0], 'pageid': pageid, 'domain': domain[0]}

    return result


def getData(url):

    result = getHttpCode(url)

    result = json.loads(result)

    result = result['data']

    soup = BeautifulSoup(result, "html.parser")

    soup = soup.find_all(class_='WB_text W_f14')

    result = []

    for i in soup:

        if i['node-type'] == 'feed_list_content':

            res = re.sub("<.*?>", "", str(i)).strip()

            result.append(res)

    return result


def getResult(url):

    #爬取指定微博用戶(hù)所有內(nèi)容核心函數(shù),url為微博用戶(hù)主頁(yè)鏈接

    url = url.split("?")[0]

    userInfo=getUserInfo(url)

    base='https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain={}&id={}'.format(userInfo['domain'], userInfo['pageid'] )

    result=[];

    for page in range(10):

        #同一頁(yè)(page)會(huì)分3次顯示,需提交三個(gè)請(qǐng)求才能抓取完整,domain,id,ajwvr為固定參數(shù),當(dāng)當(dāng)前頁(yè)面為第i頁(yè)時(shí),page=i;第i頁(yè)第一部分的頁(yè)面參數(shù)為pagebar=0,page=i,pre_page=i-1,第i頁(yè)第二部分頁(yè)面參數(shù)為pagebar=0,page=i,pre_page=i,第i頁(yè)第三部分頁(yè)面參數(shù)為pagebar=1,page=i,pre_page=i

        list=getData(base + "&pagebar=0&page=" + str(page + 1) + "&pre_page=" + str(page))

        if len(list)==0:

         #list為空表示已經(jīng)沒(méi)有可爬取的內(nèi)容了,直接break

            break

        result.extend(list)

        result.extend(getData(base + "&pagebar=0&page=" + str(page + 1) + "&pre_page=" + str(page+1)))

        result.extend(getData(base + "&pagebar=1&page=" + str(page + 1) + "&pre_page=" + str(page+1)))

    return result

    

def main():

    result=getResult("https://weibo.com/u/6175460875")

    for i in result:

        print(i)

        print("-"*200)

    print("前10頁(yè)(需要爬取更全數(shù)據(jù)去修改getResult函數(shù)里面for循環(huán)的范圍)共"+str(len(result))+"條微博")


main()


```



路過(guò)

雞蛋

鮮花

握手

雷人

評(píng)論 (0 個(gè)評(píng)論)

facelist

您需要登錄后才可以評(píng)論 登錄 | 立即注冊(cè)

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
返回頂部
主站蜘蛛池模板: 日本wwwhdsex69| 亚洲欧美一区在线| 欧洲美女大片免费播放器视频| 日日夜夜天天久久| 天天插日日射| yellow在线观看免费直播| 日本一本道高清码v| 欧美区国产区| 天堂资源在线www中文| 亚洲国产一区| 国产三级视频在线| 一级做a爰片久久免费| 青青草成人在线| 日日干夜夜骑| 亚洲 欧美 国产| 国产精品一区第二页| 亚洲人视频在线| 亚洲精品影视| 性感制服| 曰批视频免费40分钟免费| 恋夜影院支持安卓视频美女| 亚洲国产精品久久久久久网站 | 亚洲欧美中日韩中文字幕| 四虎在线精品| 亚洲综合精品香蕉久久网97| 大胸美女洗澡扒奶衣挤奶| 秋霞电影网伦大理电影在线观看| 日韩视| 四虎影永久在线观看网址| 亚洲欧美一| 国产精品99精品无码视亚| 一品道门在线视频| 欧洲免费极品videos| 亚洲小视频在线播放| 337p啪啪人体大胆| 日韩精品一区二区三区AV在线观看| 亚洲一级黄色毛片| 色夜视频| 无遮挡h肉动漫在线观看电车 | 国产51麻豆二区精品AV视频| 伊人热|