百度图片的动态爬取

百度图片搜索第一页只显示前30张图片,向下滚动鼠标可以加载第二页、第三页...图片。这样就要在开发工具中查看每页地址

第一步:分析URL

首先在百度图片页面按关键字搜索图片,然后按F12键打开开发工具,切换到Network选项卡XHR(XmlHttpRequest)项, 刷新一下页面:

单击acjson....在headers中可以看到完整的超链接:

Request URL:https://image.baidu.com/search/acjson?tn=resultjson_com&logid=10902883729278332902&ipn=rj&ct=201326592&is=&fp=result &queryWord=%E5%B0%8F%E7%8C%AA&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word=%E5%B0%8F%E7%8C%AA &s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1615729530798=

参数众多,与搜索主题相关的参数有queryWord和work,两者的后面是查询关键字的编码。

在浏览器中往下滚动鼠标就会发现有更多的acjson加载

分析这些URL的参数,可以发现只有pn,rn 不同,其值分别是:第一条30,30,第二条60,30,第三条90,30,...,即rn是每页30个图片,pn是每页最后一条序号。

这样就可以根据要搜索关键字、图片页数来进行爬取了。

在返回的response中,如下图,响应内容是JSON格式的数据,最后由页面中的AJax获取图片并局部刷新页面

可以发现,data键值对中包含的thumbURL是图片地址,这样可以通过request的json()方法来获取json数据并根据键来获取其中的URL值

注意requests响应对象response的json()方法只能对纯JSON数据操作,如果返回的response不符合JSON规则则不能解析。

 第二步 编程

import requests
import os
#爬取第一页
url='https://image.baidu.com/search/acjson?'
headers={#360安全浏览器,百度需要使用cookie
        'Cookie':'.......',
        'Referer': 'https://image.baidu.com/search/index?tn=baiduimage&fm=result&ie=utf-8&word=%E5%B0%8F%E7%8B%97',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
        }
key='tn=resultjson_com&logid=10902883729278332902&ipn=rj&ct=201326592&is=&fp=result &queryWord={}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word={}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn={}&rn={}&gsm=1e&1615729530798='
word=input('请输入要搜索的关键字:')
pn=eval(input('请输入要保存的页数:'))
imurls=[]
for i in range(1,pn+1):
    url=(url+key).format(word,word,i*30,30)
    r=requests.get(url,headers=headers)
    #"thumbURL":"http://..."图片地址
    imurl=r.json().get('data')
    for im in imurl:
        if im:
            imurls.append(im.get('thumbURL'))
print(len(imurls))
i=1
for iurl in imurls:
    if iurl:
        print('正在下载第{}张图片...'.format(i))
        ir=requests.get(iurl,headers=headers)
        fpath=os.getcwd()+'/p3/'  #在当前路径下建立p2文件夹
        if not os.path.exists(fpath):
            os.mkdir(fpath)  #创建文件夹      
        with open(fpath+str(i)+'.jpg',mode='wb') as f:
             f.write(ir.content)
        i+=1

下载的部分图片:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值