使用requests库爬取图片
爬虫流程
找到目标数据
分析请求流程
构造http请求
提取数据
数据持久化
抓取首页图片(静态)
1.目标数据是图片,导入头文件
import re#正则头文件
import os#系统操作头文件
import requests#请求方法头文件
2.请求流程 (爬取一张图片)
1.先访问图片数据URL
url = "pic.netbian.com/uploads/allimg/190824/212516-1566653116f355.jpg"
2.对URL发起请求,获取图片数据
res = requests.get(url)
#res只包含图片的数据(只有纯粹的图片数据我们才能存储)
3.存储
with open("图片.jpg","wb")as f:
f.write(res.content)#二进制数据用content,字符串数据用text
3.构造请求
这里是爬取多张图片,爬取的是彼岸图网
1.访问网站,这里不是图片URL
url1 = "https://pic.netbian.com/4kdongman/"
2.构造请求头,不添加headers就相当于没伪装,直接拿数据库的身份去请求,头都给你锤烂,一般情况下添加user-agent就行了,去浏览器上随便找一个请求头就行
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"}
如果光添加user-agent不行,就把所有的东西都添加上,这里有一个方法快速添加:
1.先创建一个py文件,把请求头的所有东西放进去
2.按Ctrl加r,并勾选正则(Reget)选项

3.在正则上面输入 (.星号?): (.*) 在正则下方输入 “$1”:"$2", 如下图

4.把最后的逗号去掉,有双引号的把外面的双引号改成单引号,然后复制粘贴,赋值给headers就行了
headers = {"authority":"pic.netbian.com",
"method":"GET",
"path":"/e/public/onclick/?enews=doclass&classid=66",
"scheme":"https",
"accept":"*/*",
"accept-encoding":"gzip, deflate, br",
"accept-language":"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"cookie":"__yjs_duid=1_bb4e5b3e36df913449a941ab3ef9b7f21616416167800; td_cookie=3415294076; Hm_lvt_14b14198b6e26157b7eba06b390ab763=1616416167,1616594495,1616675331; zkhanecookieclassrecord=%2C66%2C; Hm_lpvt_14b14198b6e26157b7eba06b390ab763=1616744524; Hm_lvt_526caf4e20c21f06a4e9209712d6a20e=1616743709,1616743724,1616744292,1616746629; yjs_js_security_passport=d65e6df791957b8f0afc196f81328d49385425fe_1616747230_js; Hm_lpvt_526caf4e20c21f06a4e9209712d6a20e=1616747227",
"referer":"https://pic.netbian.com/4kdongman/",
"sec-ch-ua":'"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"',
"sec-ch-ua-mobile":"?0",
"sec-fetch-dest":"script",
"sec-fetch-mode":"no-cors",
"sec-fetch-site":"same-origin",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
}
3.请求网页资源
res = requests.get(url1,headers = headers)
4.提取数据
找到规律为img src="/uploads/allimg/190824/212516-1566653116f355.jpg",图片的资源都在引号里面
urls = re.findall('img src="(.*?)"',res.text)
这里得到的是一个含有图片URL的列表
5保存文件
这里由于彼岸网站做了一些防护,删除掉了前面的一些部分,所以我们加上去
for index,img_url in enumerate(urls):
if not os.path.exits(r"C:\Users\Administrator\Pictures\Saved Pictures")
os.mkdir#这里可有可无,是用来创建文件夹的
if index+2 < len(urls):
img_url = "https://pic.netbian.com" + img_url
res1 = requests.get(img_url)
#res1这里包含了图片的数据,从第一种方法里面可以看到
filename = ="精美图片" + str(index) +".jpg"
#绝对路径也可以,filename = r"C:\Users\Administrator\Pictures\Saved Pictures\精美图片" + str(index) + ".jpg",这样就放到了本机的图库里面了!
with open(filename,"wb") as f:
f.write(res1.content)#二进制数据,保存照片
else:
break
#这里用if语句是因为最后两张不是我们要的图片
抓取多页图片(动态)
1.找page页规律
进入控制台页面,然后如果是翻页的,就找其network下的xhr下数据的URL(如果是舔砖页面的,就直接看其网址),对比不同的网址,找出他们的共同点和不同点
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8036645785004681943&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%A3%81%E7%BA%B8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=0&ic=0&hd=0&latest=0©right=0&word=%E5%A3%81%E7%BA%B8&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=30&rn=30&gsm=1e&1616804888277=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8036645785004681943&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%A3%81%E7%BA%B8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=0&ic=0&hd=0&latest=0©right=0&word=%E5%A3%81%E7%BA%B8&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=60&rn=30&gsm=3c&1616804888437
例如这两段,可以明显看出他们的pn选项是等差数列,最后一项不重要
2.构造page页
for i in range(1,4)
page_url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8036645785004681943&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%A3%81%E7%BA%B8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=0&ic=0&hd=0&latest=0©right=0&word=%E5%A3%81%E7%BA%B8&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn={}&rn=30&gsm=3c&1616804888437"
num = i*30
page_url = page_url.format(num)
3.爬取数据并保存
接着上面的for语句下,将爬取多张图片的方法包装成函数,运用起来就可以了(记得要修改一下名称,不然那会覆盖文件)

1299

被折叠的 条评论
为什么被折叠?



