python爬虫抓取图片
阅读原文时间:2023年08月09日阅读:1

一、什么是爬虫

  什么是爬虫?爬虫是蜘蛛么?是八爪鱼么?nonono。

  爬虫是指请求网站并获取数据的自动化程序,又称网页蜘蛛或网络机器,最常用领域是搜索引擎,最常用的工具是八爪鱼。

  它的基本流程分为以下五部分,依次是:

    明确需求——发送请求——获取数据——解析数据——存储数据。

  爬虫的三大特点:

  • 网页都有唯一的URL(统一资源定位符,也就是网址)进行定位

  • 网页都使用HTML(定位超文本标记语言)来描述页面信息

  • 网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据

      爬虫可以由什么编写呢:

        编写爬虫的语言有很多,但用的最多最广的还应该是Python,并且也诞生了很多优秀的库和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般来说,搜索引擎的爬虫对爬虫的效率要求更高,会选用c++、java、go(适合高并发)。

二、爬虫前期准备工作

1、准备一台性能良好的电脑

  电脑要求:windows7以上,内存四核8G以上

2、安装python环境

  python官网下载地址:

    https://www.python.org/downloads/release/python-395/

  安装流程:

    请自行百度。

3、安装所需要的扩展

  咱们主要使用以下四个扩展:

import os # python自带扩展不需要安装
import requests # pip install requests
from urllib import request # python自带扩展不需要安装
from bs4 import BeautifulSoup # 安装命令:pip install bs4

4、查找一个可读取源码的图片网站

注意注意:此链接仅供学习参考,请勿非法批量爬取,任何不听劝阻,一意孤行者,如若产生违法乱纪之事,请自行承担。(开发不易,且行且珍惜)

抓取图片的地址:https://www.umei.cc/meinvtupian/meinvxiezhen/

三、分析网站源码

1、分析源码,得到获取源码的三个方向(编码格式、请求方式、header请求头)

2、查找列表页的唯一节点

3、根据图片排版,查找源码规律(相同的li标签获取节点)

4、获取列表的最后一页,获取最后一页的页码(NewPages节点下的尾页,代表最后141页)

根据图片分页的页码地址规律,我们能得到(特别注意:第一页不能使用 index_1.htm 来查询):
https://www.umei.net/meinvtupian/meinvxiezhen/ 第一页没有index
https://www.umei.net/meinvtupian/meinvxiezhen/index_2.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_3.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_4.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_5.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_6.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_7.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_8.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_9.htm
……

5、根据每一个图片链接,进入图片详情

根据上题3可以看出,图片详情的地址为:

https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm

6、查找图片详情的地址规律,获取所有的详情子图片地址

根据图片详情可以查看出来每一个子图片的详情地址:
https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_2.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_3.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_4.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_5.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_6.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_7.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_8.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_9.htm

7、根据地址抓取图片流,保留本地

  根据题6获取的图片地址进行爬取图片信息,保存到本地,页面分析到此结束,废话不多说,直接上代码,赶紧抓取。

四、开始编写我们的爬虫脚本

1、封装式代码

#!/usr/bin/env python

-*- coding: utf-8 -*-

@Time : 2021/06/06 14:48

@Author : Liu

@Site :

@File : 美图小姐姐.py

@Software: PyCharm

import requests
import time
import os
import re
from urllib import request
from bs4 import BeautifulSoup

url_address = "https://www.umei.cc"

def get_url_path(url):
"""
获取地址内容信息
:param url:
:return:
"""
# time.sleep(1) # 获取源码的时候睡眠一秒
obj = requests.get(url)
obj.encoding = obj.apparent_encoding
return obj.text

def get_page_info():
"""
抓取每页信息
:return:
"""
nums = int(input("输入抓取的页数:"))
for i in range(nums):
if i < 1:
url = f"{ url_address }/meinvtupian/meinvxiezhen/"
else:
url = f"{ url_address }/meinvtupian/meinvxiezhen/index_{i + 1}.htm"
ret = get_url_path(url) # 获取页面信息
get_bs4(ret) # 逐页抓取页面信息
print(f"第{i+1}页完成")
pass

def get_bs4(ret):
soup = BeautifulSoup(ret, "html.parser")
li_list = soup.select(".TypeList")[0].find_all(name="li")
for i in li_list:
# 先获取第一张图片
img_src = url_address + i.a["href"]
ret1 = get_url_path(img_src) # 获取页面信息
get_image_info(ret1, i.a.span.string, 1)

    # print(ret1)

    # 获取分页后的页面图片数量  
    # script\_reg = r'<script type="text\\/javascript">Next\\("\\d+","(?P<num>\\d+)",.\*?\\)<\\/script>'  
    script\_reg = r'<a href="/meinvtupian/meinvxiezhen/(?P<num>\[0-9\_\]+).htm">尾页</a>'  
    num\_str = re.search(script\_reg, ret1, re.S).group("num")  
    page\_num = int(num\_str.split("\_")\[1\])  # 获取图片数量

    img\_lst = os.path.basename(i.a\["href"\]).split(".")  # 获取图片的后缀  
    img\_dir = os.path.dirname(i.a\["href"\])   # 获取图片的地址路径  
    for j in range(2, page\_num+1):  
        img\_src = f"{ url\_address }{img\_dir}/{img\_lst\[0\]}\_{j}.{img\_lst\[1\]}"  
        res = get\_url\_path(img\_src)  # 获取页面信息  
        get\_image\_info(res, i.a.span.string, j)

def get_image_info(ret, name, i):
soup = BeautifulSoup(ret, "html.parser")
img = soup.select(".ImageBody img")[0]
image_path = img["src"] # 获取图片地址
image_name = name # 获取图片中文所属
img_name = f"{image_name}_{i}.{os.path.basename(image_path).split('.')[1]}" # 获取图片真实名字
# 图片存储
image_dir = f"girl/{image_name}"
if not os.path.isdir(image_dir):
os.makedirs(image_dir)
# 远程打开图片写入到本地 第一种方式open
# with open(f"{image_dir}/{img_name}", mode="wb") as add:
# add.write(requests.get(image_path).content)
# 远程打开图片写入到本地 第二种方式urllib
request.urlretrieve(image_path, filename=f"{image_dir}/{img_name}")

print("已经开始执行了,可能需要等待一会,请您耐心等待!")
begin_time = int(time.time())
get_page_info()
end_time = int(time.time())
print(f"当前脚本执行了{end_time - begin_time}秒")
print("执行已经结束了")

2、简单的爬取首页展示图片代码

import os
import requests
from bs4 import BeautifulSoup
from urllib import request

url_address = 'https://www.umei.cc'
list_url = url_address + '/meinvtupian/meinvxiezhen/'
obj = requests.get(list_url)
obj.encoding = obj.apparent_encoding
content = obj.text

# 格式化页面
soup = BeautifulSoup(content, 'html.parser')
li_soup = soup.select(".TypeList")[0].findAll("li")
dir = "./girls/"
for i in li_soup:
if not os.path.isdir(dir):
os.makedirs(dir)
img_path = i.img["src"]
img_suffix = os.path.basename(img_path).split('.')[1]
img_url = dir + i.span.string + '.' + img_suffix
request.urlretrieve(img_path, img_url)