一、開發(fā)工具
**Python****版本:**3.6.4
相關(guān)模塊:
DecryptLogin模塊;
argparse模塊;
requests模塊;
prettytable模塊;
tqdm模塊;
lxml模塊;
fake_useragent模塊;
以及一些Python自帶的模塊。
二、環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
三、原理簡介
本來這個(gè)爬蟲是想作為講python異步爬蟲的一個(gè)例子的,昨天代碼寫完測試了一下,結(jié)果是我微博賬號(hào)和ip都直接被封了(并發(fā)數(shù)設(shè)的500)。
然后我去谷歌搜了一下別人寫的異步爬蟲教程,測試用的都是些沒啥反爬措施的小網(wǎng)站。
于是今天改了下代碼,就先整個(gè)普普通通的微博小爬蟲算了。
言歸正傳,和之前的微博爬蟲類似,我們還是先利用DecryptLogin進(jìn)行微博賬戶的模擬登錄:
1
2
3
4
5
6
|
'''模擬登錄''' @staticmethod def login(username, password): lg = login.Login() _, session = lg.weibo(username, password, 'mobile' ) return session |
然后讓使用者輸入目標(biāo)微博用戶的id:
1
|
user_id = input ( '請輸入目標(biāo)用戶ID(例如: 2168613091) ——> ' ) |
微博用戶id在這可以看到:
根據(jù)用戶輸入的微博用戶id,我們訪問如下兩個(gè)鏈接:
1
2
|
url = f 'https://weibo.cn/{user_id}' url = f 'https://weibo.cn/{user_id}/info' |
然后利用xpath提取用戶的基本信息:
打印這些信息,讓使用者確認(rèn)自己輸入的微博用戶id是否無誤:
1
2
3
4
5
6
|
tb = prettytable.PrettyTable() tb.field_names = [ '用戶名' , '關(guān)注數(shù)量' , '被關(guān)注數(shù)量' , '微博數(shù)量' , '微博頁數(shù)' ] tb.add_row([nickname, num_followings, num_followers, num_wbs, num_wb_pages]) print ( '獲取的用戶信息如下:' ) print (tb) is_download = input ( '是否爬取該微博用戶發(fā)的所有圖片?(y/n, 默認(rèn): y) ——> ' ) |
如果無誤,就開始爬取該用戶發(fā)的所有微博里的圖片:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
'''下載所有圖片''' def __downloadImages( self , userinfos, savedir): # 一些必要的信息 num_wbs = userinfos.get( 'num_wbs' ) user_id = userinfos.get( 'user_id' ) num_wb_pages = userinfos.get( 'num_wb_pages' ) # 提取圖片鏈接并下載圖片 page_block_size = random.randint( 1 , 5 ) page_block_count = 0 for page in tqdm( range ( 1 , num_wb_pages + 1 )): # --提取圖片鏈接 response = self .session.get(f 'https://weibo.cn/{user_id}?page={page}' , headers = self .headers) image_urls = self .__extractImageUrls(response) # --下載圖片 for url in image_urls: try : res = requests.get(url, headers = { 'user-agent' : self .ua.random}, stream = True ) with open (os.path.join(savedir, url.split( '/' )[ - 1 ]), 'wb' ) as fp: for chunk in res.iter_content(chunk_size = 32 ): fp.write(chunk) print ( '[INFO]: Download an image from: ' , url) except : pass # --避免給服務(wù)器帶來過大壓力and避免被封, 每爬幾頁程序就休息一下 page_block_count + = 1 if page_block_count % page_block_size = = 0 : time.sleep(random.randint( 6 , 12 )) page_block_size = random.randint( 1 , 5 ) page_block_count = 0 |
這里避免爬蟲被BAN的措施主要有以下幾點(diǎn):
- 每爬n頁數(shù)據(jù)就暫停x秒,其中n是隨機(jī)生成的,且n一直在變化,x也是隨機(jī)生成的,且x也一直在變化;
- 下載圖片時(shí),使用隨機(jī)的ua,并且不使用登錄后的session來請求圖片鏈接來下載該圖片。
從返回的微博頁內(nèi)容里提取圖片鏈接時(shí),需要注意:
- 對轉(zhuǎn)發(fā)微博的微博id和原創(chuàng)微博的微博id提取方式不同;
- 只有單張圖片的微博和有多張圖片的微博提取圖片鏈接的方式是不同的;
- 有時(shí)候圖片鏈接提取會(huì)出錯(cuò),http變成了ttp,所以需要對提取的圖片鏈接進(jìn)行后處理,然后再去請求這些鏈接來下載圖片。
大體的思路就是這樣,因?yàn)槠鋵?shí)沒啥難點(diǎn),就是用xpath來提取我們需要的信息就行了,所以就這么粗略地介紹一下吧。T_T
運(yùn)行方式:
1
|
python weiboEmoji.py - - username 用戶名 - - password 密碼 |
到此這篇關(guān)于Python模擬登錄微博并爬取表情包的文章就介紹到這了,更多相關(guān)Python爬取微博表情包內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/weixin_43649691/article/details/117455878