首先微博的站點有四個,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
([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...