在具体介绍图片爬取之前我们先简单弄个小实验,使用Python来写一个下载图片的程序。
#完整代码
import requests
def down_pic(down_url, picname):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3868.400 QQBrowser/10.8.4394.400"
} # 发送头信息
req = requests.get(url=down_url, headers=header)#用来获取文本信息
req.encoding = 'utf-8'#用来解码获取的信息(python解释器要按照utf-8编码的方式来读取程序。)
with open('%s' % picname, "wb") as f: # 开始写文件,wb代表写二进制文件
f.write(req.content)
def main():
url = 'https://imgs.mmkk.me/img/negxpjbt/4.jpg'#图片链接地址
picname = '测试.jpg' # 要保存的图片名称
down_pic(url, picname)
# 执行函数
main()
import requests
- requests是一个很实用的Python HTTP客户端库,Requests是Python语言的第三方的库,专门用于发送HTTP请求
- 那么我们如何在Pyhton下载和安装所需要的库文件呢?
- 以PyCharm 2020.1演示(首先得需要你自己新建个项目)
- ①
- 点击 文件
- 点击设置
- 点击自己创建的项目,点击Python Interpreter,再点击右侧? +
- ?搜素所需要找的库,这里输入requests,再点左下角Install Package
? ???等待安装提示完成安装(如果安装失败多重复几次)
?②
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3868.400 QQBrowser/10.8.4394.400"
} # 发送头信息
- 这个发送头信息目的就是表明你是一台电脑,防止被网页识别你是爬虫。
req = requests.get(url=down_url, headers=header)#用来获取文本信息
req.encoding = 'utf-8'#用来解码获取的信息(python解释器要按照utf-8编码的方式来读取程序。)
- req = requests.get()用来获取接收到的文本信息
- req.encoding = 'utf-8'用来解析代码
with open('%s' % picname, "wb") as f: # 开始写文件,wb代表写二进制文件
f.write(req.content)
def main():
url = 'https://imgs.mmkk.me/img/negxpjbt/4.jpg'#图片链接地址
picname = '测试.jpg' # 要保存的图片名称
down_pic(url, picname)
- url?是你下载的图片链接地址(可以改你自己下载的图片的源链接)
- picname是你下载下来的图片名称
- 默认下载路径是你Pyhton项目的文件夹内
- 整体下来你就可以用Python下载一张图片。(当然你得先知道图片源文件的链接)这几行代码是让大家先体验体验。
?????????????????????????????????????????????????????????????????????????③
- 那我们如何具体实现批量图片的下载呢?(我们最重要的就是获取图片源链接)
- 从上面操作可以看出来,我们只要获得图片的源链接就可以完成下载(其他细节先忽视不谈)所以我们通过其他的库来解析网页源代码来获取我们想要图片的源链接。
-
#完整代码
from bs4 import BeautifulSoup# 处理获取的网页信息
import requests #下载图片需要
import urllib.request
import random
import os #系统模块,路径的操作
import time #时间模块
def main():
baseurl="https://www.mmkk.me/weimei/5550.html"#网址
getData(baseurl)
#------------------------------------------------------------------------------#
def askURL(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3868.400 QQBrowser/10.8.4394.400"
}#发送头信息
request = urllib.request.Request(url, headers=headers)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")#解码
# print(html)
except urllib.error.URLError as e:#打印异常信息
if hasattr(e,"code"):
print(e,code)
if hasattr(e,"reason"):
print(e,reason)
return html
#------------------------------------------------------------------------------#
def getData(baseurl):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3868.400 QQBrowser/10.8.4394.400"
} # 发送头信息
url = baseurl
html = askURL(url)#获得解析后的内容
path_name = 'A' # 创建文件名
soup = BeautifulSoup(html,"html.parser")#html是一个HTML文档字符串,可以自动补全 lxml是指定该文档的解析方式 python自带的解析器是parser
for item in soup.find_all('div', attrs={"id": "masonry"}):
results_imgs = soup.find_all('div', attrs={"data-fancybox": "gallery"})
for k in range(len(results_imgs)):
img = results_imgs[k].attrs['data-src'] # 获取图片网址
print(img)
# 创建图片保存路径
if not os.path.exists(path_name):
os.makedirs(path_name, exist_ok=True)
file_name = path_name + '_' + str(k+1) + '.jpg'
file_name = os.path.join(path_name, file_name)
if not os.path.exists(file_name):
time.sleep(random.randint(3, 8))
r = requests.get(img, headers=headers) # 下载图片
if r.status_code == 200:
with open(file_name, 'wb') as f:
f.write(r.content)
if __name__ =="__main__":
main()
print("任务结束啦!!!") - 对于引入的库我都有大致备注,想了解详情的可以自行搜索
- 对于未下载的库按之前的方法自行下载
-
def askURL(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3868.400 QQBrowser/10.8.4394.400"
}#发送头信息
request = urllib.request.Request(url, headers=headers)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")#解码
# print(html)
except urllib.error.URLError as e:#打印异常信息
if hasattr(e,"code"):
print(e,code)
if hasattr(e,"reason"):
print(e,reason)
return html - 对于askURL函数复制粘贴即可,就是我们前面所说的发送头信息等操作,打了个包。
-
# 创建图片保存路径
if not os.path.exists(path_name):
os.makedirs(path_name, exist_ok=True)
file_name = path_name + '_' + str(k+1) + '.jpg'
file_name = os.path.join(path_name, file_name)
if not os.path.exists(file_name):
time.sleep(random.randint(3, 8))
r = requests.get(img, headers=headers) # 下载图片
if r.status_code == 200:
with open(file_name, 'wb') as f:
f.write(r.content) - 这个就是一个创建文件目录,得到图片网址然后下载的图片,图名保存是以 XX_1;XX_2.....的方式
- 1
- 我们打开需要爬取的网页,右击检查查看后台代码,不断的展开找到我们需要的网址信息。
- 最后发现图片网址代码是在data-src之后,所以我们只需要通过代码找到data-src就可以了。
-
html = askURL(url)#获得解析后的内容
path_name = 'A' # 创建文件名
soup = BeautifulSoup(html,"html.parser")#html是一个HTML文档字符串,可以自动补全 lxml是指定该文档的解析方式 python自带的解析器是parser
for item in soup.find_all('div', attrs={"id": "masonry"}):
results_imgs = soup.find_all('div', attrs={"data-fancybox": "gallery"})
for k in range(len(results_imgs)):
img = results_imgs[k].attrs['data-src'] # 获取图片网址
print(img) - BeautifulSoup是一个HTML/XML的解析器用来解析得到的html
- 在截图中我们可以看到我们所需要的所有图片信息储存在<div id="masonry"...
- 然后单个的图片信息储存在<div?data-fancybox="gallery"...中
- 那么第一个for循环的作用就是找到所有网址包头为?<div id="masonry" (这里只有一个<div?可以不写for循环)
- results_imgs就是将所有的<div?data-fancybox="gallery"信息写入
- len(results_imgs)是判断写入<div的数量,这里就是图片的数量
- 那么第二个for循环就是将<div?data-fancybox="gallery"中的data-src一个个提取出来。
- 得到data-src之后就获得了网址代码,然后交给后面的代码进行图片下载。
- ④
- 最后总结一下,其实网页中的图片爬取以及其他的信息爬取就是通过对网页结构的分析,然后利用代码进行不断地重复提取,所以对于不同网页需要不同的方法进行爬取。这里举的网址结构比较简单,有的<div会重复出现所以需要仔细观察。
|