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選項卡。

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

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

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

⑤觀察網(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é)果為:


