当前位置:网站首页>pyhon爬虫之爬取图片(亲测可用)
pyhon爬虫之爬取图片(亲测可用)
2022-08-04 17:08:00 【我不是萧海哇~~~~】
爬取网站 https://image.baidu.com/
先打开页面
然后点击动物图片 当然选择哪个都可以我这里只是喜欢动物的所以选择这个分类
爬取任何数据 第一步就是先确定数据来源 先打开 f12 来看一下
先点击随便一个图片右键 然后点击检查 就会跳到那个图片所在的位置 如下:
当看你看到响应里有确切的地址的时候 先不要着急爬取 先复制这个链接然后点击查看页面源代码(快捷键:ctr+U) 查找一下里面有没有这个地址
可以看的出来网页 源代码里面没有 到这一步就可以确定是用ajax异步来传送的数据
然后我们再f12 里面 点击Network 下面的XHR 进行页面刷新如下:
如果还没有出来数据 就把滚动条往下拉一下就可以看到有新的请求链接 记得多往下滚动一下 做一下对比 如下:
我们点开previem 可以看到是json格式 然后打开可以看到有30个图片的数据
我们随便点开一个就可以看到里面 有明确的图片的源地址 我们可以复制打开一下
thumbnailUrl: 这里面就是源地址 可以打开看下 如下:
我们现在知道的图片的地址 但是要抓取所以图片就需要进行二级页面的爬虫
我们先把所有图片的地址抓取下来 先观察一下url
我们往下滑动就可以看到每一个请求都是pn值 和PageNum值 会变 那我们只需要再爬取的时候吧这两个值变动一下就可以了 我们可以看到每一个请求只有30个数据 那么还需要进行处理一下
接下来我们就开始写代码
我们先把所需要的模块导入进来如下:
# -*- coding:utf-8 -*-
# Author:Mr.屌丝
import json
import os.path
from hashlib import sha1
import requests
from fake_useragent import UserAgent
然后我们创建一个类 先吧所需要的headers 头和url 初始化一下如下:
class BaiduSpider: def __init__(self): # 初始化一下 头部 把刚刚变动的数据改成大括号 便于后面传参 我们中间的很长的那些是一些中文字 可以再页面看到的 这里我就不多说了 self.url = 'https://image.baidu.com/search/albumsdata?pn={}&rn=30&tn=albumsdetail&word=%E5%AE%A0%E7%89%A9%E5%9B%BE%E7%89%87&album_tab=%E5%8A%A8%E7%89%A9&album_id=688&ic=0&curPageNum={}' self.headers = {
'User-Agent': UserAgent().random
}
我这里还做了一个sha1加密功能函数 便于后期做增量 这里我是没有做的 只是应用于保存图片的名称
def sha1(self, href):
s = sha1()
s.update(href.encode())
return s.hexdigest()
接下来我们就开始爬数据了 第一个先爬取所以图片的源地址 代码如下:
def parse_html(self, url):
img_html = requests.get(url=url, headers=self.headers).text
# 我们这里需要把数据转换成json格式的数据
img_json = json.loads(img_html)
print(img_json)
def crawl(self):
# 这里进行计算是应该我们看到有185个图片 一个请求只有30个 所以我们计算一下需要发送几个请求
page = 185 // 30 if 185 % 30 == 0 else 185 // 30 + 1
for number in range(page):
number=number+1
pn = number * 30
self.parse_html(self.url.format(pn, number))
if __name__ == '__main__':
baidu = BaiduSpider()
baidu.crawl()
然后我们启动一下
然后我们打印一下抓取到的数据格式 如下:
可以看到这里有我们的图片url 我们需要把所需要的rul提取出来 代码如下:
def parse_html(self, url):
img_html = requests.get(url=url, headers=self.headers).text
# 我们这里需要把数据转换成json格式的数据
img_json = json.loads(img_html)
# print(img_json)
for href in img_json['albumdata']['linkData']:
img_href = href['thumbnailUrl']
# 我们提取出来之后打印一下rul
print(img_href)
def crawl(self):
# 这里进行计算是应该我们看到有185个图片 一个请求只有30个 所以我们计算一下需要发送几个请求
page = 185 // 30 if 185 % 30 == 0 else 185 // 30 + 1
for number in range(page):
number=number+1
pn = number * 30
self.parse_html(self.url.format(pn, number))
if __name__ == '__main__':
baidu = BaiduSpider()
baidu.crawl()
结果如下
可以看到我们这里的结果没有问题 接下来我们需要把这些链接的图片下载保存在本地了
需要再写一个函数方法 方便与以后修改 代码如下:
def img_info(self, href):
# 二级页面请求 下载图片
html = requests.get(url=href, headers=self.headers).content
# 进行一个sha1的加密
sha1_r = self.sha1(href)
# 创建一个保存图片的路径
file = 'F:\Study\Spider\img\\'
# 完整保存图片的链接
filename = file + sha1_r + '.jpg'
# 判断有没有这个保存图片的路径 没有则创建
if not os.path.exists(file):
os.mkdir(file)
# 进行图片保存
with open(filename, 'wb') as f:
f.write(html)
# 打印一下图片的信息
print(filename)
好了 代码到这里就结束了 可能我说的不太好 多谢体谅
完整代码如下:
import json import os.path from hashlib import sha1 import requests from fake_useragent import UserAgent class BaiduSpider: def __init__(self): self.url='https://image.baidu.com/search/albumsdata?pn={}&rn=30&tn=albumsdetail&word=%E5%AE%A0%E7%89%A9%E5%9B%BE%E7%89%87&album_tab=%E5%8A%A8%E7%89%A9&album_id=688&ic=0&curPageNum={}' self.headers={
'User-Agent':UserAgent().random}
def sha1(self,href):
s=sha1()
s.update(href.encode())
return s.hexdigest()
# 爬取图片的原地址
def parse_html(self,url):
img_html=requests.get(url=url,headers=self.headers).text
# 转换成json
img_json=json.loads(img_html)
# print(img_json)
for href in img_json['albumdata']['linkData']:
img_href = href['thumbnailUrl']
# print(img_href)
self.img_info(img_href)
def crawl(self):
page=185//30 if 185%30==0 else 185 //30 +1
for number in range(page):
number=number+1
pn=number*30
self.parse_html(self.url.format(pn,number))
def img_info(self,href):
html=requests.get(url=href,headers=self.headers).content
# 进行sha1加密
sha1_r=self.sha1(href)
#创建一个保存图片的路径
file="baidu_img"
filename=file+"\\"+sha1_r+".jpg"
if not os.path.exists(file):
os.mkdir(file)
with open(filename,'wb') as f:
f.write(html)
print(filename)
if __name__ == "__main__":
print('hello')
baidu=BaiduSpider()
baidu.crawl()
边栏推荐
- 机器学习(十七):网格搜索(Grid Search)和SVM
- 安装失败怎么办
- "Distributed cloud best practices" BBS, on August 11, shenzhen
- SAP ABAP SteammPunk 蒸汽朋克的最新进展 - 嵌入式蒸汽朋克
- Mobile zte ZXV10 B860AV2. 1 - A_S905L2_MT7668_ wire brush the firmware package
- GraphQL 入门与实践
- Learning and Exploration-Introducing Baidu Statistics to the Website
- 】 【 LeetCode daily one problem - 540. The order of a single element of the array
- win11如何退出安全模式
- 机器人示教编程与离线编程的优缺点对比
猜你喜欢
随机推荐
小满nestjs(第一章 介绍nestjs)
泰坦尼克号沉船数据之美——起于悲剧,止于浪漫
Mobile Hisense IP102H_905L3-B_wire brush firmware package
JSP 标准标签库(JSTL)[通俗易懂]
shell脚本详解 --------循环语句之for循环
88.(cesium之家)cesium聚合图
域名哪家便宜?怎么买便宜域名?
8月5日,麒麟信安邀您相约鲲鹏开发者创享日·长沙站!
Json的FastJson与Jackson
华为云数据治理生产线DataArts,让“数据‘慧’说话”
并发编程原理学习-reentrantlock源码分析
软件测试高频面试题真实分享/网上银行转账是怎么测的,设计一下测试用例。
码蹄集 - MT2094 - 回文之时:第4组数据错误
R语言使用cov函数计算矩阵或者dataframe数据变量之间的协方差、cor函数计算相关性、cor函数通过method参数指定相关性、相关性计算方法Pearson,Spearman, Kendall
SAP 电商云 Spartacus UI 页面布局的设计原理
码蹄集 - MT3029 - 新月轩就餐
R语言使用yardstick包的gain_curve函数评估多分类(Multiclass)模型的性能、查看模型在多分类每个分类上的增益(gain)曲线(gain curve)
太一集团宣布全资收购火币旗下社交产品火信
LeetCode 0168. Excel表列名称
Selenium Webdriver驱动自管理