美文网首页Python爬虫
二十四. 异步加载

二十四. 异步加载

作者: 橄榄的世界 | 来源:发表于2018-02-24 15:13 被阅读0次

1. 异步加载技术(AJAX)

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

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

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

    image.png
    **评论信息如果还是按照原来网址https://www.jianshu.com/p/db6f9a7e1814来进行请求,是抓取不到的:
    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选项卡。

image.png

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


image.png

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


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

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


image.png

相关文章

  • 二十四. 异步加载

    1. 异步加载技术(AJAX) 异步加载技术是一种创建交互式网页应用的网页开发技术,异步JaaScript和XML...

  • NSOperation做图片异步下载

    图片的异步加载 SDWebImage的使用 图片的异步加载封装

  • 页面性能

    资源压缩合并,减少http请求 非核心代码异步加载 --->异步加载的方法--->异步加载的区别 利用浏览器缓存-...

  • 跟诸子学游戏 unity3d中的线程

    1:异步加载场景依旧出现卡顿 :使用异步方式来加载场景,加载过程中的动画和场景还是会出现卡顿? 调用异步加载场景...

  • 爬取网页中的动态数据

    每一次异步加载都会在netwo中加载一项,异步加载和普通的加载方式一样,普通的加载方式是点击下一页,异步加载是在向...

  • H5 资源异步加载策略

    1、async & defer 区别async异步加载脚本,加载完立马执行defer异步加载脚本,并在DOMCon...

  • 2021-07-14【unity】Addressble bund

    1.同步加载一个: 2.同步加载多个: 3.异步加载一个: 4.异步加载:

  • 提升页面性能

    提升页面性能的方法有哪些? 资源压缩合并,减少HTTP请求 非核心代码异步加载——异步加载的方式——异步加载的区别...

  • Python实战视频1.4 如何获取网页中的动态数据(爬取Kne

    目的:使用爬虫抓取网站异步加载数据 part1:什么是异步加载? 异步加载即网页上没有页码跳转按钮,鼠标往下滚即可...

  • AMD

    AMD, Asynchronous Module Definition,即异步模块加载机制,它采用异步方式加载模块...

网友评论

    本文标题:二十四. 异步加载

    本文链接:https://www.haomeiwen.com/subject/nakqxftx.html