999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于數據接口的Ajax頁面數據采集技術

2024-05-19 14:36:42盧明俊盧守東
電腦知識與技術 2024年7期
關鍵詞:數據采集

盧明俊 盧守東

摘要:互聯網中的許多網站均已采用了Ajax技術,相應的Ajax頁面中的數據是通過異步加載的方式予以呈現的,并未包含在頁面源代碼中,因此難以對其進行采集。針對此問題,介紹一種基于數據接口的Ajax頁面數據采集技術,并通過具體的實例說明其編程模式。

關鍵詞:數據采集;Ajax;數據接口;Python

中圖分類號:TP311? ? ? 文獻標識碼:A

文章編號:1009-3044(2024)07-0046-03

開放科學(資源服務)標識碼(OSID)

0 引言

如今已進入大數據時代,對于各類大量數據的需求日趨緊迫,網絡爬蟲的應用也日益廣泛。眾所周知,網絡爬蟲的主要功能就是按照一定的規則從互聯網中有關網站的相關頁面中自動采集所需要的數據[1],其設計要點在于獲取并解析頁面的源代碼。顯然,這就要求頁面源代碼中必須包含相應的數據。然而,目前許多網站均已采用了Ajax技術,相應的Ajax頁面中的數據是通過異步加載的方式予以呈現的,并未包含在頁面源代碼中,從而為其數據的采集帶來了極大的困難。在此,將以Windows 7+Python 3.8.18為開發環境,介紹一種基于數據接口的Ajax頁面數據采集技術,供大家參考。

1 Ajax簡介

Ajax即異步JavaScript和XML(Asynchronous JavaScript and XML) ,是一種創建交互式網頁應用的開發技術,可在不刷新整個頁面的情況下實現頁面的局部更新。Ajax是HTML/XHTML、CSS、DOM、XML、XMLHttpRequest與JavaScript等多種相關技術的融合,其關鍵之處在于使用XMLHttpRequest對象發送異步請求,待服務器返回響應后再自動進行后續處理(如更新頁面等)[2]。

XMLHttpRequest對象具有open()、setRequestHeader()、send()等方法。其中,open()方法用于以GET或POST方式創建請求,setRequestHeader()方法用于設置標頭,send()方法用于發送請求(對于POST方式的請求,必要時還可指定相應的參數)。

XMLHttpRequest對象具有readyState、status、responseText、responseXML、onreadystatechange、onload等屬性。其中,readyState屬性用于獲知對象的狀態(其中4表示請求已完成),status屬性用于獲知返回的HTTP狀態碼(其中200表示請求成功),responseText與responseXML屬性用于獲取服務器的響應(前者為字符串形式,后者為XML形式),onreadystatechange屬性用于指定對象狀態改變時所調用的函數,onload屬性用于指定響應已就緒時所調用的函數。

對于Ajax頁面來說,一旦發生某個事件,便通過頁面中的JavaScript腳本創建XMLHttpRequest對象,并利用該對象發送相應的異步請求,同時在服務器返回響應后再通過該對象指定的函數進行處理,最終將有關數據更新至當前頁面中。

除了原生的JavaScript方式外,Ajax功能還可能通過jQuery、DWR等有關框架實現,其基本原理是一樣[3]。

2 Ajax頁面數據采集的基本方案

基于Ajax技術的特點,Ajax頁面數據采集的基本方案如下:

1) 對Ajax頁面進行分析,確定與所要采集的數據相對應的數據接口,即相應異步請求的請求方法(GET或POST) 、URL、參數及其規律,以及服務器返回的響應數據的格式。

2) 按照數據接口的規范,構造并發送相應的請求,獲取返回的響應數據。

3) 對返回的響應數據進行解析,最終獲取所要采集的具體數據。

3 Ajax頁面數據采集的關鍵技術

3.1 Ajax頁面數據接口的分析

目前,Chrome、360等瀏覽器均帶有相應的開發者或開發人員工具,可用于對Ajax頁面的數據接口進行分析。以Chrome瀏覽器為例,先打開其開發者工具,單擊Network選項卡及其中的Fetch/XHR選項卡,然后再打開相應的Ajax頁面并進行有關操作,即可查看到相應的異步請求(其Type為xhr) 。單擊某個異步請求,即可通過右側的Headers選項卡查看其詳細信息,包括URL、請求方法(Request Method) 、請求標頭(Request Headers) 與響應標頭(Response Headers) 等。此外,通過Payload選項卡可查看到有關的參數,通過Preview選項卡可查看到經過解析的響應內容,通過Response選項卡可查看到真實的響應數據。

3.2 請求的發送與響應的獲取

在Python中,為發送HTTP請求并獲取其響應,可使用urllib或requests模塊[4]。其中,urllib為內置模塊,無須安裝即可直接使用。而requests為第三方模塊,須另行安裝(可使用“pip install requests”命令)。其實,二者的功能與用法基本一致,但后者更加便捷。

以requests模塊為例,如須發送GET請求或POST請求,可調用其get()或post()方法,基本格式為:

requests.get(url, params, args)

requests.post(url, data, json, args)

其中,URL用于指定請求的URL,params與data用于指定需要傳遞的有關參數,JSON用于指定需要傳遞的JSON數據,args則為headers、cookies、verify等其他參數。對于GET請求,也可將有關參數按照規定的格式直接附加在URL之后。

調用get()或post()方法發送請求后,將返回一個響應對象。通過訪問該對象的text或content屬性,即可獲取相應的響應內容(前者為字符串形式,主要用于獲取文本、網頁源代碼類的數據;后者為二進制形式,主要用于獲取圖片、音頻視頻類的數據)。此外,必要時可訪問該對象的status_code屬性以獲取返回的HTTP狀態碼。例如:

import requests

url="http://www.baidu.com"

r=requests.get(url)

print(r.status_code)

print(r.text)

在此,調用requests.get()方法發送了一個URL為http://www.baidu.com的GET請求,并通過返回的響應對象r的status_code與text屬性獲取相應的HTTP狀態碼與響應內容,然后加以輸出。

3.3 響應數據的解析

對于獲取到的響應數據,應根據其類型與特點,利用相應的解析庫(如re、lxml、BeautifulSoup、JSON等)或技術進行處理,從中解析出所要采集的最終數據。

目前,對于Ajax請求來說,其返回的響應多為JSON數據。對于JSON數據,可直接利用JSON庫進行解析。JSON庫是Python的內置庫,無須額外安裝[5]。通過調用JSON庫的loads()方法,即可將JSON字符串轉換為一個字典類型的Python對象。該方法的基本格式為:

json.loads(s)

其中,參數s用于指定需要轉換的JSON字符串。例如:

import json

person='{"name":"小明","sex":"男","age":18}'

pdict=json.loads(person)

print(pdict["name"],pdict["sex"],pdict["age"])

在此,person變量的值為包含一個人員姓名、性別與年齡信息的JSON字符串,通過調用json.loads()方法將其轉換為字典pdict后,即可方便地獲取并輸出該人員的有關信息。

其實,requests模塊內置有一個JSON解碼器,也可用于將請求返回的JSON數據轉換為Python字典。為此,只須直接調用請求返回的響應對象的json()方法即可。

4 Ajax頁面數據采集的具體實例

央視網微博主頁(https://www.weibo.com/u/3266943013) 是一個典型的Ajax頁面,如圖1所示。在瀏覽器中打開該主頁,并使用開發者工具進行分析,可知其中的微博數據是通過URL為https://www.weibo.com/ajax/statuses/mymblog的一系列異步GET請求以分頁的方式(每頁10條)返回的,其參數共有4個,分別為uid、feature、page與since_id。其中,uid與feature是固定不變的,分別為3266943013(央視網微博的id) 與0;而page與since_id則是會按規律改變的,前者表示頁碼(1、2、3等),后者也用于實現分頁(對于第1頁,則無須指定或讓其值為空)。這些請求返回的響應均為JSON字符串,其data鍵的值即為相應的具體數據。其中,since_id鍵的值即為下一頁請求中since_id參數的值,list鍵的值則為微博數組。在該數組中,一個元素即為一條微博的數據。其中,created_at、reposts_count、comments_count、attitudes_count與text_raw鍵的值分為微博的發布時間、轉發數、評論數、點贊數與標題文本。此外,isLongText鍵的值為true或false,用于表示標題文本是否為長文本;mblogid鍵的值則為微博的一個唯一id值。

若微博的標題文本為長文本(即內容較多),則在瀏覽器中只會顯示其前面的部分內容,同時在末尾顯示一個“展開”鏈接。單擊此鏈接,方可顯示完整的標題文本。實際上,在單擊“展開”鏈接時,將觸發一個URL為https://www.weibo.com/ajax/statuses/longtext的異步GET請求,其參數為id,參數值則為相應微博的mblogid值。該請求返回的響應亦為JSON字符串,其data鍵的值即為相應的具體數據。其中,longTextContent鍵的值即為微博的完整標題文本。

根據以上分析結果,即可編程實現央視網微博數據的采集,代碼如下:

import requests

import json

import time

useragent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ 109.0.0.0 Safari/537.36"

cookie="......"? #在此應指定真正的cookie值

headers={"user-agent":useragent,"cookie":cookie}

url="https://www.weibo.com/ajax/statuses/mymblog"

uid="3266943013"

params={"uid":uid,"feature":0}

since_id=""

for i in range(5):

page=i+1

print("第"+str(page)+"頁")

params["page"]=page

if page>=1:

params["since_id"]=since_id

r=requests.get(url,params=params,headers=headers)

j=json.loads(r.text)

d=j["data"]

since_id=d["since_id"]

list=d["list"]

for l in list:

created_at=l["created_at"]

reposts_count=l["reposts_count"]

comments_count=l["comments_count"]

attitudes_count=l["attitudes_count"]

title_text=l["text_raw"]

isLongText=l["isLongText"]

mblogid=l["mblogid"]

if isLongText:

url0="https://www.weibo.com/ajax/statuses/longtext"

params0={"id":mblogid}

r0=requests.get(url0, params=params0,headers=headers)

j0=json.loads(r0.text)

d0=j0["data"]

title_text=d0["longTextContent"]

with open("央視網微博.txt","a",encoding="utf8") as f:

s=created_at+"||"+str(reposts_count)+"||"+str(comments_count)

s+="||"+str(attitudes_count)+"||"+title_text+"\n"

f.write(s)

time.sleep(5)

print("OK!")

運行該程序,所采集到的共5頁的央視網微博的有關數據將以“||”為分隔添加到文本文件“央視網微博.txt”中,如圖2所示。

5 結束語

Ajax頁面的實現方式千差萬別,且其源代碼中并沒有通過異步請求返回并經JavaScript動態渲染至頁面中的數據。因此,相對于常規頁面來說,Ajax頁面數據的采集無疑是較為困難的。不過,基于Ajax的基本原理,只要分析清楚并與所要采集的數據相對應的數據接口,即可通過模擬發送有關請求并獲取其響應數據的方式,最終采集到所需要的具體數據。

參考文獻:

[1] 盧守東,盧明俊.基于Selenium的網站自動登錄技術[J].電腦知識與技術,2023,19(34):48-51.

[2] 盧守東.Java EE應用開發案例教程[M].北京:清華大學出版社,2017.

[3] 盧守東.jQuery程序設計實例教程[M].北京:清華大學出版社,2021.

[4] 夏敏捷.Python爬蟲超詳細實戰攻略[M].北京:清華大學出版社,2021.

[5] Python | import json模塊詳解[EB/OL].[2023-01-26].https://www.cnblogs.com/zhangxuegold/p/17497618.html.

【通聯編輯:謝媛媛】

猜你喜歡
數據采集
CS5463在植栽用電子鎮流器老化監控系統中的應用
大數據時代高校數據管理的思考
科技視界(2016年18期)2016-11-03 22:51:40
鐵路客流時空分布研究綜述
基于廣播模式的數據實時采集與處理系統
軟件工程(2016年8期)2016-10-25 15:54:18
通用Web表單數據采集系統的設計與實現
軟件工程(2016年8期)2016-10-25 15:52:53
基于開源系統的綜合業務數據采集系統的開發研究
主站蜘蛛池模板: 亚洲aaa视频| 99青青青精品视频在线| 丁香五月激情图片| 欧美日韩国产在线播放| 国产在线观看91精品亚瑟| 日本a级免费| 成年片色大黄全免费网站久久| 日日噜噜夜夜狠狠视频| 国产精品手机在线播放| 欧美视频在线不卡| 91视频国产高清| 欧美人与牲动交a欧美精品| 国产v精品成人免费视频71pao| 久久九九热视频| 手机看片1024久久精品你懂的| 国产精品露脸视频| 99久久这里只精品麻豆| 国产精品吹潮在线观看中文| 国产亚洲精品资源在线26u| 国产一区二区精品福利| 99视频有精品视频免费观看| 色噜噜中文网| a欧美在线| 曰AV在线无码| 91麻豆精品视频| 国产小视频免费观看| 91成人在线观看| 国产亚洲成AⅤ人片在线观看| 国产一在线观看| 夜色爽爽影院18禁妓女影院| 视频一区亚洲| 在线观看av永久| 亚洲国产中文精品va在线播放| 国产精品欧美激情| 亚洲bt欧美bt精品| 亚洲精品国产日韩无码AV永久免费网 | 国产精品无码AV中文| 亚洲人成影视在线观看| 三上悠亚精品二区在线观看| 中文字幕乱码中文乱码51精品| jizz亚洲高清在线观看| 91精品最新国内在线播放| 亚洲精品福利网站| 亚洲国产成人精品青青草原| 成年人福利视频| 丁香亚洲综合五月天婷婷| 狠狠色成人综合首页| 成人va亚洲va欧美天堂| 毛片卡一卡二| 日本伊人色综合网| 人妻一区二区三区无码精品一区| 99re这里只有国产中文精品国产精品| 国产欧美中文字幕| 中文字幕永久视频| 亚洲国内精品自在自线官| 亚洲成人77777| 久久国产精品麻豆系列| 美女国内精品自产拍在线播放| 亚洲成人动漫在线| 亚洲欧洲日韩国产综合在线二区| 波多野结衣二区| av在线人妻熟妇| 亚洲人成网站观看在线观看| 国产在线麻豆波多野结衣| 国产在线拍偷自揄拍精品| 秋霞一区二区三区| 亚洲精品视频在线观看视频| 国产精品永久不卡免费视频| 婷婷伊人久久| 欧美三级自拍| 四虎精品国产AV二区| 丰满少妇αⅴ无码区| 国产成人精品一区二区秒拍1o| 色亚洲成人| 精品国产美女福到在线不卡f| 中文字幕 91| 国产无码性爱一区二区三区| 久久精品人妻中文视频| 久久窝窝国产精品午夜看片| 国产精品第5页| 国产一区二区三区在线观看视频| 亚洲天堂日韩在线|