bilibili現在已經有了幾千萬的用戶,我也是其中的一個,其實我是比較喜歡用BeautifulSoup寫爬蟲的,但是最近學習了scrapy就拿這個來練手了,用BeautifulSoup爬取的會另外寫一篇文章
首先我們分析要爬取的接口
我們分析一下bilibili的個人空間頁面,利用開發者工具中的Network可以發現一個Getinfo的接口有我們需要的數據
分析這些數據雖然給了我們一些例如等級、暱稱、性別等信息,但是該用戶的粉絲數和關注的人沒有在這個接口中,看來還是又另外的接口,不急,我們先分析一下訪問這個接口需要訪問哪些數據
可以看到接口是https://space.bilibili.com/ajax/member/GetInfo,採用POST的方式,再來看看訪問時是否需要傳遞參數
可以看到我們需要提交mid和csrf參數(這裡我是無賬戶訪問的,如果用賬戶訪問參數可能不同)
在前面提到了,這個藉口中並沒有我們需要的用戶的粉絲書和關注的up主的數量,當我們點擊up主的粉絲數,會顯示他的幾位粉絲,當我們把鼠標移到粉絲的頭像上時貌似發現了什麼
當我們鼠標移上去的時候會動態加載一個接口,可以看到這個接口有我們所需要的信息
接著我們看怎麼訪問這個接口
通過分析我們可以看到https://api.bilibili.com/x/relation/stat?vmid={mid}&jsonp=jsonp&callback=__jp{數字},通過這樣的形式我們就可以拿到up主的粉絲數和關注的人數,分析就到這裡,接下來開始寫代碼
這裡就不介紹Scrapy的基礎知識了,直接開始寫代碼
首先編寫items.py文件
接下來我們就寫爬蟲了,但是這裡要注意幾點:
記得添加代理
要切換不同的User_Agent
設置隨機延時
以上三點scrapy早都為我們想到了只要在settings.py文件中定義就好,記得一點,在settings.py文件中設置訪問延時雖然是一個定值,但是延時會在這個定值附近浮動,其實實際的延時並不是定值,我這裡延時就直接寫在爬蟲裡了
我在這裡之所以用range生成 userid既接口中的mid,是因為在bilibili中,用戶的mid是從1開始的
代碼中可以看到我將User-Agent字段是指為了空,進過設置,該字段將會自動補充,如何設置稍後再說,這樣我們就像用戶的數據爬取了下來,接下來我們處理數據
我們將他裝進item,並將數據返回到pipelines.py中,
注意:要將數據返回到pipelines.py中需要使用yield
編寫pipelines.py文件
pipelines.py文件中我們需要將爬取到的數據已json的形式存下來
由於我這裡是寫了兩個spider,(一個爬取用戶信息,一個爬取用戶的粉絲和關注),我們需要根據這兩個spider.name區分不同的spider,把數據分別存在兩個json文件中
注意:
ensure=False 務必要設置這個,否則中文會亂碼
爬取到的數據
我這裡只爬取了4萬條數據再沒爬取,耗時太長
貌似我們現在已經成功的爬取到了bilibili的信息,你也寵寵欲動,想要開始寫了,如果你這樣想,那就證明你沒有認真的看文章
仔細的同學應該發現了之前所說的設置代理和切換User-Agent沒有做,我們接下來就開始
設置代理和User_Agent
設置代理我們首先需要在settings.py文件中寫入我們的代理和User-Agent
然後我們需要在middlewares.py文件中寫函數隨機選取代理和User-Agent進行設置
千萬別忘了在middlewares.py中引入PROXIES和USER_AGENTS
接下來我們需要在settings.py文件中開啟這兩個功能
好了,現在我們就可以獲取到了用戶的信息,同樣的要獲取用戶的粉絲和關注只需要寫一個spider就可以了,配置在上面的寫好了,可以通用,那開始寫spider
爬取數據下來之後我們處理數據
之後item會傳到pipelines中,在哪裡我們已經寫好了代碼,將數據存到json文件中
下面給你們看一些常用的settings
經過我的查詢,CONCURRENT_REQUESTS這個值並不是指的同時下載的數量,而是同時解析DNS的最大數,下載時還是逐個下載的
後面還會更新利用BeautifulSoup和Request爬取信息,記的關注奧
閱讀更多 熱衷python和前端 的文章