设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 1619|回复: 1
打印 上一主题 下一主题

[爬虫实战]爬个bing图片

[复制链接]

7

主题

1

好友

64

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2022-12-28 12:42:20 |只看该作者 |倒序浏览
本帖最后由 Danieldepython 于 2022-12-28 12:44 编辑

有时候,我们在找寻素材或者找头像的时候一般都会使用搜索引擎搜索(当然也有专门找头像或素材的)
但是如果觉得整个页面的素材都想要该怎么办呢?当然不可能是自己一个一个右键保存吧
这时候我们就要用到万能的python了
首先,得找到bing图片的url,打开bing,然后搜索想要的然后切换到图片页面,这时,url网址栏会显示页面url,仔细观察,就会找到规律
例如:https://cn.bing.com/images/search?q=bing图片&form=HDRSC2&first=1&tsc=ImageHoverTitle&cw=1177&ch=740
多艘几次就会发现,q参数正是我们想要的
思路就来了,首先用requests爬取页面获取源代码,然后用BeautifulSoup是不是就可以了呢?
再观察一下源代码,我们发现大部分图片的class都是mimg
思路来了,那么就简单了
代码如下:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"}
  4. name = input("请输入图片名称:")
  5. respone = requests.get(f"https://cn.bing.com/images/search?q={name}&form=HDRSC2&first=1&tsc=ImageHoverTitle&cw=1177&ch=740",headers=headers)#请求bing
  6. respone.encoding = 'utf-8'#更改编码为utf-8
  7. soup = BeautifulSoup(respone.text,'html.parser')#创建一碗“美味的汤”
  8. imgs = soup.find_all("img",class_='mimg')
  9. i = 0
  10. for img in imgs:
  11.     with open(f'{i}.jpg','wb') as f:
  12.         f.write(requests.get(img['src']).content)#读取图片网址写入文件
复制代码
但是意外出现了,requests居然报错了!(虽然这只是我演示随便写的代码)
img.PNG
在翻下网页源代码,原来,有的img有src有的不是http网址,或https,有的甚至根本就没有src
那么有没有一个只有mimg并且都有src并且都是https或http网址的api呢?答案是有的
首先想到的就是翻页的api,因为bing是个动态页面,那么翻页就肯定会发出翻页请求,这时候抓到了是不是就可以了呢?
打开f12,往下翻,bing果然翻页了,随后,我们成功找到了api
翻页api.PNG
我们看到,https://cn.bing.com/images/async?q=花&first=85&count=35&cw=1177&ch=757&relp=35&apc=0&tsc=ImageHoverTitle&datsrc=I&layout=RowBased_Landscape&mmasync=1&dgState=x*538_y*1134_h*184_c*2_i*71_r*16&IG=368332BF637842CEAAFDB489B6F65E2B&SFX=3&iid=images.5560这一串就是翻页的api
分析后发现,q还是图片搜索,而sfx参数就是重点,这个就是第几页的参数,假设我们要看第5页,直接把sfx改成5就可以了
完整的思路是这样的:用户输入名称和下载到第几页→开始循环,直到爬到用户设定的页面→爬取页面,查看是否为空白页,空白则continue→发现有图片,开始获取src,如果不符合http格式则返回错误并且错误数量加1→如果符合格式则下载保存到img文件夹里→完成数加1,继续循环→提示下载完毕
代码如下:
  1. import requests
  2. import os
  3. import re
  4. from bs4 import BeautifulSoup
  5. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"}
  6. while 1:
  7.     os.system("cls")
  8.     name = input("请输入图片名称:")
  9.     sfx = input("下载到第几页(默认1)?:")
  10.     if not sfx:
  11.         sfx = 1
  12.     else:
  13.         sfx = int(sfx)
  14.     i = 0
  15.     error = 0
  16.     if os.path.exists(".\\img\"+name):
  17.         pass
  18.     else:
  19.         os.makedirs(".\\img\"+name)
  20.     ab = "http.*"
  21.     for sfxs in range(sfx):
  22.         bing_image = requests.get(f"https://cn.bing.com/images/async?q={name}&first=124&count=35&cw=1177&ch=757&relp=35&apc=0&tsc=ImageHoverTitle&datsrc=I&layout=RowBased_Landscape&mmasync=1&dgState=x*0_y*0_h*0_c*4_i*106_r*24&IG=C97EC244AD8A4D888841852620EFAA3B&SFX={sfxs}&iid=images.5554",headers=headers)
  23.         bing_image.encoding = 'utf-8'
  24.         text = bing_image.text
  25.         if not text:
  26.             print("无结果!")
  27.             input()
  28.             continue
  29.         soup = BeautifulSoup(text,'html.parser')
  30.         imgs = soup.find_all('img',class_='mimg')
  31.         for img in imgs:
  32.         i += 1
  33.         try:
  34.             img['src']
  35.         except IndexError:
  36.             print("错误:找不到索引")
  37.             error += 1
  38.             continue
  39.         if not re.match(ab,img['src']):
  40.             print("错误:http链接格式不正确,已自动跳过")
  41.             error += 1
  42.             continue
  43.         print("正在下载第"+str(i)+"个图片...")
  44.         jpeg = requests.get(img['src'])
  45.         f = open('.\\img\\'+name+'\\'+str(i)+'.jpg','wb')
  46.         f.write(jpeg.content)
  47.         f.close()
  48.         print(f"第{sfxs+1}页面图片下载完成,实际下载图片数量为{len(imgs)-error}")
复制代码
(我懒得用翻译所以有的变量起的有点随便,凑合着看吧)
代码因为放进来不知道为什么缩进被吃了,可能会有点错误,所以我打算把原代码上传上来
必应图片.zip (1.21 KB, 下载次数: 2)
开始测试:
test1.PNG

test2.PNG
测试成功,代码可以跑!
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2022-12-28 23:56:53 |只看该作者
手动点赞
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-27 20:11 , Processed in 0.032976 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部