日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python爬虫-CSDN博客排行榜数据爬取

發(fā)布時間:2023/12/20 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬虫-CSDN博客排行榜数据爬取 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 網(wǎng)絡爬蟲
    • 搜索引擎
    • 爬蟲應用
    • 謹防違法
  • 爬蟲實戰(zhàn)
    • 網(wǎng)頁分析
    • 編寫代碼
    • 運行效果
  • 反爬技術

前言

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

網(wǎng)絡爬蟲

網(wǎng)絡爬蟲又稱網(wǎng)絡蜘蛛、網(wǎng)絡螞蟻、網(wǎng)絡機器人等,可以代替人們自動地在互聯(lián)網(wǎng)中進行數(shù)據(jù)信息的采集與整理。在大數(shù)據(jù)時代,信息的采集是一項重要的工作,如果單純靠人力進行信息采集,不僅低效繁瑣,搜集的成本也會提高。


網(wǎng)絡爬蟲自動化瀏覽網(wǎng)絡中的信息的時候需要按照我們制定的規(guī)則進行,這些規(guī)則我們稱之為網(wǎng)絡爬蟲算法。使用Python可以很方便地編寫出爬蟲程序,進行互聯(lián)網(wǎng)信息的自動化檢索。

搜索引擎

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

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

爬蟲應用

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

由于互聯(lián)網(wǎng)中的用戶數(shù)據(jù)信息,相對來說是比較敏感的數(shù)據(jù)信息,所以,用戶爬蟲的利用價值也相對較高。利用用戶爬蟲可以做大量的事情,比如在2015年,有網(wǎng)友爬取了3000萬QQ空間的用戶信息,并同樣從中獲得了大量潛在數(shù)據(jù):

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

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

謹防違法

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

Robots協(xié)議

Robots協(xié)議(爬蟲協(xié)議)的全稱是“網(wǎng)絡爬蟲排除標準”(Robots Exclusion Protocol),網(wǎng)站通過Robots協(xié)議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。該協(xié)議是國際互聯(lián)網(wǎng)界通行的道德規(guī)范,雖然沒有寫入法律,但是每一個爬蟲都應該遵守這項協(xié)議。

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

  • User-agent: *表示允許所有搜索引擎蜘蛛來爬行抓取,也可以把*去掉,改為特定某一個或者某些搜索引擎蜘蛛來爬行抓取,如百度是Baiduspider,谷歌是Googlebot;
  • 以 Allow 項的值開頭的URL是允許robot訪問的。例如,Allow:/article允許百度爬蟲引擎訪問 /article.htm、/article/12345.com等。
  • 以 Disallow 項為開頭的鏈接是不允許百度爬蟲引擎訪問的。例如,Disallow:/product/ 不允許百度爬蟲引擎訪問 /product/12345.com 等。
  • 最后一行,Disallow:/ 表示禁止百度爬蟲訪問除了Allow規(guī)定頁面外的其他所有頁面。百度作為一個搜索引擎,良好地遵守了淘寶網(wǎng)的 robot.txt 協(xié)議。

    網(wǎng)絡爬蟲的約束

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

    爬蟲實戰(zhàn)

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


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

    網(wǎng)頁分析

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


    抓包分析:


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

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

    具體數(shù)據(jù)包如下:


    分析一下參數(shù):

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

    編寫代碼

    1、初始化參數(shù):

    def __init__(self):self.ua = UserAgent().chromeself.url = 'https://blog.csdn.net/api/WritingRank/weekList?' # ajax 請求網(wǎng)址self.header = {'Referer': 'https://blog.csdn.net/weixin_39190897',"Upgrade-Insecure-Requests": "1",'User-Agent': self.ua}# 配置保存表格的基本self.workbook = Workbook()self.sheet = self.workbook.activeself.sheet.title = 'CSDNTop100信息'self.sheet['A1'] = '排名'self.sheet['B1'] = '用戶名'self.sheet['C1'] = '用戶頭像'self.sheet['D1'] = '用戶博客網(wǎng)址'self.sheet['E1'] = '粉絲數(shù)'self.sheet['F1'] = '點贊數(shù)'self.sheet['G1'] = '上周排名'self.sheet['H1'] = '博客等級'self.sheet['I1'] = '排名時間'def __params(self, offset):self.offset = offset"""構造請求參數(shù)"""self.params = {"username": "weixin_39190897","page": str(self.offset),"size": "10"}

    2、爬取網(wǎng)址:

    def spider(self):"""構造 多頁 爬取"""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_encodingyield r.json()else:print('[info] request error ! the status_code is ' + r.status_code)time.sleep(0.5)

    3、分析json包:

    def parse_json(self, r_json):"""根據(jù)網(wǎng)站請求返回的json包 進行進一步分析"""# 第一層first_data = r_json.get('data')if first_data:# 第二層list_data = first_data.get('list')if list_data: # 判空for i in list_data:rank = i.get("ranking")head_image = i.get('avatar')user_nickname = i.get('user_nickname') # 用戶名username = i.get('username') # 用戶idfans_num = i.get('fans_num') # 粉絲fav_num = i.get('fav_num') # 獲贊last_rank = i.get('last_ranking') # 上周排名leave = i.get('profile_level').get('level') # 博客等級if rank and head_image and user_nickname and user_nickname and username and fans_num \and fav_num and last_rank and leave:# 這里保存數(shù)據(jù) 只是為了方便轉換其他保存格式 僅僅是保存excel中用到列表yield {'rank': rank,'user_nickname': user_nickname,'head_image': head_image,'username': 'https://blog.csdn.net/' + username,'fans_num': fans_num,'fav_num': fav_num,'last_rank': last_rank,'leave': leave}

    4、下載保存excel表格

    def down(self, item):"""保存至excel表格"""now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # 時間leave_list = []for value in item.values():leave_list.append(value)leave_list.append(now_time)self.sheet.append(leave_list)

    5、完整腳本:

    # -*- coding : utf-8 -*- import requests from urllib.parse import urlencode from fake_useragent import UserAgent import time from openpyxl import Workbookclass CSDNSpider(object):"""爬取csdn top 100 的各種信息url = 'https://blog.csdn.net/rank/writing_rank'ajax方式"""def __init__(self):self.ua = UserAgent().chromeself.url = 'https://blog.csdn.net/api/WritingRank/weekList?' # ajax 請求網(wǎng)址self.header = {'Referer': 'https://blog.csdn.net/weixin_39190897',"Upgrade-Insecure-Requests": "1",'User-Agent': self.ua}# 配置保存表格的基本self.workbook = Workbook()self.sheet = self.workbook.activeself.sheet.title = 'CSDNTop100信息'self.sheet['A1'] = '排名'self.sheet['B1'] = '用戶名'self.sheet['C1'] = '用戶頭像'self.sheet['D1'] = '用戶博客網(wǎng)址'self.sheet['E1'] = '粉絲數(shù)'self.sheet['F1'] = '點贊數(shù)'self.sheet['G1'] = '上周排名'self.sheet['H1'] = '博客等級'self.sheet['I1'] = '排名時間'def __params(self, offset):self.offset = offset"""構造請求參數(shù)"""self.params = {"username": "weixin_39190897","page": str(self.offset),"size": "10"}def spider(self):"""構造 多頁 爬取"""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_encodingyield r.json()else:print('[info] request error ! the status_code is ' + r.status_code)time.sleep(0.5)def parse_json(self, r_json):"""根據(jù)網(wǎng)站請求返回的json包 進行進一步分析"""# 第一層first_data = r_json.get('data')if first_data:# 第二層list_data = first_data.get('list')if list_data: # 判空for i in list_data:rank = i.get("ranking")head_image = i.get('avatar')user_nickname = i.get('user_nickname') # 用戶名username = i.get('username') # 用戶idfans_num = i.get('fans_num') # 粉絲fav_num = i.get('fav_num') # 獲贊last_rank = i.get('last_ranking') # 上周排名leave = i.get('profile_level').get('level') # 博客等級if rank and head_image and user_nickname and user_nickname and username and fans_num \and fav_num and last_rank and leave:# 這里保存數(shù)據(jù) 只是為了方便轉換其他保存格式 僅僅是保存excel中用到列表yield {'rank': rank,'user_nickname': user_nickname,'head_image': head_image,'username': 'https://blog.csdn.net/' + username,'fans_num': fans_num,'fav_num': fav_num,'last_rank': last_rank,'leave': leave}def down(self, item):"""保存至excel表格"""now_time = time.strftime('%Y-%m-%d %H:%M:%S', 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):"""調用函數(shù)"""print('The spider is start!')for content in self.spider():for item in self.parse_json(content):self.down(item)self.workbook.save(filename='CSDNTop100.xlsx')self.workbook.close()print('The CSDNTop100 spider is over!')a = CSDNSpider() a.main()

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

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

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

    運行效果

    在Pycharm中運行腳本:


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


    最后就是見證奇跡的時刻,打開瞅瞅:

    反爬技術

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

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

    # 設置請求頭信息 headers = {'Host': 'https://blog.csdn.net','Referer': 'https://blog.csdn.net/weixin_43499626/article/details/85875090','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} response = requests.get("http://www.baidu.com", headers=headers)

    2、通過IP來限制

    當我們用同一個ip多次頻繁訪問服務器時,服務器會檢測到該請求可能是爬蟲操作。因此就不能正常的響應頁面的信息了。解決辦法常用的是使用IP代理池。網(wǎng)上就有很多提供代理的網(wǎng)站。

    proxies = {"http": "http://119.101.125.56","https": "http://119.101.125.1", } response = requests.get("http://www.baidu.com", proxies=random.choices(proxies))

    3、通過前端參數(shù)加密

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

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

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

    總結

    以上是生活随笔為你收集整理的Python爬虫-CSDN博客排行榜数据爬取的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。