python爬取网站上的图片并保存到本地
1.导入需要的模块requests,BeautifulSoup,os(用于文件读写)。
2.创建一个类,并初始化。
class BeautifulPicture: def __init__(self): # 类的初始化操作 self.headers = { # 给请求指定一个请求头来模拟chrome浏览器 \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; WOW64)\' \' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\'} self.web_url = \'url\' # 要访问的网页地址 self.folder_path = \'E:\\1\\pic\' # 设置图片要存放的文件目录
3.先请求图片所在的网页,返回网页response
def request(self, url): # 返回网页response r = requests.get(url, self.headers) # 向目标url地址发送get请求,返回一个response对象 return r
调用request方法,print(r.text)就可以看到控制台上print出的网页源码了。
4.通过BeautifulSoup工具获取需要抓取的img标签,这里根据不同的网页布局css选择器也会有不同:
def get_pic(self): r = self.request(self.web_url) all_item = BeautifulSoup(r.text, \'html.parser\').select(".search_results > .item") for item in all_item: img = item.find(\'a\').find(\'img\') url = img[\'src\']
此处,我是先抓取img所在的div(类名为item),再获取div下的a链接下的img,网页具体代码格式为
<div class="flex_grid credits search_results" style="margin:4px 14px 0 15px"> <div class="item" data-w="640" data-h="256"> <a href=""> <img srcset="" src="" alt=""> </a> </div> ...... </div>
通过遍历可以获取所有图片的链接。
5.获取到图片地址链接后,就可以下载图片并保存到本地了。那么就需要确认初始化定义的文件夹是否存在,如果不存在,需要创建。
def mkdir(self, path): # 创建文件夹 path = path.strip() is_exists = os.path.exists(path) if not is_exists: print(\'创建名字叫做\', path, \'的文件夹\') os.makedirs(path) print(\'创建成功!\') else: print(path, \'文件夹已经存在了,不再创建\')
6.接下来就可以保存图片了。
第四步操作,在get_pic方法中,获取到所有图片所在的div标签后,先确保存放图片的文件下是否存在,调用方法
self.mkdir(self.folder_path) # 创建文件夹
os.chdir(self.folder_path) # 切换路径至上面创建的文件夹
遍历所有的div,根据url名中jpg/png的不同,决定保存图片的后缀名
i = 1 # 后面用来给图片命名 for item in all_item: img = item.find(\'a\').find(\'img\') url = img[\'src\'] if url.count(\'jpg\') > 0: self.save_img(url, str(i) + \'.jpg\') elif url.count(\'png\') > 0: self.save_img(url, str(i) + \'.png\') i += 1
其中save_img方法为:
def save_img(self, url, name): # 保存图片 img = self.request(url) f = open(name, \'ab\') f.write(img.content) print(name, \'文件保存成功!\') f.close()
创建MyBeautifulPicture类的实例,调用get_pic方法,至此,保存图片到本地就可以实现了。
完整的get_pic方法为:
def get_pic(self): r = self.request(self.web_url) all_item = BeautifulSoup(r.text, \'html.parser\').select(".search_results > .item") self.mkdir(self.folder_path) # 创建文件夹 os.chdir(self.folder_path) # 切换路径至上面创建的文件夹 i = 1 # 后面用来给图片命名 for item in all_item: img = item.find(\'a\').find(\'img\') url = img[\'src\'] # print(url) if url.count(\'jpg\') > 0: self.save_img(url, str(i) + \'.jpg\') elif url.count(\'png\') > 0: self.save_img(url, str(i) + \'.png\') i += 1