首页 > 其他分享 >批量爬取百度图片(异步+网络请求解析)

批量爬取百度图片(异步+网络请求解析)

时间:2024-01-08 14:05:11浏览次数:29  
标签:album 异步 请求 批量 baidu 爬取 href com 图片


 

4、分析百度图片搜索返回结果的HTML代码,或找一图片网站
,编写爬虫抓取图片并下载形成专题图片。

#########分析#########
    # 使用网络工具查看百度图片的组成,我们可以发现他的分类中的模块是
    # 通过一个a标签包揽的,这就表明,我们可以设置两层循环(由于此时下载的东西会比较多,所以采用异步爬取)
        #1.1层循环获取分类的a链接href
        #2.2层循环获取分类a链接对应网页中图片的src 仔细查看看到他的HTML是通过js渲染上去的。
        #可以查看源码渲染情况 或者使用自动化工具直接进行测试
#但是此时我们会发现,图片的加载使用的ajax请求,所以我们需要看一下网络请求的参数设置
# 简单的查看后我们发现在Fetch/XHR请求类型中 有相关的请求数据
    #请求网址: https://image.baidu.com/search/albumsdetail
    #乱字符主要是汉字解析的问题
    #显示网址:https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=城市建筑摄影专题&fr=searchindex_album &album_tab=建筑&album_id=7&rn=30
    #请求类型get 但是此时我们可以发现他的链接后面是存在参数的
# 参数
    # pn: 30
    # rn: 30
    # tn: albumsdetail
    # word: 城市建筑摄影专题
    # album_tab: 建筑
    # album_id: 7
    # ic: 0
    # curPageNum: 1
    #按道理这种请求应该是 post 但是他确实写的是get ,所以这里涉及一个拼接的url 
#返回类型
    #是一个json数据
    #重要组成 在数据thumbnailUrl中有链接
        #https://t7.baidu.com/it/u=3248413060,1409880777&fm=193&f=GIF
        #使用浏览器发现是可以访问的,证明我们已经成功找到这些图片了
# 由于写入文件是一个i/o类型的阻塞所以也采用异步
 

# 4、分析百度图片搜索返回结果的HTML代码,或找一图片网站
# ,编写爬虫抓取图片并下载形成专题图片。

#########分析#########
    # 使用网络工具查看百度图片的组成,我们可以发现他的分类中的模块是
    # 通过一个a标签包揽的,这就表明,我们可以设置两层循环(由于此时下载的东西会比较多,所以采用异步爬取)
        #1.1层循环获取分类的a链接href
        #2.2层循环获取分类a链接对应网页中图片的src 仔细查看看到他的HTML是通过js渲染上去的。
        #可以查看源码渲染情况 或者使用自动化工具直接进行测试
#但是此时我们会发现,图片的加载使用的ajax请求,所以我们需要看一下网络请求的参数设置
# 简单的查看后我们发现在Fetch/XHR请求类型中 有相关的请求数据
    #请求网址: https://image.baidu.com/search/albumsdetail
    #乱字符主要是汉字解析的问题
    #显示网址:https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%E5%9F%8E%E5%B8%82%E5%BB%BA%E7%AD%91%E6%91%84%E5%BD%B1%E4%B8%93%E9%A2%98&fr=searchindex_album%20&album_tab=%E5%BB%BA%E7%AD%91&album_id=7&rn=30
    #请求类型get 但是此时我们可以发现他的链接后面是存在参数的
# 参数
    # pn: 30
    # rn: 30
    # tn: albumsdetail
    # word: 城市建筑摄影专题
    # album_tab: 建筑
    # album_id: 7
    # ic: 0
    # curPageNum: 1
    #按道理这种请求应该是 post 但是他确实写的是get ,所以这里涉及一个拼接的url 
#返回类型
    #是一个json数据
    #重要组成 在数据thumbnailUrl中有链接
        #https://t7.baidu.com/it/u=3248413060,1409880777&fm=193&f=GIF
        #使用浏览器发现是可以访问的,证明我们已经成功找到这些图片了
# 由于写入文件是一个i/o类型的阻塞所以也采用异步

#####首次爬取请求我们发现他的参数不一样 存在时间验证 返回的有点不对
#https://image.baidu.com/user/logininfo?src=pc&page=searchresult&time=1701087841568
#后续刷新时才使用拼接 

#########实操#########
#&album_id=7&ic=0&curPageNum=1
import requests
from lxml import etree
import aiofiles
import asyncio
import time
import aiohttp
import urllib.parse

headers =  {
    #不加不行,获取网络请求时会出现验证
    "Referer":"https://image.baidu.com/search/albumsdetail?",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
}
async def web_Img(href,name):
    name = name.replace(" ","")
    t = "建筑"
    print(f"{name}图片开始下载")
    #需要获取多少图片直接修改 参数即可 跳转的a链接默认的数值是这个
    href = f"https://image.baidu.com/search/albumsdata?pn=30&rn=30&tn=albumsdetail&word={name}&album_tab={t}&album_id=7&ic=0&curPageNum=1"
    async with aiohttp.ClientSession() as session:
        async with session.get(href,headers=headers) as s:
            data_Json = await s.json()
            data_Json = data_Json["albumdata"]["linkData"]
            index = 0
            for img_Url in data_Json:
                url = img_Url["thumbnailUrl"]
                print(url)
                async with aiohttp.ClientSession() as se:
                    async with se.get(url) as img:
                        content = await img.read()
                        async with aiofiles.open(f"D:\桌面\pythoncode\爬虫实验报告\图片\{name}\{index}.jpg",'wb') as file:
                           await file.write(content)
                        index+=1
                        print(f"{index}下载成功")
async def main():
    url = "https://image.baidu.com/"
    response = requests.get(url)
    response.encoding = 'utf-8'
    en = etree.HTML(response.text)
    href_List = en.xpath("//div[@class='bd-home-content-album']//a")
    task = []
    for href in href_List:
        h = href.xpath('./@href')[0]
        title = href.xpath('./div[3]/text()')[0]
        t = asyncio.create_task(web_Img(h,title))
        task.append(t)
        break
    return await asyncio.wait(task)
if __name__ =='__main__':
   asyncio.run(main())

如果需要其他类型的图片,完全可以使用一个数组储存关键词如“建筑” “风景”这种添加参数,图片数量只需要更改参数即可。

异步的学习非常简单 只有那几个关键词 你只需要找一个案例自己敲一遍代码,完全可以学会这种爬虫方式。不需要再使用传统的方式,我们完全可以多线程中开异步等等方式。

后续教程明天更行。 

标签:album,异步,请求,批量,baidu,爬取,href,com,图片
From: https://blog.51cto.com/u_16426526/9143921

相关文章

  • python爬虫进阶篇(异步)
    学习完前面的基础知识后,我们会发现这些爬虫的效率实在是太低了。那么我们需要学习一些新的爬虫方式来进行信息的获取。异步        使用python3.7后的版本中的异步进行爬取,多线程虽然快,但是异步才是爬虫真爱。基本概念讲解1.什么是异步?        异步是指在程序执行......
  • 爬取极简壁纸
    js反编译的代码需要解密之类的,直接给我干蒙圈了,借助selenium可以直接获取到调式工具中的源码,可以获取渲染后的链接,然后将链接交给下载函数(使用异步提高效率)即可。后续学习完js反编译的话,我会再写一篇教学,介绍js反编译爬取。主要还是,获取当前页面之后,找到按钮点击下一次,如果下载过程......
  • 长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务
    什么是Java事件在Java中,"event"(事件)通常用于指代一种在特定条件下触发的通知或者信号。在Java编程中,事件代表着程序中发生的某种动作或改变,例如用户的交互操作、状态的转换,或者其他外部因素触发的通知。Java中的事件通常与事件监听器(EventListener)和事件处理器(EventHandler)一起使......
  • MyBatis批量插入数据优化
    背景介绍我们使用了mybatis-plus框架,并采用其中的saveBatch方法进行批量数据插入。然而,通过深入研究源码,我发现这个方法并没有如我期望的那样高效这是因为最终在执行的时候还是通过for循环一条条执行insert,然后再一批的进行flush,默认批的消息为1000为了找到更优秀的解决方案......
  • 【技术探讨】用户使用其他厂家433MHz无线模块时,购买样品OK,小批量100个就会出现偶尔无
    许多用户使用其他厂家的433M透传无线模块反馈这样的问题:前期购买几个样品测试,在无线信号覆盖半径内,收发包测试都很稳定,但是小批量购买100个模块收发就会出现无法收发的情况。这是什么原因呢?首先科普一下,无线电波,在同一个信道同一时刻只允许一个节点发射行为。433M的无线透传模块,没......
  • JdbcTemplate的基本使用-批量新增
    JdbcTemplate的基本配置参考我的上一篇文章:JdbcTemplate的基本使用-新增批量增加可以使用jdbcTemplate.batchUpdate()方法,示例如下:UserServiceImpl增加批量增加方法:packageservice;importdao.UserDao;importentity.User;importorg.springframework.beans.factory.annotat......
  • 使用Python爬取大麦网演出商品评论的方法
    在网络时代,用户对于商品的评论和评价是非常重要的参考依据。本文将介绍如何使用Python来爬取大麦网演出商品评论,以获取用户对演出的反馈和评价。1.确定目标页面首先,我们需要确定要爬取评论的目标页面。在大麦网上,每个演出商品都有一个唯一的商品ID,通过拼接URL可以访问到该商品的评......
  • 批量同步 开源某一个公司或者个人 大量开源项目的小工具(避免手工一个一个的同步)
    fromrequests.authimportHTTPBasicAuthimportrequestsimportosimportjsonrepos=set()defdownload_repo(output,name,href):print(f'Cloning{name}{href}')os.system(f'gitclone--depth1{href}"{output}/{name}"......
  • AI小蜜批量写作助手:多级指令,插件,GPTs满足不同写作需求
    为什么会开发这个脚本?爆文项目的核心是矩阵怼量具体怎么做这里介绍很清楚了:AI爆文撸流量主保姆级教程3.0+脚本写作教程(解放双手)我在刚做爆文项目时候,都是手动操作,复制指令,组合指令,粘贴,AI生成内容,然后发布。整个过程流程简单,全部重复劳动。但凡没点耐心,很容易就放弃了。重复......
  • 如何管理多个React组件的异步请求
    如何管理多个React组件的异步请求一、异步请求的背景前端应用中的异步请求前端应用中的异步请求是指在前端开发中,通过使用Ajax、fetch或其他网络请求库,向后端服务器发送请求并获取数据的过程。由于前端开发中常常需要实现多个React组件之间的数据交互,因此对于异步请求的管理变得尤......