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

歡迎訪問 生活随笔!

生活随笔

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

python

Python爬取动态数据

發(fā)布時間:2024/3/12 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬取动态数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

項目場景:

在做一個校園新聞小程序的時候,不僅需要獲得新聞內(nèi)容,同時還要獲取點擊量來排序。爬取靜態(tài)的數(shù)據(jù)很簡單,爬取動態(tài)的數(shù)據(jù)就有一點麻煩了。


問題描述

比如說我們在爬取這個網(wǎng)頁的時候

打開開發(fā)者工具可以看到點擊量

但是我們爬取來的內(nèi)容確是這個樣子的

點擊量為什么會不顯示呢?


原因分析:

我的理解是這樣子的,因為點擊量是隨著網(wǎng)頁的刷新要不斷地改變的,而新聞內(nèi)容是固定不變的。所以說點擊量會由一個函數(shù)去不斷更新,因此靜態(tài)的網(wǎng)頁內(nèi)容不顯示這個數(shù)據(jù)也在情理之中了。


解決方案:

要獲取這樣的數(shù)據(jù),首先得找到這個數(shù)據(jù)。幸運地是,點擊量這個數(shù)據(jù)比較的獨一無二,是一個數(shù)字。當然你不能直接打開開發(fā)者工具就在在”元素“中檢索,要找到產(chǎn)生這個數(shù)字的源頭,這種動態(tài)數(shù)據(jù)一般會在“網(wǎng)絡(luò)”中的XHR或者JS文件中找到,比如這樣(記得刷新一下再找!)

在這一個亂七八糟的返回里面,我們要的點擊量就在最后的幾個click中。當然它現(xiàn)在不再是那個781了,但沒有關(guān)系,我們很輕松地找到了它(大多數(shù)情況不是這樣,但readClick這幾個字實在是太顯眼了!)
預(yù)覽就是我們發(fā)送請求獲得的數(shù)據(jù),而點擊量就放在這個數(shù)據(jù)的最后。那么我們現(xiàn)在只需要發(fā)送請求獲得這個數(shù)據(jù),再用正則表達式提取出點擊量803就行了

然后是請求的參數(shù),這個參數(shù)有時候會在標頭的最下面,但是這里并沒有,其實負載就是這次請求的參數(shù)。

我們來分析一下參數(shù)。如果你只想獲得這一個網(wǎng)頁的動態(tài)數(shù)據(jù),那么直接照抄就行了。

from sqlite3 import Date import requests import random, time, sysheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36 Edg/100.0.1185.29' } params = {'callCount':'1','nextReverseAjaxIndex':'0','c0-scriptName':'Ajax','c0-methodName':'readClick','c0-id':'0','c0-param0':'string:1649408845878','batchId':'0','instanceId':'0','page':'%2Fcolumn%2Fh_26_yi%2Fcontent%2F1649408845878.shtml','scriptSessionId':'5eSlySH4R9SBWHfCeP6lNqg1u0JcgKn5m1o/mvq5m1o-GDTnJP$nz' }res = requests.post('https://news.hutb.edu.cn/dwr/call/plaincall/Ajax.readClick.dwr', headers=headers, params=params) print(res.text)


我們來分析一下這些參數(shù)。c0-param0與page在不同的新聞是有區(qū)別的,區(qū)別就在于他們是第幾條新聞,參數(shù)就要怎么寫,比如這條新聞網(wǎng)址是https://news.hutb.edu.cn/column/h_26_yi/content/1649408845878.shtml,那么最后的169408845878就是這兩個參數(shù)的實參(可能這個數(shù)字也不是新聞 的條數(shù),畢竟太大了!)
然后就是scriptSessionId,這個參數(shù)我在比較不同的新聞頁時發(fā)現(xiàn)他們在’/‘之前的字符是相同的,不同的是’/‘后面的字符,于是我搜索了這個參數(shù)

我們來搜索一下’/'后面的參數(shù)

很明顯這個參數(shù)是由當前時間與一個隨機數(shù)決定的,而tokenify我認為是一個編碼的函數(shù),既然與隨機數(shù)有關(guān),那么我在傳參時是不是可以忽略這個參數(shù),隨便寫一個值呢,我們試一下:

結(jié)果是這樣子

因此在爬取網(wǎng)頁動態(tài)數(shù)據(jù)的時候,首先是找到這個值(因為有搜索選項,大部分時候都很容易找),然后就是參數(shù),或者說負載的問題了。如果你要爬取多個頁面的動態(tài)數(shù)據(jù),那么將這些參數(shù)的意義,或者說他們的特征弄清楚則是很重要的,這樣才能傳正確的參數(shù)獲得自己想要的數(shù)據(jù)。

總結(jié)

以上是生活随笔為你收集整理的Python爬取动态数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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