Python採集CSDN博客排行榜數據

2020-09-04 青燈教育Python學院

文章目錄

  • 前言
  • 網絡爬蟲搜尋引擎爬蟲應用謹防違法
  • 爬蟲實戰網頁分析編寫代碼運行效果
  • 反爬技術

私信小編01即可獲取Python學習資料

前言

開始接觸 CTF 網絡安全比賽發現不會寫 Python 腳本的話簡直寸步難行……故丟棄 Java 學習下 Python 語言,但單純學習語法又覺得枯燥……所以從 Python 爬蟲應用實戰入手進行學習 Python。本文將簡述爬蟲定義、爬蟲基礎、反爬技術 和 CSDN博客排行榜數據爬取實戰。

網絡爬蟲

網絡爬蟲又稱網絡蜘蛛、網絡螞蟻、網絡機器人等,可以代替人們自動地在網際網路中進行數據信息的採集與整理。在大數據時代,信息的採集是一項重要的工作,如果單純靠人力進行信息採集,不僅低效繁瑣,搜集的成本也會提高。


網絡爬蟲自動化瀏覽網絡中的信息的時候需要按照我們制定的規則進行,這些規則我們稱之為網絡爬蟲算法。使用Python可以很方便地編寫出爬蟲程序,進行網際網路信息的自動化檢索。

搜尋引擎

搜尋引擎離不開爬蟲,比如百度搜尋引擎的爬蟲叫作百度蜘蛛(Baiduspider)。百度蜘蛛每天會在海量的網際網路信息中進行爬取,爬取優質信息並收錄,當用戶在百度搜尋引擎上檢索對應關鍵詞時,百度將對關鍵詞進行分析處理,從收錄的網頁中找出相關網頁,按照一定的排名規則進行排序並將結果展現給用戶。(除了百度搜尋引擎離不開爬蟲以外,其他搜尋引擎也離不開爬蟲,它們也擁有自己的爬蟲。比如360的爬蟲叫360Spider,搜狗的爬蟲叫Sogouspider,必應的爬蟲叫Bingbot。)

在這個過程中,百度蜘蛛起到了至關重要的作用。那麼,如何覆蓋網際網路中更多的優質網頁?又如何篩選這些重複的頁面?這些都是由百度蜘蛛爬蟲的算法決定的。採用不同的算法,爬蟲的運行效率會不同,爬取結果也會有所差異。所以,我們在研究爬蟲的時候,不僅要了解爬蟲如何實現,還需要知道一些常見爬蟲的算法,如果有必要,我們還需要自己去制定相應的算法,在此,我們僅需要對爬蟲的概念有一個基本的了解。

爬蟲應用

在上面的圖中可以看到,網絡爬蟲可以代替手工做很多事情,比如可以用於做搜尋引擎,也可以爬取網站上面的圖片,比如有些朋友將某些網站上的圖片全部爬取下來,集中進行瀏覽,同時,網絡爬蟲也可以用於金融投資領域,比如可以自動爬取一些金融信息,並進行投資分析等。

由於網際網路中的用戶數據信息,相對來說是比較敏感的數據信息,所以,用戶爬蟲的利用價值也相對較高。利用用戶爬蟲可以做大量的事情,比如在2015年,有網友爬取了3000萬QQ空間的用戶信息,並同樣從中獲得了大量潛在數據:

  • QQ空間用戶發說說的時間規律:晚上22點左右,平均發說說的數量是一天中最多的時候;
  • QQ空間用戶的年齡階段分布:出生於1990年到1995年的用戶相對來說較多;
  • QQ空間用戶的性別分布:男生佔比多於50%,女生佔比多於30%,未填性別的佔10%左右。

用戶爬蟲還可以做很多事情,比如爬取淘寶的用戶信息,可以分析淘寶用戶喜歡什麼商品,從而更有利於我們對商品的定位等。由此可見,利用用戶爬蟲可以獲得很多有趣的潛在信息。

謹防違法

網絡爬蟲在大多數情況中都不違法,我們生活中幾乎每天都在爬蟲應用(如百度),從目前的情況來看,如果抓取的數據屬於個人使用或科研範疇,基本不存在問題;而如果數據屬於商業盈利範疇,就有可能屬於違法行為。

Robots協議

Robots協議(爬蟲協議)的全稱是「網絡爬蟲排除標準」(Robots Exclusion Protocol),網站通過Robots協議告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取。該協議是國際網際網路界通行的道德規範,雖然沒有寫入法律,但是每一個爬蟲都應該遵守這項協議。

淘寶網對用戶代理為百度爬蟲引擎進行了規定,我們可以查看淘寶網的 robots.txt:

  1. User-agent: *表示允許所有搜尋引擎蜘蛛來爬行抓取,也可以把*去掉,改為特定某一個或者某些搜尋引擎蜘蛛來爬行抓取,如百度是Baiduspider,谷歌是Googlebot;
  2. 以 Allow 項的值開頭的URL是允許robot訪問的。例如,Allow:/article允許百度爬蟲引擎訪問 /article.htm、/article/12345.com等。
  3. 以 Disallow 項為開頭的連結是不允許百度爬蟲引擎訪問的。例如,Disallow:/product/ 不允許百度爬蟲引擎訪問 /product/12345.com 等。

​最後一行,Disallow:/ 表示禁止百度爬蟲訪問除了Allow規定頁面外的其他所有頁面。百度作為一個搜尋引擎,良好地遵守了淘寶網的 robot.txt 協議。

網絡爬蟲的約束

除了上述Robots協議之外,我們使用網絡爬蟲的時候還要對自己進行約束:過於快速或者頻密的網絡爬蟲都會對伺服器產生巨大的壓力,網站可能封鎖你的IP,甚至採取進一步的法律行動。因此,你需要約束自己的網絡爬蟲行為,將請求的速度限定在一個合理的範圍之內。簡而言之,如果你因為爬取數據導致人家伺服器宕機,你就惹禍上身了……

爬蟲實戰

進入正題之前通過一張圖來簡要了解下爬蟲的工作過程:


下面將演示如何藉助 Python 爬蟲爬取CSDN排行榜Top 100的大佬們的數據信息,保存到本地 Excel 文件進行膜拜。

網頁分析

訪問本次爬取目標——CSDN博客排行榜:https://blog.csdn.net/rank/writing_rank:


抓包分析:


發現返回排行榜用戶信息(每次返回一頁10位)的API:

/api/WritingRank/weekList?username=weixin_39190897&page=1&size=10

  • 1

具體數據包如下:


分析一下參數:

url: 從返回的json數據看,顯然該請求便是需要爬取的url,而不是最開始給的網址username: 這個表示你自己的用戶id,不帶的話就表示沒登入 (不帶也可以)page: 表示當前頁數,測試發現這個只能顯示Top100,也就最大10頁size: 表示每次每頁顯示的數據量,每次json包裡面只包括 10 個大佬的數據這裡面只有page會發生變化,所以我們只要一個循環,不斷的去構造這個網址就行了。

編寫代碼

1、初始化參數:

def __init__(self): self.ua = UserAgent().chrome self.url = &39; 39;Referer&39;https://blog.csdn.net/weixin_39190897&34;Upgrade-Insecure-Requests&34;1&39;User-Agent& 配置保存表格的基本 self.workbook = Workbook() self.sheet = self.workbook.active self.sheet.title = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; def __params(self, offset): self.offset = offset &34;&34;&34; self.params = { &34;: &34;, &34;: str(self.offset), &34;: &34; }

2、爬取網址:

def spider(self): &34;&34;&34; for i in range(1, 11): self.__params(i) url = self.url + urlencode(self.params) r = requests.get(url, headers=self.header) if r.status_code == 200: r.encoding = r.apparent_encoding yield r.json() else: print(&39; + r.status_code) time.sleep(0.5)

3、分析json包:

def parse_json(self, r_json): &34;&34;&34; 39;data& 第二層 list_data = first_data.get(&39;) if list_data: 34;ranking&39;avatar&39;user_nickname& 用戶名 username = i.get(&39;) 39;fans_num& 粉絲 fav_num = i.get(&39;) 39;last_ranking& 上周排名 leave = i.get(&39;).get(&39;) 這裡保存數據 只是為了方便轉換其他保存格式 僅僅是保存excel中用到列表 yield { &39;: rank, &39;: user_nickname, &39;: head_image, &39;: &39; + username, &39;: fans_num, &39;: fav_num, &39;: last_rank, &39;: leave }

4、下載保存excel表格

def down(self, item): &34;&34;&34; now_time = time.strftime(&39;, time.localtime()) -*- coding : utf-8 -*-import requestsfrom urllib.parse import urlencodefrom fake_useragent import UserAgentimport timefrom openpyxl import Workbookclass CSDNSpider(object): &34;&39;https://blog.csdn.net/rank/writing_rank&34;&34; def __init__(self): self.ua = UserAgent().chrome self.url = &39; 39;Referer&39;https://blog.csdn.net/weixin_39190897&34;Upgrade-Insecure-Requests&34;1&39;User-Agent& 配置保存表格的基本 self.workbook = Workbook() self.sheet = self.workbook.active self.sheet.title = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; self.sheet[&39;] = &39; def __params(self, offset): self.offset = offset &34;&34;&34; self.params = { &34;: &34;, &34;: str(self.offset), &34;: &34; } def spider(self): &34;&34;&34; for i in range(1, 11): self.__params(i) url = self.url + urlencode(self.params) r = requests.get(url, headers=self.header) if r.status_code == 200: r.encoding = r.apparent_encoding yield r.json() else: print(&39; + r.status_code) time.sleep(0.5) def parse_json(self, r_json): &34;&34;&34; 39;data& 第二層 list_data = first_data.get(&39;) if list_data: 34;ranking&39;avatar&39;user_nickname& 用戶名 username = i.get(&39;) 39;fans_num& 粉絲 fav_num = i.get(&39;) 39;last_ranking& 上周排名 leave = i.get(&39;).get(&39;) 這裡保存數據 只是為了方便轉換其他保存格式 僅僅是保存excel中用到列表 yield { &39;: rank, &39;: user_nickname, &39;: head_image, &39;: &39; + username, &39;: fans_num, &39;: fav_num, &39;: last_rank, &39;: leave } def down(self, item): &34;&34;&34; now_time = time.strftime(&39;, time.localtime()) leave_list = [] for value in item.values(): leave_list.append(value) leave_list.append(now_time) self.sheet.append(leave_list) def main(self): &34;&34;&34; print(&39;) for content in self.spider(): for item in self.parse_json(content): self.down(item) self.workbook.save(filename=&39;) self.workbook.close() print(&39;)a = CSDNSpider()a.main()

此處代碼中出現使用了 yield 的函數,屬於Python生成器(generator),跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用於迭代操作,更簡單點理解生成器就是一個迭代器。

在調用生成器運行的過程中,每次遇到 yield 時函數會暫停並保存當前所有的運行信息,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續運行。調用一個生成器函數,返回的是一個迭代器對象。

更多 yield 關鍵詞的理解可參考:python中yield的用法詳解——最簡單,最清晰的解釋。

運行效果

在Pycharm中運行腳本:


腳本運行成功後在項目工程目錄下自動生成 CSDNTop100.xlsx 文件:


最後就是見證奇蹟的時刻,打開瞅瞅:

反爬技術

1、通過user-agent來控制訪問

user-agent 能夠使伺服器識別出用戶的作業系統及版本、cpu類型、瀏覽器類型和版本。很多網站會設置 user-agent 白名單,只有在白名單範圍內的請求才能正常訪問。所以在我們的爬蟲代碼中需要設置 user-agent 偽裝成一個瀏覽器請求。有時候伺服器還可能會校驗 Referer,所以還可能需要設置 Referer (用來表示此時的請求是從哪個頁面連結過來的)。

39;Host&39;https://blog.csdn.net&39;Referer&39;https://blog.csdn.net/weixin_43499626/article/details/85875090&39;User-Agent&39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36&34;http://www.baidu.com&34;http&34;http://119.101.125.56&34;https&34;http://119.101.125.1&34;http://www.baidu.com", proxies=random.choices(proxies))

3、通過前端參數加密

某些網站可能會將參數進行某些加密,或者對參數進行拼接發送給伺服器,以此來達到反爬蟲的目的。這個時候我們可以試圖通過js代碼,查看破解的辦法。這裡就要請出一個大殺器:」PhantomJS「。PhantomJS是一個Python包,他可以在沒有圖形界面的情況下,完全模擬一個」瀏覽器「,js腳本驗證什麼的再也不是問題了。

4、通過robots.txt來限制爬蟲

robots.txt是一個限制爬蟲的規範,該文件是用來聲明哪些東西不能被爬取。如果根目錄存在該文件,爬蟲就會按照文件的內容來爬取指定的範圍。但是這實際上只是一個」君子協議「,遵守與否,都在於爬蟲的編寫者。

相關焦點

  • 小夥爬取CSDN博客TOP100榜單,發現高玩博主的秘密
    而 Python 是一門富有表達力的語言,很適合用於數據處理。當數據分析遇上數據可視化時,pyecharts 誕生了。;UTF-8 -*-"""@File    :博客專家佔比.py@Author  :葉庭雲@CSDN    :https://yetingyun.blog.csdn.net/"""import pandas as pdfrom pyecharts
  • 我背著CSDN偷偷記錄了大半年我博客數據
    作為一個數據控+一個有追求的技術博主,總是希望自己能知道自己博客歷史每日粉絲數量、閱讀量、積分、評論……的數據,然而官方博客管理後臺給展示的數據太少了,只有每日訪問量、評論數、粉絲數、收藏數這幾個數據,而且目前最多只能看最近一個月的數據。
  • Python自動化運維繫列:Django搭建小博客
    如何使用Django和Python怎麼搭建一個小博客呢?這是一個簡單而困難的問題。簡單的原因是,只要做過一次,基本上就能做到舉一反三;困難的原因是有沒有用心和耐心去完成這個實驗。如果你成功了,那絕對是賺了!如果你失敗了,也就耽誤你玩幾局遊戲的時間。
  • 給Python 開發者的四條忠告!|CSDN 博文精選 - CSDN
    作者 | 天元浪子責編 | 屠敏出品 | CSDN博客不要糾結於開發工具的選擇,簡單直接就是最好的學習一種程式語言,首先要找一款合用的集成開發工具,似乎是自然而然的想法。為什麼不呢?IDE可以自動補齊,可以一鍵運行,還可以斷點調試。
  • 「技術篇」基於 Java / Python 爬蟲數據採集
    現在很多業務場景經常需要從網際網路上進行數據採集,方式也有很多種,java、python也都可以做到,如何選用看實際業務具體複雜程度了。,嚴格來說可能不算爬取層面的技術現在大部分網站的框架都是異步數據請求綁定,這樣使用上面的方法很難解析到具體的dom節點,也就是說頁面加載完成以後但是數據還沒到頁面,導致數據採集不下來,這個時候可以採用瀏覽器裡面的開發者模式了,推薦谷歌瀏覽器,以智聯招聘網站為例:想採集一條條的招聘信息
  • 百度開發者搜索上線 來源站點涵蓋博客園、知乎、csdn
    首頁 > 見聞 > 關鍵詞 > 百度最新資訊 > 正文 百度開發者搜索上線 來源站點涵蓋博客園、知乎、csdn
  • 大數據信息資料採集:下載軟體排行榜手機遊戲排行榜熱門軟體採集
    大數據信息資料採集:下載軟體排行榜手機遊戲排行榜熱門軟體採集-------------數據採集滿足多種業務場景:適合產品、運營、銷售、數據分析、政府機關、電商從業者、學術研究等多種身份職業。風險預測:高效信息採集和數據清洗,及時應對系統風險。
  • 迷神Django博客實戰3:博客數據遷移,後臺登陸管理及UI美化
    圖/文:迷神前面,我們分享了一些博客實戰的安裝配置等,有需要的,可以看看之前的發布的文章哦。下面我們繼續我們的Django博客實戰開發內容。後臺登陸部分,我們需要先來創建遷移數據,這個資料庫開發部分必須的哦,就是把模型裡面的信息,同步到資料庫裡面。當前,我們還沒有新建其他模型數據,django有默認自帶的默認資料庫信息。
  • Python實現手寫體數字圖片識別+GUI界面+畫板數字識別
    /louishao/article/details/60867339)在開始正式做之前,先看幾篇博客大致了解一下MNIST數據集:https://blog.csdn.net/qq_38269418這些圖片是採集的不同的人手寫從0到9的數字。TensorFlow將這個數據集和相關操作封裝到了庫中,每一張圖片是一個長度為784的一維數組。
  • Python爬蟲爬取B站排行榜數據
    寫在前文在這篇博客中,我們將會從頭開始實現完整的python簡單爬蟲項目。由於本人第一次寫博客,在編寫的過程中難免會出現錯誤,如有發現錯誤或者不合理之處,歡迎到評論區留言指正~獲取網頁數據我們要爬取的內容是B站上的熱門視頻排行榜(全站版)
  • 致Python 初學者們! - CSDN
    作者 | 許向武責編 | 屠敏出品 | CSDN 博客前言在 Python 進階的過程中,相信很多同學應該大致上學習了很多 Python 的基礎知識,也正在努力成長。在此期間,一定遇到了很多的困惑,對未來的學習方向感到迷茫。我非常理解你們所面臨的處境。
  • python學習資料大推薦
    廖雪峰python教程廖老師的教程我相信不用說了吧,每個學習python的人或多或少都聽說過他,對我的幫助很大。2.python中文學習大本營名字叫做python中文學習大本營,但是裡面除了python基礎教程外,更多的是flask框架的擴展文檔,適合每個小夥伴查閱3.ctolib碼庫這是個超級好的網站,主要內容大多是來自github的開源項目。碼庫CTOLib.COM每日更新收錄實用的開源項目和資源,目前共有35110個收錄,並歸類到656個分類中。
  • python數據分析模型有哪些 - CSDN
    使用python對數據進行處理時,數據挖掘是極為重要的方式和階段,目的是搜集大量數據,並從中通過算法搜索出隱藏在數據中的那些隱含的、先前未知的,並有具有潛在使用價值的信息。那麼python數據挖掘的具體流程是怎樣的,下面就跟小編一起來看吧。
  • Python佔據排行榜第一,憑什麼?
    超過Java佔據排行榜第一據PYPL程式語言排行榜最新顯示,Python依舊是排行第一名,分享率高達31.17%,遠遠高出Java的分享率17.75%,另外Python相較於上個月的搜索量還上漲了4.3%,而前5名中其他語言都是下降的。
  • Python爬取近十年TIOBE程式語言熱度數據並可視化
    本文介紹如何利用requests+正則表達式爬取TIOBE程式語言熱度數據,並使用openpyxl寫入數據與pyecharts時間輪播圖進行可視化。,利用正則表達式提取出想要的數據,並保存到Excel中,便於後續數據處理和可視化。
  • 2020最新github Python中文項目排行榜star前100
    人生苦短,我用python! 現在就連潘石屹都開始學習Python了,你還有什麼理由不努力。QUANTAXIS/QUANTAXISDescription: QUANTAXIS 支持任務調度 分布式部署的 股票/期貨/期權/港股/虛擬貨幣 數據/回測/模擬/交易/可視化/多帳戶 純本地量化解決方案Stars: 3.5kLanguage: Python42. wistbean/learn_python3_spiderDescription
  • PHP調用Python快速發送高並發郵件
    但是PHP底層的socket編程相對於python來說效率是非常低的。CleverCode同時寫過用python寫的爬蟲抓取網頁,和用php寫的爬蟲抓取網頁。發現雖然用了php的curl抓取網頁,但是涉及到超時,多線程同時抓取等等。不得不說python在網絡編程的效率要比PHP好的多。
  • 大數據信息資料採集:視頻排行榜嗶哩嗶哩二次元網站視頻內容採集
    大數據信息資料採集:視頻排行榜嗶哩嗶哩二次元網站視頻內容採集---數據採集滿足多種業務場景:適合產品、運營、銷售、數據分析、政府機關、電商從業者、學術研究等多種身份職業。輿情監控:全方位監測公開信息,搶先獲取輿論趨勢。
  • Python操作三大資料庫 - MongoDB
    添加數據後,資料庫與集合才是真正意義上的創建完成:# 插入單條數據data = { "author": "Mike", "tags": ["mongodb", "python",
  • 11月程式語言排行榜Python 勢如破竹,超越 Java?
    TIOBE 排行榜中 C 和 Java 一直佔據著前兩位,近 20 年來沒有哪個語言可以撼動它們兩的地位,直到這幾年 Python 發展越來越快,市場佔有率一直在提升,從去年開始已升至排行榜第三,這個月 Python 歷史性的排到了排行榜的第二位。