入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。
最近需要一些图片做数据,所以想试一下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 ='https://image.baidu.com/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=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word='
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 = requests.get(url = (url+keyword),headers=headers)#headers防止被检测出来,被阻断
url = url.content.decode('utf-8')#解码
模仿上百度搜图片的样式,模仿我们输入keyword,然后进行搜索,组成对应的url,然后如果没有header的话会被阻断,伪造一个header加上去,最后进行内容解码。
3、制定正则解析规则并获取迭代器
obj = re.compile(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= requests.get(url=url_img,headers=headers)#这里同样需要headers,否则会被检测出来
with open(file=file_path+str(i)+'.jpg',mode='wb') as fp:
fp.write(url_img.content)
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 ='https://image.baidu.com/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=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word='
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 = requests.get(url = (url+keyword),headers=headers)#headers防止被检测出来,被阻断
url = url.content.decode('utf-8')#解码
#制定正则解析规则, 将其编译结果存入re_obj中,提高效率
obj = re.compile(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= requests.get(url=url_img,headers=headers)#这里同样需要headers,否则会被检测出来
with open(file=file_path+str(i)+'.jpg',mode='wb') as fp:
fp.write(url_img.content)
print(str(i)+".jpg下载完成")
time.sleep(random.uniform(0.4,0.8))#随机休眠, 防止被检测
i = i + 1
print("OK")
不过要注意一点,就是存图片的文件夹要事先建好,才能跑哦。
然后这份代码只需要换一下keyword就可以实现百度搜索对应关键词的图片直接下载,走你~
欢迎大家在评论区批评指正,如果喜欢的话,动动你们的小手点个赞哦,谢谢~