寫在前面
從今天開始的幾篇文章,我將就國內目前比較主流的一些在線學習平臺數據進行抓取,若是時間充足的狀況下,會對他們進行一些簡單的分析,好了,平臺大概有51CTO學院
,CSDN學院
,網易雲課堂
,慕課網
等平臺,數據統一抓取到mongodb
裏面,若是對上述平臺形成了困擾,請見諒,畢竟我就抓取那麼一小會的時間,不會對服務器有任何影響的。html
<div align="center"> <img src="https://user-gold-cdn.xitu.io/2018/12/28/167f2246327f56e8?w=300&h=300&f=jpeg&s=7155" width=200 /> </div> python
1. 目標網站
今天的目標網站是 http://edu.51cto.com/courselist/index.html?edunav
數據量大概在1W+,還不錯 git
2. 分析頁面須要的信息
下圖標註的框框,就是咱們須要的信息了 github
若是查看源碼,咱們還能獲得其餘有價值的隱藏信息,也同時的抓取到,另外,今天的主題不是下載圖片,因此針對課程縮略圖,我只保留一個圖片連接到mongodb
裏面,就不作單獨的處理了。ajax
在開發者工具中,繼續檢索有用信息。發現一個獨家
這個信息看似有用唉,能夠作保留。mongodb
3. 分析爬取方式
分析完畢就是要爬取操做了,看一下這個網站是不是ajax動態加載的,若是不是,那麼就採用最笨的辦法爬取。 查閱網站源代碼以後,發現沒有異步數據。 採用URL拼接的方式爬取便可。服務器
URL規律以下,由於數據相對變化不大,末尾的頁碼是417,因此URL直接生成就能夠了。session
http://edu.51cto.com/courselist/index-p2.html http://edu.51cto.com/courselist/index-p3.html http://edu.51cto.com/courselist/index-p4.html http://edu.51cto.com/courselist/index-p5.html ... http://edu.51cto.com/courselist/index-p417.html
今天主要使用requests-html
這個庫 github地址 : https://github.com/kennethreitz/requests-html 依舊是大神開發的,很是6。異步
咱們拿51cto學院
完整的練個手async
from requests_html import HTMLSession BASE_URL = "http://edu.51cto.com/courselist/index.html" def get_content(): session = HTMLSession() r = session.get(BASE_URL) print(r.html) if __name__ == '__main__': get_content()
使用上面的代碼,就能快速的獲取到一個請求的響應了。 繼續編寫下面幾行代碼以後,你不得不驚歎,我去~,數據都獲取到了!
print(r.html) print(r.html.links) print(r.html.absolute_links) # 獲取全部的絕對地址 print(r.html.find('.cList',first=True)) # 獲取class=cList的第一個標籤 c_list = r.html.find('.cList',first=True) print(c_list.text)
固然這些對咱來講仍是遠遠不夠的,畢竟咱們要把他寫入mongodb裏面
上面的只是叫你對這個庫有一個基本的認知,更多的資料你能夠去他的教程網站查閱
http://html.python-requests.org/
4. 分析爬取方式
看一下異步方式,異步的出現能夠爲咱們的爬蟲加速
這個地方有一個你必定要注意的,我寫這篇文章的時候,requests-html
是從github下載以後,更新的本次,你若是以前使用pip進行安裝,那麼異步應該是沒有更新上去的。
好了,接下來咱們實現一下異步,可能因爲做者認爲異步目前不是很穩定,因此我查閱了一下他的源碼,而後實現了以下代碼,寫的很差,請見諒~
下面的代碼,注意看模塊的區別,以及核心的異步函數
async def get_html(): for i in range(1,3): r = await asession.get(BASE_URL.format(i)) # 異步等待 get_item(r.html) if __name__ == '__main__': result = asession.run(get_html)
from requests_html import AsyncHTMLSession # 導入異步模塊 asession = AsyncHTMLSession() BASE_URL = "http://edu.51cto.com/courselist/index-p{}.html" async def get_html(): for i in range(1,3): r = await asession.get(BASE_URL.format(i)) # 異步等待 get_item(r.html) def get_item(html): c_list = html.find('.cList',first=True) if c_list: items = c_list.find('.cList_Item') for item in items: title = item.find("h3",first=True).text # 課程名稱 href = item.find('h3>a',first=True).attrs["href"] # 課程的連接地址 class_time = item.find("div.course_infos>p:eq(0)",first=True).text study_nums = item.find("div.course_infos>p:eq(1)", first=True).text stars = item.find("div.course_infos>div", first=True).text course_target = item.find(".main>.course_target", first=True).text price = item.find(".main>.course_payinfo h4", first=True).text dict = { "title":title, "href":href, "class_time":class_time, "study_nums":study_nums, "stars":stars, "course_target":course_target, "price":price } print(dict) else: print("數據解析失敗") if __name__ == '__main__': result = asession.run(get_html)
代碼運行以後,控制檯就會輸出相應的內容,上述代碼中有個地方用到了大量的解析HTML,這個你搜索一下官方文檔就能夠看明白,不進行過多的解釋。
5. 寫入到mongodb裏面
這部分代碼就很是很是簡單了 結果以下
實際的爬取過程當中,也沒有發現反爬蟲的一些限制,不過咱畢竟是爲了研究一下requests-html
的用法,因此只能對51CTO網站說一句多有得罪,罪過罪過。
<div align="center"> <img src="https://user-gold-cdn.xitu.io/2018/12/28/167f224663d1445c?w=198&h=198&f=jpeg&s=8360" /> </div>
代碼上面除了mongodb
部分,基本是完整的,本身拷貝一下使用吧。