用python寫網路爬蟲 爬取新浪微博評論

2022-08-13 17:03:11 字數 4178 閱讀 8683

首先微博的站點有四個,pc 端weibo.com、weibo.cn以及移動端m.weibo.com(無法在電腦上瀏覽)、在網上大致瀏覽了一下,普遍都認為移動端爬取比較容易,故選擇移動端進行爬取。

登陸m.weibo.cn之後,找到指定微博,例如如下微博/detail/4493649780161355:

找到介面以及文字內容之後,就是分析請求的url構造規律,找到第乙個被請求資料的第乙個url:

/comments/hotflow?id=4493649780161355&mid=4493649780161355&max_id_type=0

下拉頁面,找到第存在目標資料的二個類似的url:

/comments/hotflow?id=4493649780161355&mid=4493649780161355&max_id=13883565036443296&max_id_type=0

第三個url:

/comments/hotflow?id=4493649780161355&mid=4493649780161355&max_id=139259509575025&max_id_type=0

...比較之後我們發現url 的構造欄位為/comments/hotflow? 後面跟上 id=value & mid=vlaue & max_id=value,其中id和mid的值經分析是不會改變的,第一條url中無max_id,往後max_id的值都會發生改變。接著我們在瀏覽器開發者模式中檢視請求返回的資料,例如第乙個url請求返回的資料其中就包含max_id 的值且等於第二個url中max_id 的值

因此我們可以使用乙個遞迴函式,將回去的max_id的值返回,用於構造下一次請求的url, **如下:

1

import

requests

2import

random

3import

time

4importre5

import

json

6import

csv7

8 start_url = '

/comments/hotflow?id=4493649780161355&mid=4493649780161355&max_id_type=0'#

首個url

9 next_url = '

"/comments/hotflow?id=4493649780161355&mid=4493649780161355&max_id={}&max_id_type=0"'#

用於構造後面的url的模板

1011 continue_url =start_url

1213 headers =

17 count =0

1819 fileheader = ["

id","

","使用者id

","暱稱

","",""]

2021

2223

defget_data(url):

24for trytime in range(3): #

允許超時次數為3次

25try

:26 response = requests.get(url=url, headers=headers, timeout=5)

27 data =json.loads(response.text)

28if response.status_code == 200:

29break

30except:31

print('超時'

)3233if trytime == 2: #

連續3次超時就退出遞迴

34print('

連續3次超時')

35return

3637

if data['

ok'] == 0: #

若沒有獲取到資料也進行退出

38print("

獲取到的資料data['ok']=

", 0)

39return

4041

elif data['

ok'] == 1: #

判斷若能夠獲取到資料 則進行所需資料提取,並且構造下次請求的url,呼叫函式

42 max_id = data.get("

data

").get("

max_id")

43 comments = data.get('

data

').get('

data')

44for item in

comments:

45'''

獲取內容creattime;floor——number;text;userid;screen——name;

'''46

global

count

47 count += 1

48 create_time = item['

created_at']

49 floor_number = item['

floor_number']

50 text = ''.join(re.findall('

[\u4e00-\u9fa5]

', item['

text

'])) #

匹配文字內容

51 userid = item.get('

user

')['id'

]52 screen_name = item.get('

user

')['

screen_name']

5354

#將內容寫入csv檔案中

55csv_opreator([count,create_time,userid,screen_name,floor_number,text])

5657

print

([count, create_time, userid, screen_name, floor_number, text])

58print("

第{}條資料獲取成功

".format(count))

5960

global

next_url

61 continue_url =next_url.format(str(max_id))

62print

(continue_url)

63 time.sleep(random.random()*5)

64 get_data(continue_url) #

呼叫函式本身

65return

6667

defcsv_opreator(a):

6869 with open("

weibocoments.csv

", "a"

) as f:

70 writer =csv.writer(f)

71writer.writerow(a)

7273

7475

if__name__ == "

__main__":

76csv_opreator(fileheader)

77 get_data(continue_url)

後台輸出如下:

csv檔案結果如下:

可能遇到的問題,由於微博反爬,可先選擇更換ip,或者重新登陸,將新的cookies複製進**。

python爬蟲 爬取抽屜新熱榜

爬取段子 抽屜 爬蟲的常規操作,根據需求進行分析。我們要爬取段子,也就是每條段子資訊。先按f12檢視一下網頁,審查元素。我們剛好找到段子資訊,看看其他段子是不是也在這個位置。我們發現了25條一樣的 提取這些資訊,我們同樣使用beautifulsoup。beautifulsoup的用法我在另一篇文章中...

Python 網路爬蟲 爬取表情包

import requests import os import urllib.parse from bs4 import beautifulsoup 函式 判斷表情包是不是0個 def is zero url test requests.get url msg test.content s bea...

python爬蟲爬取網路小說

首先,獲取html頁面並解析,為方便儲存和使用頁面的encoding,直接使用全域性變數 章節名章節名 章節名.從結構可以看出,可以先獲取目錄的頂層標籤 class box 的標籤 然後再獲取該標籤內所有的li標籤即可。由於頁面內有其他的class box 的標籤,因此本次使用soup.find s...