python爬⾍爬取百度搜索图⽚(附代码)
⼊门⼩菜鸟,希望像做笔记记录⾃⼰学的东西,也希望能帮助到同样⼊门的⼈,更希望⼤佬们帮忙纠错啦~侵权⽴删。
最近需要⼀些图⽚做数据,所以想试⼀下python爬⾍,⾛你~
⽬录
⼀、⽹页分析
这次爬取的是⾥⾯的所有图⽚。我们先进这个⽹址看看
1、页⾯请求⽅式的查看
我⽤的是⾕歌浏览器,⾸先“F12”进⼊“开发者⼯具”界⾯,或者点右上⾓的“三个点”选择“更多⼯具”再选择“开发者⼯具”。
点击“Network”,到.html的请求,即点击Name栏⾥⾯的任何⼀个,就会弹出下图的右下⾓样⼦的东东,再点击“Headers”,再进⾏⼀个,到“Request Method:GET”(这个就是.html的请求)
2、观察html代码结构,寻图⽚元素的特点
如下图所⽰,点击“Elements”出现该页⾯的html代码。
然后⽤⿏标指代码,然后我们可以看到左边的⽹页有部分的蓝⾊阴影,这个阴影就是你⿏标所在代码所控制的。到控制某张图⽚的代码
这⾥要注意⼀个问题,就是第⼀张图⽚是“图⽚合辑”,不是我们要的,千万不要搞错了哟(不要问我怎么知道的(>⼈<;)),从第⼆张图⽚开始哦,下图 阴影部分的代码所指的就是第⼆张图⽚,
可以看到这⾥的
画⿊线的地⽅“data-imgurl”后⾯跟着⼀个链接,可以⾃⼰先复制⼀下这条链接然后打开试试,嘿~确实是我们要的,好耶!
然后右键界⾯,“查看⽹页源码”,⽤刚刚复制的链接查⼀下,看到了前⾯是“thumbURL”,⽤同样的⽅法看看其他图⽚,同样的图⽚链接前都是 “thumbURL”。⾄此我们就到规律了,可以直接动⼿啦!
所以我们的思路就很清晰啦。先拿到html⽂件,然后再根据上述特点拿到图⽚,好耶!
⼆、代码实现
1、导⼊所需的库
晚年import re #正则
import requests#⽤来发出⽹络请求
import time
兰博基尼多少万import random #这两个是为了后⾯控制休眠时间的
re 正则表达式待会要⽤到滴
requests⽤来发出⽹络请求
time和random后⾯⽤来控制休眠时间,防⽌被检测到
2、获取该⽹址html⽂件并解码
keyword = '⼀个拳头'
file_path = "img/"+keyword+"/"
url ='image.baidu/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1616736717041_R&pv=&ic=0&nc=
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}
url = (url = (url+keyword),headers=headers)#headers防⽌被检测出来,被阻断
url = t.decode('utf-8')#解码
模仿上百度搜图⽚的样式,模仿我们输⼊keyword,然后进⾏搜索,组成对应的url,然后如果没有header的话会被阻断,伪造⼀个header
加上去,最后进⾏内容解码。
3、制定正则解析规则并获取迭代器
obj = repile(r'"thumbURL":"(?P<url_img>.*?)"',re.S)#制定正则解析规则
#从⽹页源码中, 按照指定规则获取迭代器
iter = obj.finditer(url)
4、遍历迭代器获取图⽚
#遍历迭代器中的内容
i = 1
for it in iter:
#得到图⽚的url, 将响应的⼆进制内容写⼊⽂件中,
url_img = it.group("url_img")
url_img= (url=url_img,headers=headers)#这⾥同样需要headers,否则会被检测出来
with open(file=file_path+str(i)+'.jpg',mode='wb') as fp:
fp.write(t)
print(str(i)+".jpg下载完成")
衣服染上别的用啥洗掉time.sleep(random.uniform(0.4,0.8))#随机休眠, 防⽌被检测
搜网址i = i + 1
print("OK")
然后就等着图⽚下好就OK啦。
完整代码如下
几点升国旗import re #正则
import requests#⽤来发出⽹络请求
import time
import random #这两个是为了后⾯控制休眠时间的
keyword = '⼀个拳头'
刘烨张杰file_path = "img/"+keyword+"/"
url ='image.baidu/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1616736717041_R&pv=&ic=0&nc= headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}
url = (url = (url+keyword),headers=headers)#headers防⽌被检测出来,被阻断
url = t.decode('utf-8')#解码
#制定正则解析规则, 将其编译结果存⼊re_obj中,提⾼效率
obj = repile(r'"thumbURL":"(?P<url_img>.*?)"',re.S)
#从⽹页源码中, 按照指定规则获取迭代器
iter = obj.finditer(url)
#遍历迭代器中的内容
i = 1
for it in iter:
#得到图⽚的url, 将响应的⼆进制内容写⼊⽂件中,
url_img = it.group("url_img")
url_img= (url=url_img,headers=headers)#这⾥同样需要headers,否则会被检测出来
with open(file=file_path+str(i)+'.jpg',mode='wb') as fp:
fp.write(t)
print(str(i)+".jpg下载完成")
time.sleep(random.uniform(0.4,0.8))#随机休眠, 防⽌被检测
i = i + 1
print("OK")
不过要注意⼀点,就是存图⽚的⽂件夹要事先建好,才能跑哦。
然后这份代码只需要换⼀下keyword就可以实现百度搜索对应关键词的图⽚直接下载,⾛你~
欢迎⼤家在评论区批评指正,如果喜欢的话,动动你们的⼩⼿点个赞哦,谢谢~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论