完整的微博千萬級資料量思路過程

2021-09-11 14:57:46 字數 1933 閱讀 3521

我也不喜歡說廢話,來救直接上,專案要求爬微博,**存成四張表**,分別是使用者資訊表,使用者和使用者關係表,微博資訊表,微博和微博關係表,改為分布式爬蟲可實現單日1000+的資料量,直接開始幹把
準備:

首先你的準備好幾百個微博賬號,並獲取cookie,樓主借鑑網上很多大神的方法,也是通過訪問手機端拿到cookie,比較簡單,並且驗證碼是四宮格,相比於其他驗證碼,簡單,網上很多破解的教程,這裡不贅述,

然後就是**池,微博那麼大的資料量肯定是需要用**的

思路:通過觀察手機端網頁我們可以發現,微博的幾個資訊是可以構建的,user_info 可以在微博uid後面加上info,就能訪問到詳情頁,同樣,fans可以訪問到粉絲頁,profile可以訪問到微博頁,所以我們僅僅需要得到uid就夠了,然後具體的請求再呼叫不用的collback即可

過程:1:找到乙個uid作為種子,爬去他的粉絲,再將粉絲的uid又作為種子,指數**的抓取uid

2:例如uid=12345678911,然後構建三個請求,

三個請求,這三個請求分別對應的是使用者詳情,使用者粉絲,使用者微博,然後就是碼**對每個請求做不同的處理了,這個就是基本的字串之類的操作了,略過了就

3:上面就已經實現了基本的邏輯,然後接下來就是控制請求了,如果讓他一直按上面那樣跑下去,uid會越來越多,就算是存在redis中,也會受不了的,所以有必要控制下請求的個數,我是在callback中進行乙個計數,如:這個callback處理了多少條請求,就彈出乙個使用者id去構建請求,通過修改這個閥值,來實現彈出快慢,從而實現控制請求的產生的快慢

5:setting中的一些設定,cookie那個一定要開起來,還有就是改寫下retry模組,因為被發現是爬蟲之後,會給我們返回418這種沒有任何意義的狀態嗎,我們可以改寫下retry模組,把418也加入到重試模組中,這樣就能減少請求的丟失,

6:中介軟體的一些設定,這個不用多說就是隨機**,隨機cookie,隨機ua,不贅訴

7:pipeline這個,可試可不試,因為我是將資料寫入到mysql中,所以我再網上找到了很多非同步插入mysql的教程,改寫了之後有個重大的改變的就是cpu占用變得特別低,老闆們可以試試

8:一些小方法:我們都知道再scrapy-redis中有三種佇列用來存資料,微博這種建議使用stack來用,因為構建好請求之後最好馬上就髮掉,如果使用queue這樣,就會一直產生請求,沒有把產生好的請求及時傳送出去,導致請求堆積越來越多,並且,我們都知道mysql中連線是有時間限制的,預設是8個小時,如果超過了8個小時的話,就會報pymysql.error.inte***ce(0,'')這個錯誤,好像是這個錯誤,具體記不清了,樓主在這裡就卡了很久,希望各位爬友不要再這裡浪費時間,這個的原因就是連線被關閉了,解析完資料之後,沒有能存進mysql,導致的錯誤

9:有一些坑爹的地方,比如:就uid而言,很多人就是11位的一串數字,但是慢慢發現我們直接抓粉絲頁得到的uid可能會出現一串字母,比如bigxg這種,直接去構建是得不到資料的,但是細心的你一定會發現,還是會有uid的,不過這樣得從info頁進行提取,樓主得做法是將這個有問題得資料存入資料庫,然後再寫乙個爬蟲用來專門查詢這種有問題得資料,然後進行update,親測有效,就寫乙個獲取這個失敗得uid,然後構建info,請求,然後再info頁粉絲或則微博頁得到uid,然後再構建傳送,返回得資料提取出來,再在原來的資料中進行更新即可

11:在發微博的時候我們會遇到有的微博是沒有年月日的,有的會沒有年,比如今天發的微博,他的時間就會顯示為今天12:32分這樣,這種資料是沒法用的,所以我們得進行處理,如果遇到這樣得再前面加上年,或則加上年月日,再存入資料庫,保證資料得完整

12:再微博中我用到的是正則匹配,所以會匹配 出很多例如\n\u200b<>這樣的字元,對我原文得汙染挺嚴重得,再詢問了大佬之後發現了乙個包專門提取這種資料得,html2text,聽名字就知道是幹嘛的,利用這個可以對一些無關的資料進行清洗,只留下文字,特別爽,這個包通過pip安裝即可,很好用

mysql千萬級資料量優化(詳)

1 查詢語句where 子句使用時候優化或者需要注意的 2 like語句使用時候需要注意 3 in語句代替語句 4 索引使用或是建立需要注意 假設使用者表有一百萬使用者量。也就是1000000.num是主鍵 1 對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在where及order by 涉及的列上...

oracle千萬級資料量的表關聯更新

查詢資料庫中的鎖 select sess.sid,sess.serial lo.oracle username,lo.os user name,ao.object name,lo.locked mode from v locked object lo,dba objects ao,v session...

千萬級資料量怎麼做分頁查詢

隨著資料量的增長,分頁數量自然也越來越多,可以通過子查詢的方式提公升分頁效率。在基本查詢的基礎上,先通過乙個子查詢檢索出該頁的起始主鍵id,然後作為主查詢where語句條件進行再次檢索。select from table where id select id from table limit off...