二十四. 異步加載

1. 異步加載技術(shù)(AJAX)

異步加載技術(shù)是一種創(chuàng)建交互式網(wǎng)頁應用的網(wǎng)頁開發(fā)技術(shù),異步JaaScript和XML。使用這個技術(shù),可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新。

  • 判斷網(wǎng)頁是否采用異步加載技術(shù)實現(xiàn)下滑分頁:
    ① 通過下滑瀏覽網(wǎng)頁,如果發(fā)現(xiàn)網(wǎng)頁沒有分頁信息,而是一直瀏覽下去,但網(wǎng)址一直沒變化。此時可認為網(wǎng)站采用了異步加載技術(shù)。
    ② 通過查看加載的數(shù)據(jù)是否在網(wǎng)頁源代碼中出現(xiàn)來進行判斷。如果新加載的數(shù)據(jù)在網(wǎng)頁源代碼中沒有查找到,可以認為采用了異步加載技術(shù)。

  • 通過Ajax技術(shù)除了可以實現(xiàn)下滑分頁,還可以使用Ajax技術(shù)加載網(wǎng)頁信息,例如簡書網(wǎng)中的評論信息:
    **正文信息很容易抓取:

    image.png

    **評論信息如果還是按照原來網(wǎng)址http://www.itdecent.cn/p/db6f9a7e1814來進行請求,是抓取不到的:
    image.png

抓取錯誤示例:

import requests
from bs4 import BeautifulSoup
url = 'http://www.itdecent.cn/p/db6f9a7e1814'
r = requests.get(url)
print(r.status_code)

soup = BeautifulSoup(r.text,"lxml")
infos = soup.select("div.comment-wrap")
print(infos)

##結(jié)果為:[]

2. 逆向工程:

想要抓取上述異步加載的網(wǎng)頁數(shù)據(jù),需要了解網(wǎng)頁進行加載這些數(shù)據(jù)的,這個過程叫做逆向工程。
在Chrome瀏覽器的Network選項卡中可以查看加載過程中的所有文件信息,通過對這些文件的查看和篩選,可找出需爬取數(shù)據(jù)所在的文件,以此來設計獲取爬蟲信息。
因此,逆向工程俗稱為“抓包”。

簡單例子如下:
目標網(wǎng)址:https://www.pexels.com/
①打開網(wǎng)頁,使用F12或右鍵點擊“檢查”功能進入開發(fā)者工具選項。選擇Network選項卡。

image.png

②由于大多數(shù)分頁文件位于XHR中,選中XHR選項,并通過鼠標下滑瀏覽網(wǎng)頁,會發(fā)現(xiàn)Network選項卡中加載了一些文件信息。(XHR為可擴展超文本傳輸請求)


image.png

③打開第一個加載文件,可以看到請求的URL:


image.png

④嘗試將URL的部分字符串縮短,可發(fā)現(xiàn)使用下述網(wǎng)址即可正常打開網(wǎng)頁:https://www.pexels.com/?page=2

image.png

⑤觀察網(wǎng)頁分頁規(guī)律,即可發(fā)現(xiàn)請求的URL僅該表了page后面的數(shù)字。利用此規(guī)律可以爬取大量圖片。與前面的“十五. API實戰(zhàn) - 調(diào)用有道智云API爬取pexels圖片”有些區(qū)別,代碼如下:

import requests
from bs4 import BeautifulSoup

def get_image(url):
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3294.6 Safari/537.36'}
    r = requests.get(url,headers = headers)
    print(r.status_code)
    soup = BeautifulSoup(r.text,"lxml")

    infos = soup.select("img.photo-item__img")
    download_list = []
    for info in infos:
        image_url = info.get('src')
        download_list.append(image_url)
    for item in download_list:
        res = requests.get(item,headers = headers)
        file_name = item.split("?")[0][-10:].strip("-")
        with open("F://Pixels/"+file_name,'wb') as f:
            f.write(res.content)
        print(file_name)
    

if __name__ == "__main__":
    url_list = ["https://www.pexels.com/?page={}".format(i) for i in range(1,11)]
    for url in url_list:
        get_image(url)
    print("Finished!")

這樣就通過抓包實現(xiàn)了對下滑分頁的網(wǎng)址進行了數(shù)據(jù)抓取。
爬取圖片結(jié)果為:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容