用Scrapy爬取bilibili用戶信息

用Scrapy爬取bilibili用戶信息

bilibili

bilibili現在已經有了幾千萬的用戶,我也是其中的一個,其實我是比較喜歡用BeautifulSoup寫爬蟲的,但是最近學習了scrapy就拿這個來練手了,用BeautifulSoup爬取的會另外寫一篇文章


首先我們分析要爬取的接口

我們分析一下bilibili的個人空間頁面,利用開發者工具中的Network可以發現一個Getinfo的接口有我們需要的數據

用Scrapy爬取bilibili用戶信息

Getinfo返回的信息

分析這些數據雖然給了我們一些例如等級、暱稱、性別等信息,但是該用戶的粉絲數和關注的人沒有在這個接口中,看來還是又另外的接口,不急,我們先分析一下訪問這個接口需要訪問哪些數據

用Scrapy爬取bilibili用戶信息

Getinfo接口

可以看到接口是https://space.bilibili.com/ajax/member/GetInfo,採用POST的方式,再來看看訪問時是否需要傳遞參數

用Scrapy爬取bilibili用戶信息

Getinfo接口傳遞參數

可以看到我們需要提交mid和csrf參數(這裡我是無賬戶訪問的,如果用賬戶訪問參數可能不同)

在前面提到了,這個藉口中並沒有我們需要的用戶的粉絲書和關注的up主的數量,當我們點擊up主的粉絲數,會顯示他的幾位粉絲,當我們把鼠標移到粉絲的頭像上時貌似發現了什麼

用Scrapy爬取bilibili用戶信息

粉絲數接口

當我們鼠標移上去的時候會動態加載一個接口,可以看到這個接口有我們所需要的信息

接著我們看怎麼訪問這個接口

用Scrapy爬取bilibili用戶信息

粉絲數接口

通過分析我們可以看到https://api.bilibili.com/x/relation/stat?vmid={mid}&jsonp=jsonp&callback=__jp{數字},通過這樣的形式我們就可以拿到up主的粉絲數和關注的人數,分析就到這裡,接下來開始寫代碼


這裡就不介紹Scrapy的基礎知識了,直接開始寫代碼

首先編寫items.py文件

用Scrapy爬取bilibili用戶信息

items.py

接下來我們就寫爬蟲了,但是這裡要注意幾點:

  1. 記得添加代理

  2. 要切換不同的User_Agent

  3. 設置隨機延時

以上三點scrapy早都為我們想到了只要在settings.py文件中定義就好,記得一點,在settings.py文件中設置訪問延時雖然是一個定值,但是延時會在這個定值附近浮動,其實實際的延時並不是定值,我這裡延時就直接寫在爬蟲裡了

用Scrapy爬取bilibili用戶信息

bilibili_user.py

我在這裡之所以用range生成 userid既接口中的mid,是因為在bilibili中,用戶的mid是從1開始的

代碼中可以看到我將User-Agent字段是指為了空,進過設置,該字段將會自動補充,如何設置稍後再說,這樣我們就像用戶的數據爬取了下來,接下來我們處理數據

用Scrapy爬取bilibili用戶信息

bilibili_user.py

我們將他裝進item,並將數據返回到pipelines.py中,

注意:

  1. 要將數據返回到pipelines.py中需要使用yield

編寫pipelines.py文件

pipelines.py文件中我們需要將爬取到的數據已json的形式存下來

用Scrapy爬取bilibili用戶信息

pipelines.py

由於我這裡是寫了兩個spider,(一個爬取用戶信息,一個爬取用戶的粉絲和關注),我們需要根據這兩個spider.name區分不同的spider,把數據分別存在兩個json文件中

注意:

  1. ensure=False 務必要設置這個,否則中文會亂碼

爬取到的數據

用Scrapy爬取bilibili用戶信息

bilibili_user_info.json

用Scrapy爬取bilibili用戶信息

bilibili_user_follow.json

我這裡只爬取了4萬條數據再沒爬取,耗時太長

貌似我們現在已經成功的爬取到了bilibili的信息,你也寵寵欲動,想要開始寫了,如果你這樣想,那就證明你沒有認真的看文章

仔細的同學應該發現了之前所說的設置代理和切換User-Agent沒有做,我們接下來就開始

設置代理和User_Agent

設置代理我們首先需要在settings.py文件中寫入我們的代理和User-Agent

用Scrapy爬取bilibili用戶信息

settings.py

用Scrapy爬取bilibili用戶信息

settings.py

然後我們需要在middlewares.py文件中寫函數隨機選取代理和User-Agent進行設置

用Scrapy爬取bilibili用戶信息

middlewares.py

千萬別忘了在middlewares.py中引入PROXIES和USER_AGENTS

接下來我們需要在settings.py文件中開啟這兩個功能

用Scrapy爬取bilibili用戶信息

settings.py

好了,現在我們就可以獲取到了用戶的信息,同樣的要獲取用戶的粉絲和關注只需要寫一個spider就可以了,配置在上面的寫好了,可以通用,那開始寫spider

用Scrapy爬取bilibili用戶信息

bilibili_user_follow.py

爬取數據下來之後我們處理數據

用Scrapy爬取bilibili用戶信息

bilibili_user_follow.py

之後item會傳到pipelines中,在哪裡我們已經寫好了代碼,將數據存到json文件中

下面給你們看一些常用的settings

用Scrapy爬取bilibili用戶信息

settings.py

經過我的查詢,CONCURRENT_REQUESTS這個值並不是指的同時下載的數量,而是同時解析DNS的最大數,下載時還是逐個下載的


後面還會更新利用BeautifulSoup和Request爬取信息,記的關注奧


分享到:


相關文章: