如何爬取1000+张百度图片?python爬虫教程附代码

如何运用Python爬取百度图片?

实验环境:Python 3.x
第三方库:Resquest 2.14.2

一、首先打开百度,输入关键字搜索所需照片(这里以电子秤为例)

在这里插入图片描述

往下拉能看到图片是随着网页向下的滑动而加载出来的,这是动态加载页面。这就麻烦了,如果查看页面的源代码,是不会发现图片的url的,这可怎么办呢?不怕,首先要弄明白动态加载的原理,动态加载就是通过运行javascript将图片数据插入到网页的HTML标签里面,所以我们在源代码里看不到图片信息。但是网页中能加载出来图片说明网页请求有数据包,只要找到存放有数据信息的文件就能找到图片的url。

二、接下来查看数据包,找到图片的url

现在举个例子,搜索电子秤的百度图片,点开网页开发者工具,点击网络,往下滑动图片页面就会发现加载出多张图片和多出 acjson?tn=resultjson&ipn=… 请求的文件,再点击文件预览就会看到一条json数据,点开就会发现30多条数据,再次点开就会发现,每条数据都包含了一张图片的详细信息。
在这里插入图片描述

这时候细心的你一定会发现每个文件内只有30条数据,那怎么才能得到1000+条数据呢?那我们就来找不同,如上图有四个 acjson?tn=resultjson&ipn=… 文件,如果仔细想一想,每请求一次得到30条数据,而且每次请求的数据是不同的,所以肯定请求的url也是不同的,将这4个文件的url放在一起如下:

https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1614774604107=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=60&rn=30&gsm=3c&1614774604251=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=90&rn=30&gsm=5a&1614774716612=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=120&rn=30&gsm=78&1614774716744=

不难发现,除了pn和gsm的前两个字母外其他的都相同。pn是以30为步幅递增的,而gsm的前两个字母是pn的16进制数的两位。

三、实验代码

导入库

import requests
import time

模拟浏览器

# 请求头,伪装成浏览器
headers = {
    
    
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
keyword = '电子秤' # 关键字
max_page = 34 
i=1 # 记录图片数

创建一个文件夹并和代码文件放在同一目录下,爬取并下载图片

for page in range(1,max_page+1):
    page = page*30
    # 网址
    url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord='\
            +keyword+'&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word='\
            +keyword+'&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn='\
            +str(page)+'&rn=30&gsm=1e&1596899786625='
    # 请求响应
    response = requests.get(url=url,headers=headers)
    # 得到相应的json数据
    json = response.json()
    if json.get('data'):
        for item in json.get('data')[:30]:
            # 图片地址
            img_url = item.get('thumbURL')
            # 获取图片
            image = requests.get(url=img_url)
            # 下载图片
            with open('./电子秤图片/%d.jpg' %i,'wb') as f:
                f.write(image.content) # 图片二进制数据
            time.sleep(1) # 等待1s
            print('第%d张%s图片下载完成...'%(i,keyword))
            i+=1
print('End!')

四、爬取结果

成功爬取1000+张图片到指定文件夹
在这里插入图片描述

资料参考
简书:隐墨留白
链接:https://www.jianshu.com/p/e7031f06307c

猜你喜欢

转载自blog.csdn.net/weixin_44763047/article/details/114340943