Python爬蟲入門教程 28-100 虎嗅網文章數據抓取 pyspider

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

1. 虎嗅網文章數據 寫在前面 今天繼續使用 爬取數據,很不幸,虎嗅資訊網被我選中了,網址為 爬的就是它的資訊頻道,本文章僅供學習交流使用,切勿用作其他用途。 常規操作,分析待爬取的頁面 拖拽頁面到最底部,會發現一個 按鈕,點擊之後,抓取一下請求,得到如下地址 2. 虎嗅網文章數據 分析請求 查閱該 ...


1. 虎嗅網文章數據----寫在前面

今天繼續使用pyspider爬取數據,很不幸,虎嗅資訊網被我選中了,網址為 https://www.huxiu.com/ 爬的就是它的資訊頻道,本文章僅供學習交流使用,切勿用作其他用途。

常規操作,分析待爬取的頁面

拖拽頁面到最底部,會發現一個載入更多按鈕,點擊之後,抓取一下請求,得到如下地址

在這裡插入圖片描述

2. 虎嗅網文章數據----分析請求

查閱該請求的方式和地址,包括參數,如下圖所示
在這裡插入圖片描述

得到以下信息

  1. 頁面請求地址為:https://www.huxiu.com/v2_action/article_list
  2. 請求方式:POST
  3. 請求參數比較重要的是一個叫做page的參數

我們只需要按照上面的內容,把pyspider代碼部分編寫完畢即可。
on_start 函數內部編寫迴圈事件,註意到有個數字2025這個數字,是我從剛纔那個請求中看到的總頁數。你看到這篇文章的時候,這個數字應該變的更大了。

    @every(minutes=24 * 60)
    def on_start(self):
        for page in range(1,2025):
            print("正在爬取第 {} 頁".format(page))
            self.crawl('https://www.huxiu.com/v2_action/article_list', method="POST",data={"page":page},callback=self.parse_page,validate_cert=False)

頁面生成完畢之後,開始調用parse_page 函數,用來解析 crawl() 方法爬取 URL 成功後返回的 Response 響應。

    @config(age=10 * 24 * 60 * 60)
    def parse_page(self, response):
        content = response.json["data"]
        doc = pq(content)
        lis = doc('.mod-art').items()
        data = [{
           'title': item('.msubstr-row2').text(),
           'url':'https://www.huxiu.com'+ str(item('.msubstr-row2').attr('href')),
           'name': item('.author-name').text(),
           'write_time':item('.time').text(),
           'comment':item('.icon-cmt+ em').text(),
           'favorites':item('.icon-fvr+ em').text(),
           'abstract':item('.mob-sub').text()
           } for item in lis ] 
        return data

最後,定義一個 on_result() 方法,該方法專門用來獲取 return 的結果數據。這裡用來接收上面 parse_page() 返回的 data 數據,在該方法可以將數據保存到 MongoDB 中。

  # 頁面每次返回的數據            
    def on_result(self,result):
        if result:
            self.save_to_mongo(result)            
    
  
    # 存儲到mongo資料庫
    def save_to_mongo(self,result):
        df = pd.DataFrame(result)  
        content = json.loads(df.T.to_json()).values()
        if collection.insert_many(content):
            print('存儲數據成功')
            # 暫停1s
            time.sleep(1)

好的,保存代碼,修改每秒運行次數和併發數

在這裡插入圖片描述

點擊run將代碼跑起來,不過當跑起來之後,就會發現抓取一個頁面之後程式就停止了, pyspider 以 URL的 MD5 值作為 唯一 ID 編號,ID 編號相同,就視為同一個任務, 不會再重覆爬取。

GET 請求的分頁URL 一般不同,所以 ID 編號會不同,能夠爬取多頁。
POST 請求的URL是相同的,爬取第一頁之後,後面的頁數便不會再爬取。

解決辦法,需要重新寫下 ID 編號的生成方式,在 on_start() 方法前面添加下麵代碼即可:

    def get_taskid(self,task):
        return md5string(task['url']+json.dumps(task['fetch'].get('data','')))

基本操作之後,文章入庫

在這裡插入圖片描述


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

-Advertisement-
Play Games
更多相關文章
  • 創建 function 對象的兩種方法: 方式一(推薦) 方式二:var func2 = new Function("參數1", "參數n","函數體"); arguments 對象 獲得參數的個數 獲得參數的個數和值的總額 控制拋出異常 自執行函數 instanceof 用於判斷一個變數是否某個對 ...
  • 在jquery中,給元素綁定事件,本文一共介紹三種方法,運用案例,針對最常用的on()方法,進行事件綁定操作。 事件綁定方法: ①$(element).bind() 參數:{ “事件名稱1”:function( ){ } ,“事件名稱2”:function(){ },......} 例如給類名為on ...
  • 一、23種設計模式分類: 二、設計模式的六大原則: 1、開閉原則(Open Close Principle):對擴展開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。 2、里氏代換原則(Liskov Substitution Principle):任何基類可以出 ...
  • DDD早於微服務「出道」十年,這兩個「忘年交」的軟體設計哲學是如何相愛相殺的? 背景 微服務現在可以說是軟體研發領域無人不提的話題,然而業界流行的對比多數都是所謂的Monolithic(單體應用),而大量的系統在十幾年前都已經是以SOA(面向服務架構)為基礎的分散式系統了,那麼微服務作為新的架構標準 ...
  • 靜兒就職的是新美大的基礎架構部門,做的是基於k8s的容器調度開發。k8s只是個工具,真正技術的上就是和網路打交道要多些。需要對網路中的數據流向有清晰的認識。大多數時間還是在做平臺,事情很跟業務很相似,也主要是工程。 之前記得有同事說過,設計的東西都被框架封裝好了,設計模式基本用不上。但是靜兒怎麼覺得 ...
  • 程式的三種基本結構 複合語句 將若幹個C語句使用花括弧{ }包括起來形成複合語句。花括弧內可以包含任何C語句, 其一般形式為: { 語句1; 語句2; …… 語句n; } 1.if條件分支語句 if語句有三種語法形式,構成三種分支結構。 1)流程(單選控制結構) 語句形式如下: if (表達式)語句 ...
  • 關於博客訪問量的問題,影響因素有很多,例如你的權重,你的博客數量,包括你的標題是否吸引人都是一個衡量的標準。 這些東西需要的是日積月累,今天我們從其中的一個維度入手:發帖時間。相信大家都明白,不論是csdn,博客園這種技術博客 還是今日頭條百度貼吧或者抖音快手這種娛樂論壇,都有自己的線上高峰期。例如 ...
  • 大概的樣子 這是大致的樣子~ 寫之前想說的 思路 這裡有一個問題,就是在使用ssh的時候會有一個等待用戶輸入密碼的過程。不能直接一條命令鏈接ssh。我們可以通過 expect 來解決。 不懂的可以百度一下,很簡單的。O(∩_∩)O哈哈~ 開始寫 首先 首先解決ssh等待輸入密碼的問題,首先 我們要安 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...