Python爬蟲入門教程 19-100 51CTO學院IT技術課程抓取

来源:https://www.cnblogs.com/happymeng/archive/2019/01/07/10235135.html
-Advertisement-
Play Games

寫在前面 從今天開始的幾篇文章,我將就國內目前比較主流的一些線上學習平臺數據進行抓取,如果時間充足的情況下,會對他們進行一些簡單的分析,好了,平臺大概有 ,`CSDN學院 網易雲課堂 慕課網 mongodb`裡面,如果對上述平臺造成了困擾,請見諒,畢竟我就抓取那麼一小會的時間,不會對伺服器有任何影響 ...


寫在前面

從今天開始的幾篇文章,我將就國內目前比較主流的一些線上學習平臺數據進行抓取,如果時間充足的情況下,會對他們進行一些簡單的分析,好了,平臺大概有51CTO學院CSDN學院網易雲課堂慕課網等平臺,數據統一抓取到mongodb裡面,如果對上述平臺造成了困擾,請見諒,畢竟我就抓取那麼一小會的時間,不會對伺服器有任何影響的。

1. 目標網站

今天的目標網站是 http://edu.51cto.com/courselist/index.html?edunav 數據量大概在1W+,還不錯
在這裡插入圖片描述

2. 分析頁面需要的信息

下圖標註的框框,就是我們需要的信息了
在這裡插入圖片描述

如果查看源碼,我們還能得到其他有價值的隱藏信息,也同時的抓取到,另外,今天的主題不是下載圖片,所以針對課程縮略圖,我只保留一個圖片鏈接到mongodb裡面,就不做單獨的處理了。

在開發者工具中,繼續檢索有用信息。發現一個獨家 這個信息看似有用唉,可以做保留。

在這裡插入圖片描述

3. 分析爬取方式

分析完畢就是要爬取操作了,看一下這個網站是否是ajax動態載入的,如果不是,那麼就採用最笨的辦法爬取。
查閱網站源代碼之後,發現沒有非同步數據。
採用URL拼接的方式爬取即可。

URL規律如下,因為數據相對變化不大,末尾的頁碼是417,所以URL直接生成就可以了。

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學院 完整的練個手

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網站說一句多有得罪,罪過罪過。



代碼上面除了mongodb部分,基本是完整的,自己拷貝一下使用吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Django 系列博客(四) 前言 本篇博客介紹 django 如何和資料庫進行交互並且通過 model 進行數據的增刪查改 ORM簡介 ORM全稱是:Object Relational Mapping(對象關係映射),其主要作用是在編程中,把面向對象的概念跟資料庫中表的概念對應起來。舉例來說就是, ...
  • 黏包現象主要發生在TCP連接, 基於TCP的套接字客戶端往服務端上傳文件,發送時文件內容是按照一段一段的位元組流發送的,在接收方看來,根本不知道該文件的位元組流從何處開始,在何處結束. 兩種黏包現象: 1 連續的小包可能會被優化演算法給組合到一起進行發送 2 第一次如果發送的數據大小2000B接收端一次性 ...
  • 官方寫的方法干擾線是固定的 然後找到captcha/helpers.py 在這個文件添加下麵的函數 ...
  • 一.socketserver模塊 1.sockeserver的源碼流程 2.簡單的使用 socketserver服務端 socket客戶端 二.連接的合法性驗證 1.os.urandom(n)加密 os.urandom(n)是一種bytes類型的隨機生成n個位元組字元串,而且每次生成的值都不相同,再加 ...
  • 一、編寫一個簡單程式,要求數組長度為5,分別賦值10,20,30,40,50,在控制台輸出該數組的值。 package com.test; public class t01 { public static void main(String[] args) { // 靜態初始化 int i[] = n ...
  • 前言: 由於導師在我的畢設項目裡加了消息系統(本來想水水就過的..),沒辦法...來稍微研究研究吧..簡單簡單... 需求分析 我的畢設是一個博客系統 ,類似於簡書這樣的,所以消息系統也類似,在用戶的消息里包含了有:喜歡和贊、評論、關註、私信這樣的一類東西,這樣的一個系統應該包含以下的功能: 1. ...
  • 由於 Apache公司發現myBatis的分頁弊端,所以又研發出得補丁:PageHelper 中央倉庫5.1.2版連接地址: <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --><dependency ...
  • 變數 什麼是變數 變數就是變化的量,變就是變化,量用於衡量描述對象的狀態 為什麼要有變數 程式執行的本質就是一系列狀態的變化,變是程式執行的直接體現,所以我們需要有一種機制能夠反映或者說是保存下來程式執行時狀態以及狀態的變化。 變數的定義規範 #1.變數名只能是字母、數字或下劃線的組合 #2.變數名 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...