爬虫实战项目一:对彼岸图网4K图片爬取

地址:彼岸图网

第一、同步爬取第一页的图片并进行存储

代码分析:缺点:请求和数据持久化全部都是同步,耗费大量时间,如下:

仅仅只爬取了20张图片,就花费了35秒多时间,如果想实现分页爬取,不久gogo了。

同步爬取第一页图片并存储

第二、异步非阻塞方式爬取第一页的图片并进行存储

和同步相比是非常快的。引入新的第三方库:aiohttp

Python3.4引入的一个标准库,直接内置了对异步IO的支持。asyncio模块提供了使用协程构建并发应用的工具。

此处就不做具体详解了。

import aiohttp
import requests
from lxml import etree
import time
import asyncio

headers = {
    'User-Agent': "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Mobile Safari/537.36",
}

# 定义异步函数
async def get_img(img_name, img_detail_url):
    res = requests.get(img_detail_url, headers).text
    img_url = 'http://pic.netbian.com/' + etree.HTML(res).xpath('//div[@class="photo-pic"]/a/img/@src')[0]
    path = 'D:\imgs\netbian_async\' + img_name + img_url[-4::]

    # 异步发起请求,并保存数据
    async with aiohttp.ClientSession() as session:
        async with await session.get(url=img_url, headers=headers) as response:
            img_data = await response.read()
            with open(path, "wb") as fp:
                fp.write(img_data)
                print(f"{img_name}, 下载成功!!!")


if __name__ == "__main__":
    # 1.发起请求
    url = 'http://pic.netbian.com/4kdongman/'
    response = requests.get(url, headers=headers)
    response.encoding = 'gbk'
    html = etree.HTML(response.text)
    img_li = html.xpath('//ul[@class="clearfix"]/li')
    start_time = time.time()
    async_list = []
    for li in img_li:
        img_name = li.xpath('./a/b/text()')[0]
        img_detail_url = 'http://pic.netbian.com' + li.xpath('./a/@href')[0]
        print(img_name + "--" + img_detail_url)
        # 异步对象放入列表
        async_list.append(get_img(img_name, img_detail_url))
    asyncio.run(asyncio.wait(async_list))
    end_time = time.time()
    print(end_time-start_time)
异步爬取第一页图片并存储

第三、异步非阻塞方式分页爬取图片并进行存储

 后面补充

原文地址:https://www.cnblogs.com/854594834-YT/p/13929607.html