<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個(gè)爬取用戶所有微博的爬蟲(chóng),還能斷網(wǎng)續(xù)爬那種

          共 1691字,需瀏覽 4分鐘

           ·

          2020-08-13 08:28

          ? ? 點(diǎn)擊上方?月小水長(zhǎng)?并?設(shè)為星標(biāo),第一時(shí)間接收干貨推送

          這是?月小水長(zhǎng)?的第?51?篇原創(chuàng)干貨

          熟悉這個(gè)微博超級(jí)話題爬蟲(chóng)系列的都知道,我已經(jīng)停止對(duì)有GUI功能集中版本的維護(hù)了,集中精力維護(hù)無(wú)GUI版本功能獨(dú)立版本的開(kāi)發(fā)和維護(hù),并且保證每個(gè)功能都是最小可用產(chǎn)品且互不干擾。但是功能獨(dú)立版本一直有個(gè)歷史遺留問(wèn)題:沒(méi)有將集中版本中爬取每個(gè)用戶的所有微博的功能獨(dú)立出來(lái),剛好今天有空,我也覺(jué)得是時(shí)候?qū)扅c(diǎn)東西了,于是就有了這篇文章。

          整體的剝離過(guò)程來(lái)算比較輕松,因?yàn)楣δ芗邪姹久總€(gè)功能都有一個(gè)相對(duì)獨(dú)立的類,這個(gè)用戶微博爬蟲(chóng)就是一個(gè) WeiboUserScrapy 類,只不過(guò)在集中版本中為了和其他功能模塊進(jìn)行通信和協(xié)調(diào),引進(jìn)了 PyQT5 的信號(hào)量,以及一些公共配置變量,獨(dú)立時(shí)將這些東西去掉即可。

          代碼的地址放在文末閱讀原文,拿到代碼后,你需要做的兩件事依次是:

          1. 更換代碼中的 Cookie
          2. 把 user_id 改成你想要爬取的用戶 id(是純數(shù)字)
          然后運(yùn)行代碼即可,不一會(huì)兒你就能在項(xiàng)目的根目錄下的 user 文件夾看到諸如{user_id}_{nickname}_{weibo_num}博_{followers}粉_{following}關(guān)注.csv' 格式的文件,爬取的微博都保存在這里。
          按道理,這篇文章到此就可以收尾了。但是想了想,想到老鐵們可能有這樣的問(wèn)題:某個(gè)博主有 4w 條微博,爬了 2w 條突然斷網(wǎng)了或者 Cookie 過(guò)期了,難道要重新爬?
          ?
          作為良心博主,當(dāng)然要加一個(gè)斷點(diǎn)續(xù)爬的功能,其實(shí)實(shí)現(xiàn)起來(lái)也不難,每次寫 csv 的時(shí)候同時(shí)將翻頁(yè)參數(shù) page 保存并更新到一個(gè)配置文件中即可,核心代碼如下:
          user_page_config?=?'user_page.json'
          if?not?os.path.exists('user_page.json'):
          ????page?=?1
          ????with?open(user_page_config,'w',?encoding='utf-8-sig')?as?f:
          ????????f.write(json.dumps({f'{self.user_id}':page},?indent=2))
          else:
          ????with?open(user_page_config,'r',?encoding='utf-8-sig')?as?f:
          ????????page?=?json.loads(f.read())[f'{self.user_id}']

          random_pages?=?random.randint(1,?5)
          for?page?in?range(page,?page_num?+?1):
          ????self.get_one_page(page)??#?獲取第page頁(yè)的全部微博

          ????with?open(user_page_config,'r',?encoding='utf-8-sig')?as?f:
          ????????old_data?=?json.loads(f.read())
          ????????old_data[f'{self.user_id}']?=?page

          ????with?open(user_page_config,'w',?encoding='utf-8-sig')?as?f:
          ????????f.write(json.dumps(old_data,?indent=2))
          這樣,就能右鍵運(yùn)行代碼,開(kāi)開(kāi)心心做其他事去,不用每時(shí)每刻盯著代碼。
          最后就是一點(diǎn)碎碎念了,斷更的這一個(gè)月中,我正式成為了一名社畜,一個(gè)北漂,全職在北京西二旗某互聯(lián)網(wǎng)廠工作,因此個(gè)人可用的時(shí)間相比在校少了許多,但是這個(gè)微博爬蟲(chóng)呢,我會(huì)繼續(xù)維護(hù)的,公眾號(hào)也會(huì)加油更的,請(qǐng)大家多多支持。哦,別忘了,閱讀原文取代碼,跑數(shù)據(jù)。
          瀏覽 53
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品a久久久久 | 4438激情网 | 色综合视频二区偷拍在线 | 苍井空黄色视频 | 天堂青草福利视频 |