一、简介
爬取网站图片是一件很简单的事情,用python写一个爬虫很轻松就能实现,原理上很简单,现在的网络基本都是客户端-服务器模式,我们所用的浏览器就是客户端,用浏览器向网站服务器发送请求,网站服务器收到请求后,就会返回图片数据,从而实现爬取功能,要点就在于要找到图片的地址,只有通过唯一的地址才可以发送请求,就好像寄快递一样,只有知道对方的地址才能将信寄出去,所以关键点就在于从网页原代码中分离出图片的地址,然后发送请求,最后将获取到的二级制数据保存下来,废话少说,上代码(以爬取大图网美女图片为例,没有的库需要 pip install 一下)(爬一爬免费数据即可,收费的尽量不要去爬哦,处理不好容易“刑”!!!!)
二、代码实现
# __author__: Mybook
# __date__: 2022/6/5
import requests #导入网络请求模块,向服务器发送数据请求用
import time,re,os #导入自带模块,代码中再介绍
from bs4 import BeautifulSoup
for i in range(5680,5780):
try:
url = f'http://124.223.19.18/datu/{i}.html' #这里的5680,5780 分析每一张网页会发现只有后面四位数在变化
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'Referer': f'{url}'
} #加入headers请求头,用来将python代码伪装成浏览器,是一项反爬措施
response = requests.get(url,headers=headers) #每一个循环中,发送请求获取网页内容
html = response.text #html就是解析出的网页源代码,其中包含图片地址
urls = re.findall('
',html) #用正则表达式在网页原代码中匹配出图片地址(其中的src的值),urls为列表数据类型
print(urls)
# names = re.findall('
',html) #同样的方法可匹配出每一张图片的名字
if urls != [] :
soup = BeautifulSoup(html, 'lxml') #介绍另一种方法,用beautiful soup模块解析出每张网页图片的主题名称,用来建立文件夹来存储该网页上的图片 ,也可用正则表达式匹配出,这里只是为了多介绍一种方法,读者可以自行选择
pathname = soup.select(f'#post-{i} > div:nth-child(1) > div > header > h1')[0].text #“#post-{i} > div:nth-child(1) > div > header > h1”在网页图片上右键单击检查,然后在出现高亮的地方右键复制selector再粘贴过来即可
print(pathname)
path = f'D:\Practice\图片爬虫\美女图片\{pathname}\' #指定存储路径
if not os.path.exists(path): #用到os 模块,如果路劲不存在就创建,避免每个文件夹都要手动创建
os.makedirs(path)
j = 0
for url1 in urls:
with open(path + str(j) + '.jpg', "wb") as f: #遍历获取到的图片地址列表,并发送数据请求,将返回到的数据以二进制数据形式存储下来即可,此处可指定文件后缀,可以是jpg,也可以是其他格式,计算机会自动识别
resp = requests.get(url1,headers=headers)
f.write(resp.content)
j+=1
print(f"正在下载第{j}张图片")
time.sleep(0.5) #每爬完一张图片就睡眠0.5秒,反爬措施,如果不加,以来会加重目标网站负担,二来会被网站识别爬虫,导致封IP号
else:
pass
except:
pass
三、结果演示
',html) #用正则表达式在网页原代码中匹配出图片地址(其中的src的值),urls为列表数据类型 print(urls) # names = re.findall('
',html) #同样的方法可匹配出每一张图片的名字 if urls != [] : soup = BeautifulSoup(html, 'lxml') #介绍另一种方法,用beautiful soup模块解析出每张网页图片的主题名称,用来建立文件夹来存储该网页上的图片 ,也可用正则表达式匹配出,这里只是为了多介绍一种方法,读者可以自行选择 pathname = soup.select(f'#post-{i} > div:nth-child(1) > div > header > h1')[0].text #“#post-{i} > div:nth-child(1) > div > header > h1”在网页图片上右键单击检查,然后在出现高亮的地方右键复制selector再粘贴过来即可 print(pathname) path = f'D:\Practice\图片爬虫\美女图片\{pathname}\' #指定存储路径 if not os.path.exists(path): #用到os 模块,如果路劲不存在就创建,避免每个文件夹都要手动创建 os.makedirs(path) j = 0 for url1 in urls: with open(path + str(j) + '.jpg', "wb") as f: #遍历获取到的图片地址列表,并发送数据请求,将返回到的数据以二进制数据形式存储下来即可,此处可指定文件后缀,可以是jpg,也可以是其他格式,计算机会自动识别 resp = requests.get(url1,headers=headers) f.write(resp.content) j+=1 print(f"正在下载第{j}张图片") time.sleep(0.5) #每爬完一张图片就睡眠0.5秒,反爬措施,如果不加,以来会加重目标网站负担,二来会被网站识别爬虫,导致封IP号 else: pass except: pass
四、总结
解释的很清楚了吧,虽然很简单,但是还是要有一些基本功的,没有基本功很难理解以上代码,建议初学者好好学学以上用到的几个模块,用起来会轻车熟路,但是照猫画虎也不是不可,毕竟这是python的优点之一。



