1. 程式人生 > 其它 >Python爬蟲實戰,DecryptLogin模組,Python模擬登入微博實現抓取數不完的表情包儲存本地

Python爬蟲實戰,DecryptLogin模組,Python模擬登入微博實現抓取數不完的表情包儲存本地

前言:

前段時間爬取的知乎表情包用完了嗎?今天再帶大家去微博爬一波表情包吧。廢話不多說,讓我們愉快地開始吧~

開發工具

Python****版本:3.6.4

相關模組:

DecryptLogin模組;

argparse模組;

requests模組;

prettytable模組;

tqdm模組;

lxml模組;

fake_useragent模組;

以及一些Python自帶的模組。

環境搭建

安裝Python並新增到環境變數,pip安裝需要的相關模組即可。

原理簡介

本來這個爬蟲是想作為講python非同步爬蟲的一個例子的,昨天程式碼寫完測試了一下,結果是我微博賬號和ip都直接被封了(併發數設的500)。

然後我去谷歌搜了一下別人寫的非同步爬蟲教程,測試用的都是些沒啥反爬措施的小網站。

於是今天改了下程式碼,就先整個普普通通的微博小爬蟲算了。

言歸正傳,和之前的微博爬蟲類似,我們還是先利用DecryptLogin進行微博賬戶的模擬登入:

'''模擬登入'''
@staticmethod
def login(username, password):
  lg = login.Login()
  _, session = lg.weibo(username, password, 'mobile')
  return session

然後讓使用者輸入目標微博使用者的id:

user_id = input('請輸入目標使用者ID(例如: 2168613091) ——> ')

微博使用者id在這可以看到:

根據使用者輸入的微博使用者id,我們訪問如下兩個連結:

url = f'https://weibo.cn/{user_id}'
url = f'https://weibo.cn/{user_id}/info'

然後利用xpath提取使用者的基本資訊:

列印這些資訊,讓使用者確認自己輸入的微博使用者id是否無誤:

tb = prettytable.PrettyTable()
tb.field_names = ['使用者名稱', '關注數量', '被關注數量', '微博數量', '微博頁數']
tb.add_row([nickname, num_followings, num_followers, num_wbs, num_wb_pages])
print('獲取的使用者資訊如下:')
print(tb)
is_download = input('是否爬取該微博使用者發的所有圖片?(y/n, 預設: y) ——> ')

如果無誤,就開始爬取該使用者發的所有微博裡的圖片:

'''下載所有圖片'''
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
    # --避免給伺服器帶來過大壓力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的措施主要有以下幾點:

  • 每爬n頁資料就暫停x秒,其中n是隨機生成的,且n一直在變化,x也是隨機生成的,且x也一直在變化;

  • 下載圖片時,使用隨機的ua,並且不使用登入後的session來請求圖片連結來下載該圖片。

從返回的微博頁內容裡提取圖片連結時,需要注意:

  • 對轉發微博的微博id和原創微博的微博id提取方式不同;

  • 只有單張圖片的微博和有多張圖片的微博提取圖片連結的方式是不同的;

  • 有時候圖片連結提取會出錯,http變成了ttp,所以需要對提取的圖片連結進行後處理,然後再去請求這些連結來下載圖片。

大體的思路就是這樣,因為其實沒啥難點,就是用xpath來提取我們需要的資訊就行了,所以就這麼粗略地介紹一下吧。T_T

完整的原始碼詳見相關檔案唄~

效果展示

執行方式:

pythonweiboEmoji.py--username使用者名稱--password密碼

文章到這裡就結束了,感謝你的觀看,Python模擬登入系列系列,下篇文章大吼一聲來發條微博

為了感謝讀者們,我想把我最近收藏的一些程式設計乾貨分享給大家,回饋每一個讀者,希望能幫到你們。

乾貨主要有:

① 2000多本Python電子書(主流和經典的書籍應該都有了)

② Python標準庫資料(最全中文版)

③ 專案原始碼(四五十個有趣且經典的練手專案及原始碼)

④ Python基礎入門、爬蟲、web開發、大資料分析方面的視訊(適合小白學習)

⑤ Python學習路線圖(告別不入流的學習)

⑥ 兩天的Python爬蟲訓練營直播許可權

All done~點贊+評論~詳見個人簡介或者私信獲取完整原始碼。。