二十四. 异步加载

1. 异步加载技术(AJAX)

异步加载技术是一种创建交互式网页应用的网页开发技术,异步JaaScript和XML。使用这个技术,可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

  • 判断网页是否采用异步加载技术实现下滑分页:
    ① 通过下滑浏览网页,如果发现网页没有分页信息,而是一直浏览下去,但网址一直没变化。此时可认为网站采用了异步加载技术。
    ② 通过查看加载的数据是否在网页源代码中出现来进行判断。如果新加载的数据在网页源代码中没有查找到,可以认为采用了异步加载技术。

  • 通过Ajax技术除了可以实现下滑分页,还可以使用Ajax技术加载网页信息,例如网中的评论信息:
    **正文信息很容易抓取:

    二十四. 异步加载_第1张图片
    image.png

    **评论信息如果还是按照原来网址https://www.jianshu.com/p/db6f9a7e1814来进行请求,是抓取不到的:
    二十四. 异步加载_第2张图片
    image.png

抓取错误示例:

import requests
from bs4 import BeautifulSoup
url = 'https://www.jianshu.com/p/db6f9a7e1814'
r = requests.get(url)
print(r.status_code)

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

##结果为:[]

2. 逆向工程:

想要抓取上述异步加载的网页数据,需要了解网页进行加载这些数据的,这个过程叫做逆向工程。
在Chrome浏览器的Network选项卡中可以查看加载过程中的所有文件信息,通过对这些文件的查看和筛选,可找出需爬取数据所在的文件,以此来设计获取爬虫信息。
因此,逆向工程俗称为“抓包”。

简单例子如下:
目标网址:https://www.pexels.com/
①打开网页,使用F12或右键点击“检查”功能进入开发者工具选项。选择Network选项卡。

二十四. 异步加载_第3张图片
image.png

②由于大多数分页文件位于XHR中,选中XHR选项,并通过鼠标下滑浏览网页,会发现Network选项卡中加载了一些文件信息。(XHR为可扩展超文本传输请求)


二十四. 异步加载_第4张图片
image.png

③打开第一个加载文件,可以看到请求的URL:


二十四. 异步加载_第5张图片
image.png

④尝试将URL的部分字符串缩短,可发现使用下述网址即可正常打开网页:https://www.pexels.com/?page=2

image.png

⑤观察网页分页规律,即可发现请求的URL仅该表了page后面的数字。利用此规律可以爬取大量图片。与前面的“十五. API实战 - 调用有道智云API爬取pexels图片”有些区别,代码如下:

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!")

这样就通过抓包实现了对下滑分页的网址进行了数据抓取。
爬取图片结果为:


二十四. 异步加载_第6张图片
image.png

你可能感兴趣的:(二十四. 异步加载)