Python模擬登錄微博并爬取表情包
一、開發(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è)例子的,昨天代碼寫完測(cè)試了一下,結(jié)果是我微博賬號(hào)和ip都直接被封了(并發(fā)數(shù)設(shè)的500)。
然后我去谷歌搜了一下別人寫的異步爬蟲教程,測(cè)試用的都是些沒啥反爬措施的小網(wǎng)站。
于是今天改了下代碼,就先整個(gè)普普通通的微博小爬蟲算了。
言歸正傳,和之前的微博爬蟲類似,我們還是先利用DecryptLogin進(jìn)行微博賬戶的模擬登錄:
'''模擬登錄''' @staticmethod def login(username, password): lg = login.Login() _, session = lg.weibo(username, password, 'mobile') return session
然后讓使用者輸入目標(biāo)微博用戶的id:
user_id = input('請(qǐng)輸入目標(biāo)用戶ID(例如: 2168613091) ——> ')
微博用戶id在這可以看到:
根據(jù)用戶輸入的微博用戶id,我們?cè)L問如下兩個(gè)鏈接:
url = f'https://weibo.cn/{user_id}' url = f'https://weibo.cn/{user_id}/info'
然后利用xpath提取用戶的基本信息:
打印這些信息,讓使用者確認(rèn)自己輸入的微博用戶id是否無誤:
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ā)的所有微博里的圖片:
'''下載所有圖片''' 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來請(qǐng)求圖片鏈接來下載該圖片。
從返回的微博頁內(nèi)容里提取圖片鏈接時(shí),需要注意:
- 對(duì)轉(zhuǎn)發(fā)微博的微博id和原創(chuàng)微博的微博id提取方式不同;
- 只有單張圖片的微博和有多張圖片的微博提取圖片鏈接的方式是不同的;
- 有時(shí)候圖片鏈接提取會(huì)出錯(cuò),http變成了ttp,所以需要對(duì)提取的圖片鏈接進(jìn)行后處理,然后再去請(qǐng)求這些鏈接來下載圖片。
大體的思路就是這樣,因?yàn)槠鋵?shí)沒啥難點(diǎn),就是用xpath來提取我們需要的信息就行了,所以就這么粗略地介紹一下吧。T_T
運(yùn)行方式:
python weiboEmoji.py --username 用戶名 --password 密碼
到此這篇關(guān)于Python模擬登錄微博并爬取表情包的文章就介紹到這了,更多相關(guān)Python爬取微博表情包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python 詳解爬取并統(tǒng)計(jì)CSDN全站熱榜標(biāo)題關(guān)鍵詞詞頻流程
- 教你用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容
- python實(shí)戰(zhàn)之Scrapy框架爬蟲爬取微博熱搜
- python趣味挑戰(zhàn)之爬取天氣與微博熱搜并自動(dòng)發(fā)給微信好友
- Python爬蟲爬取微博熱搜保存為 Markdown 文件的源碼
- 如何用python爬取微博熱搜數(shù)據(jù)并保存
- python+selenium爬取微博熱搜存入Mysql的實(shí)現(xiàn)方法
- python制作微博圖片爬取工具
- 用Python爬取指定關(guān)鍵詞的微博
相關(guān)文章
在Python中實(shí)現(xiàn)shuffle給列表洗牌
今天小編就為大家分享一篇在Python中實(shí)現(xiàn)shuffle給列表洗牌,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11詳解Python如何使用Netmiko進(jìn)行文件傳輸
Netmiko是一個(gè)用于連接和管理各種網(wǎng)絡(luò)設(shè)備的Python庫,它是Paramiko的一個(gè)擴(kuò)展。本文就來講講如何利用Netmiko實(shí)現(xiàn)文件傳輸功能吧2023-05-05Python實(shí)現(xiàn)Linux的find命令實(shí)例分享
本文給大家分享的是使用python簡單實(shí)現(xiàn)模擬linux的find命令的實(shí)例代碼,推薦給大家,希望大家能夠喜歡2017-06-06Python基于釘釘監(jiān)控發(fā)送消息提醒的實(shí)現(xiàn)
本文主要介紹了Python基于釘釘監(jiān)控發(fā)送消息提醒的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法
這篇文章主要介紹了Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法,涉及Python針對(duì)xml文件的讀取、解析以及Excel文件的寫入、保存等相關(guān)操作技巧,需要的朋友可以參考下2018-09-09