柚子快報邀請碼778899分享:網(wǎng)絡(luò)爬蟲之Ajax動態(tài)數(shù)據(jù)采集
柚子快報邀請碼778899分享:網(wǎng)絡(luò)爬蟲之Ajax動態(tài)數(shù)據(jù)采集
動態(tài)數(shù)據(jù)采集
規(guī)則
??????? 有時候我們在用 requests 抓取頁面的時候,得到的結(jié)果可能和在瀏覽器中看到的不一樣,在瀏覽器中可以看到正常顯示的頁面教據(jù),但是使用 requests 得到的結(jié)果并沒有,這是因為requests 獲取的都是原始的 HTML 文檔,而瀏覽器中的頁面則是經(jīng)過 JavaScript 處理數(shù)據(jù)后生成的結(jié)果,這些數(shù)據(jù)的來源有多種,可能是通過 Ajax 加載的,可能是包含在 HTML 文檔中的,也可能是經(jīng)過 avaScript 和特定算法計算后生成的。 對于第一種情況,數(shù)據(jù)加載是一種異步加載方式,原始的頁面最初不會包含某些數(shù)據(jù),原始頁面加載完后,會再向服務(wù)器請求某個接口獲取數(shù)據(jù),然后數(shù)據(jù)才被處理從而呈現(xiàn)到網(wǎng)頁上,這其實就是發(fā)送了一個 Ajax 請求。 ????????照 Web 發(fā)展的趨勢來看,這種形式的頁面越來越多。網(wǎng)頁的原始 HTML 文檔不會包含任何數(shù)據(jù),數(shù)據(jù)都是過 Ajax 統(tǒng)一加載后再呈現(xiàn)出來的,這樣在 We 開發(fā)上可以做到前后端分離,而且降低服務(wù)器直接渲染頁面帶來的壓力。 ????????所以如果遇到這樣的頁面,直接利用 requests 等庫來抓取原始頁面,是無法獲取到有效數(shù)據(jù)的,這時需要分析網(wǎng)頁后臺向接口發(fā)送的Ajax 請求,如果可以用 requests 來模擬 Aiax 請求,那么就可以成功抓取了所以,本章我們的主要目的是了解什么是 Ajax 以及如何去分析和抓取 Ajax 請求。
什么是Ajax
????????Ajax,全稱為 Asynchronous JavaScript and XML,即異步的avaScript 和 XML,它不是-門編程語言,而是利用JavaScript在保證頁面不被刷新、頁面鏈接不改變的情況下與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁的技術(shù)。 ??????? 對于傳統(tǒng)的網(wǎng)頁,如果想更新其內(nèi)容,那么必須要刷新整個頁面,但有了 Ajax,便可以在頁面不被全部刷新的情況下更新其內(nèi)容。在這個過程中,頁面實際上是在后臺與服務(wù)器進行了數(shù)據(jù)交互,獲取到數(shù)據(jù)之后,再利用JavaScript 改變網(wǎng)頁,這樣網(wǎng)頁內(nèi)容就會更新了。
手寫Ajax接口
環(huán)境搭建
pip install flask
一個簡單請求過程
通俗地說,路由(Routing)就像是一種地圖,告訴服務(wù)器當用戶訪問一個特定的 URL 地址時該如何響應。在 Web 開發(fā)中,路由是將瀏覽器中的 URL 映射到后端應用程序中的一種功能或代碼塊的機制。
API 是“應用編程接口”(Application Programming Interface)的縮寫。它是一套預定義的規(guī)則和協(xié)議,用于構(gòu)建和集成軟件應用程序。簡單來說,API 是一種使得不同軟件組件之間可以相互溝通的方式。
Web API:通常指的是通過HTTP協(xié)議為Web服務(wù)器和客戶端或者兩個在線服務(wù)之間提供數(shù)據(jù)交換的接口。例如,天氣服務(wù)的API可以允許開發(fā)者獲取天氣預報數(shù)據(jù)。
在Web開發(fā)中,視圖通常指的是用戶請求特定URL時服務(wù)器返回的頁面。例如,在一個Web應用中,服務(wù)器可能會根據(jù)用戶請求的不同路徑(比如/home或/products)來提供不同的HTML內(nèi)容。在Web框架中,視圖還可以是模板,模板中的數(shù)據(jù)會由服務(wù)器動態(tài)填充,然后渲染成最終的HTML發(fā)送給客戶端。
在Web開發(fā)領(lǐng)域,模板特指的是用于動態(tài)生成HTML頁面的預設(shè)文件。這些模板文件包含了靜態(tài)的HTML標記,以及用于插入動態(tài)內(nèi)容的特殊模板標簽或占位符。當服務(wù)器接收到一個請求時,它會結(jié)合模板和相關(guān)的數(shù)據(jù)來生成最終的HTML頁面,然后發(fā)送給客戶端。
例如,在Python的Flask框架中,模板可能會使用Jinja2模板引擎編寫:
Hello, {{ name }}!
在上面的例子中,{{ title }} 和 {{ name }} 是模板變量,它們在渲染過程中會被實際的值所替換。
編寫網(wǎng)絡(luò)爬蟲爬取蛋卷基金信息并存儲
import requests
import pymysql
# 創(chuàng)建數(shù)據(jù)庫連接
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306)
cursor = db.cursor()
cursor.execute('use spiders')
def get_data():
url = 'https://danjuanfunds.com/djapi/fund/growth/011102?day=1m'
headers = {
'User-Agent':'111222333444'
}
resp = requests.get(url, headers=headers).json()
data = resp.get('data')['fund_nav_growth']
for item in data:
date = item.get('date') # 如果沒有就返回 None
value = item.get('value')
than_value = item.get('than_value')
print('日期:', date, '\n', '本產(chǎn)品:', value, '滬深:', than_value)
# 保存數(shù)據(jù)到數(shù)據(jù)庫
save_data(date, value, than_value)
def save_data(date, value, than_value):
sql = 'INSERT INTO funds(date, value, than_value) VALUES(%s, %s, %s)'
cursor.execute(sql, (date, value, than_value))
db.commit() # 提交事務(wù)
# 獲取并保存數(shù)據(jù)
get_data()
# 關(guān)閉光標和數(shù)據(jù)庫連接
cursor.close()
db.close()
編寫網(wǎng)絡(luò)爬蟲爬取虎牙信息并存儲
import requests,pymysql
def conn_mysql():
db = pymysql.connect(host='localhost',user='root',password='123456',database='spiders')
cursor = db.cursor()
return cursor,db
def get_date(url):
resp = requests.get(url).json()
dates = []
try:
date = resp.get('vList')
for item in date:
indurce = item.get('sIntroduction')
author = item.get('sNick')
home_numb = item.get('sGameHostName')
# print('主播名:',author,'簡介:',indurce,'房間號:',home_numb)
dates.append([author,indurce,home_numb])
save_date(dates)
except Exception as e:
print(e)
def save_date(data):
cursor, db = conn_mysql()
cursor.execute('use spiders')
sql = 'insert into huya(author,indurce,home_numb) values(%s,%s,%s)'
for d in data:
print(d)
try:
cursor.execute(sql,(d[0],d[1],d[2]))
db.commit()
except Exception as e:
print(e)
db.rollback()
urls = []
for i in range(1,127):
url = 'https://live.huya.com/liveHttpUI/getLiveList?iGid=0&iPageNo={}&iPageSize=120'.format(i)
if url not in urls:
urls.append(url)
for url in urls:
print(i)
get_date(url)
柚子快報邀請碼778899分享:網(wǎng)絡(luò)爬蟲之Ajax動態(tài)數(shù)據(jù)采集
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。