目录

  • 开始:
  • 分析与步骤:
    • 第一步
    • 第二步
    • 第三步
    • 第四步
    • 最后:

开始:

最近在自学爬虫,自己也做了一些实例,(自认为)写的比较好的就是对整个网站的爬取了。接下来我将会说一说我使用的工具及方法。

注意:为了尊重网站维护人员,我只爬取了网站首页的24个套图,其余的,需要的小伙伴可以自行添加翻页操作!!!

编译环境和所需库

IDE: PyCharm Community Edition 2020.1 x64
python版本: 3.8.2
所需库: requests , BeautifulSoup4,os,time,random


分析与步骤:

第一步

废话不多说,我们直接开始:
第一件事就是导库了,这个简单,就不用我多说了吧。直接上代码:

import os
import time
from random import random
import requests
from bs4 import BeautifulSoup

第二步

这第二件事当然是要去请求网站了,但是我们了解到该网站有反爬机制,所以我们必须先包装一下自己。

ref_url='https://www.mzitu.com'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36 Edg/81.0.416.53','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','cache-control': 'max-age=0','Referer': ref_url}

问:为什么 headers 字段中 Referer 的值要设为全局变量?
答:因为我在测试代码可行性的时候发现,当 Referer 的值为一个定值时,请求大量数据,就会触发反爬机制,导致出现下标越界(或者是找不到某个标签)的异常。从而导致爬取中断。另外根据网站的反爬机制,Referer 字段是必须要有的。

第三步

当我们打开主页就会发现,主页上有24个套图链接,每个套图链接就是一套写真。所以,我们首先爬取的应该是主页上这24个套图链接:
打开浏览器进入主页后查看源码,我们可以看到,首页中24个套图链接都在 ‘ li ’ 标签里面。
所以在代码中 ,我先用 BeautifulSoup 解析源码,将每套图的 ‘ li ’ 标签保存到 Temp_list 中。
再利用 for 提取出每个套图链接,再次进行解析。取出每个 ’ a ’ 标签属性中的 ’ href ’ 字段的值。
又将 ’ href ’ 字段的值作为关键字,保存每套图的名字(每个 ’ img ’ 标签属性中的 ’ alt ’ 字段的值),生成一个字典。
最后,提示当前页面的所有链接都保存成功。
代码如下:

def get_main_url(url):  # 获取每个主页的24个图片链接res = requests.get(url,headers=header)soup = BeautifulSoup(res.text, 'html.parser')Temp_list = soup.find_all('li')[8:]# [8:] 的目的是过滤掉多余的 li 标签for lab_list in Temp_list:div = BeautifulSoup(str(lab_list), 'html.parser')main_url.append(div.a.attrs['href'])  # 每个主页中套图详情列表链接name_dict[div.a.attrs['href']] = div.img.attrs['alt']# 每个主页中套图名字列表print("获取当前页面所有链接成功!")

第四步

来到这里,我首先用 for 挨个取出这24个套图链接。
然后取出每一个套图链接的名字,判断是否有同名文件夹,如果有,则跳过,如果没有,则创建。
接着对每个链接进行解析,找出该套图链接中的图片页数。
紧接着,利用 for 进行翻页操作。
for 每翻一页,就对当前页面进行解析。
通过 BeautifulSoup 解析后,取出 ’ div ’ 标签下, ’ img ’ 属性中的 ‘ arc ’ 字段的值,即为高清图片的地址。
通过 requests 库请求该图片链接(同样要带上 header ,不然仍然会触发反爬,导致图片出错)。
接下来利用 ‘ split ’ 对图片链接进行处理,取出当前图片名字作为图片名。
【 ’ split ‘ 不会用?点击查看使用方法】
最后,将转换为二进制的图片保存下来。
注意:当我们以一定频率或者速度(requests请求速度几乎是一定的)去大量的连续请求时,还是会触发反爬,所以在每爬完一张照片后开始随机休眠。(如果还是不够的话,可以写成 ’ time.sleep(random() * 5) ’ ,数字随便定,不过要注意:数字太大下载会很慢,太小会触发反爬,根据情况可以自行设置)
代码如下:

def get_image():global main_num,ref_urlfor now_url in main_url:main_num+=1   #第 main_num 套图ref_url=now_url  #修改当前的 Referer if os.path.exists(path + '/' + name_dict[now_url]):passelse:os.mkdir(path + '/' + name_dict[now_url])response = requests.get(now_url, headers=header)soup = BeautifulSoup(response.text, 'html.parser')page_nums = soup.find('div', attrs={'class': "pagenavi"})page_num = BeautifulSoup(str(page_nums), 'html.parser').find_all('span')[-2].stringfor i in range(1, int(page_num) + 1):now_new_url = now_url + '/' + '{}'.format(i)new_response = requests.get(now_new_url, headers=header)Temp = BeautifulSoup(new_response.text, 'html.parser')image_url = Temp.find('div', attrs={'class': "main-image"}).img.attrs['src']image = requests.get(image_url,headers=header)name = str(image_url).split('/', 5)[-1]with open(path + '/' + name_dict[now_url] + '/' + name, 'wb') as f:f.write(image.content)print('正在爬取第'+str(main_num)+'个图库的第'+str(i)+'张图片,本页共'+page_num+'张照片。')time.sleep(random())

最后:

主要功能写完后,就可以开始用主函数调用了:

if __name__ == '__main__':start_time = time.time()get_main_url(url)get_image()end_time = time.time()print('耗时:' + str(end_time - start_time))

运行时展示:

最最最最最后:
附上我总结了三天经验后写出的源码:

import os
import time
from random import random
import requests
from bs4 import BeautifulSouppath = './spider'
if os.path.exists(path):pass
else:os.mkdir(path)
url = 'https://www.mzitu.com'
main_url = []
name_dict = {}
main_num = 0ref_url='https://www.mzitu.com'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36 Edg/81.0.416.53','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','cache-control': 'max-age=0','Referer': ref_url}def get_main_url(url):  # 获取每个主页的24个图片链接res = requests.get(url,headers=header)soup = BeautifulSoup(res.text, 'html.parser')Temp_list = soup.find_all('li')[8:]for lab_list in Temp_list:div = BeautifulSoup(str(lab_list), 'html.parser')main_url.append(div.a.attrs['href'])  # 每个主页中图片详情列表链接name_dict[div.a.attrs['href']] = div.img.attrs['alt']print("获取当前页面所有链接成功!")# <div class="main-image">  图片标签
# <div class="pagenavi">    页码标签
def get_image():global main_num,ref_urlfor now_url in main_url:main_num+=1ref_url=now_urlif os.path.exists(path + '/' + name_dict[now_url]):passelse:os.mkdir(path + '/' + name_dict[now_url])response = requests.get(now_url, headers=header)soup = BeautifulSoup(response.text, 'html.parser')page_nums = soup.find('div', attrs={'class': "pagenavi"})page_num = BeautifulSoup(str(page_nums), 'html.parser').find_all('span')[-2].stringfor i in range(1, int(page_num) + 1):now_new_url = now_url + '/' + '{}'.format(i)new_response = requests.get(now_new_url, headers=header)Temp = BeautifulSoup(new_response.text, 'html.parser')image_url = Temp.find('div', attrs={'class': "main-image"}).img.attrs['src']image = requests.get(image_url,headers=header)name = str(image_url).split('/', 5)[-1]with open(path + '/' + name_dict[now_url] + '/' + name, 'wb') as f:f.write(image.content)print('正在爬取第'+str(main_num)+'个图库的第'+str(i)+'张图片,本页共'+page_num+'张照片。')time.sleep(random())if __name__ == '__main__':start_time = time.time()get_main_url(url)get_image()end_time = time.time()print('耗时:' + str(end_time - start_time))

Python爬虫:爬取网页图片相关推荐

  1. 上手快!!福利局!新手如何使用python爬虫爬取网页图片(使用正则进行数据解析)当然这个新手是我自己

    作为一个python新入门小白,突然就想发个博客,一方面为了记录学习历程,一方面能分享给新入门的同学经验,更多的是想和大家一起学习和交流.以下是我以小白的角度分享的爬虫的相关知识和一个简单的爬取网页图 ...

  2. python爬虫爬取网页图片_Python爬虫:爬取网页图片

    先分析查找要爬取图片的路径 在浏览器F12 审查元素 整体实现代码 # -- coding:UTF-8 -- import requests from bs4 import BeautifulSoup ...

  3. python爬虫爬取网页图片_Python爬虫实现抓取网页图片

    在逛贴吧的时候看见贴吧里面漂亮的图片,或有漂亮妹纸的图片,是不是想保存下来? 但是有的网页的图片比较多,一个个保存下来比较麻烦. 最近在学Python,所以用Python来抓取网页内容还是比较方便的: ...

  4. python爬虫,爬取下载图片

    python爬虫,爬取下载图片 分别引入以下三个包 from urllib.request import urlopen from bs4 import BeautifulSoup import re ...

  5. node:爬虫爬取网页图片 1

    代码地址如下: http://www.demodashi.com/demo/13845.html 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图 ...

  6. Python爬虫爬取网页数据并存储(一)

    Python爬虫爬取网页数据并存储(一) 环境搭建 爬虫基本原理 urllib库使用 requests库使用 正则表达式 一个示例 环境搭建 1.需要事先安装anaconda(或Python3.7)和 ...

  7. python爬虫爬取网页新闻标题-看完保证你会

    python爬虫爬取网页新闻标题方法 1.首先使用浏览自带的工具--检查,查找网页新闻标题对应的元素位置,这里查到的新闻标题是在 h3 标签中 2.然后使用编辑器编写python代码 2.1方法一: ...

  8. 用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)

    参考文章:https://www.cnblogs.com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只 ...

  9. python唯美壁纸_用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)

    参考文章:https://www..com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只是很久之前学过 ...

  10. Python爬虫爬取相关图片

    简要的实现实现Python爬虫爬取百度贴吧页面上的图片,下面的网页就是本篇博客所要爬的网页,当然看到的只是其中的一部分图片,是所要爬取的页面, 而下图则是最终的爬取的图片: 接下来就简要的讲讲爬取的整 ...

最新文章

  1. 牛客 - 点对最大值(树的直径)
  2. 为什么玩我的世界老提示Java se错误_我的世界error错误信息 error could解决方法
  3. astrm30米分辨率高程数据下载_如何下载道路沿线1000米范围内的高程?
  4. 【正则表达式】正则匹配注释
  5. 若想学 HTML,应从何入手?
  6. 最简单的 RabbitMQ 监控方法 - 每天5分钟玩转 OpenStack(158)
  7. 基于Struts实现用户登录和注册模块
  8. 大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建
  9. 徐州市建筑物矢量数据(Shp格式+带高度)
  10. vue 判断设备是手机端还是pc端
  11. 不用找,你想要的魏体字体素材都在这里
  12. 已解决,Nik报错an error occurred while extracting
  13. 餐饮管理系统哪个好用?
  14. mysql 1032错误_如何快速解决MySQL 1032 主从错误
  15. 达梦:如何登录数据库(基础篇)
  16. 人活着最重要的是开心,理财最重要的是回本
  17. 多任务学习MTL-MMOE
  18. MATLAB计算英文符号信源熵,基于matlab的英文文本信息量的统计-正确.doc
  19. iPhone和Android的WEB应用开发详解
  20. 计算机bootmgr丢失,如何修复BOOTMGR缺少错误

热门文章

  1. 计算机网络连接图标 红叉,win7电脑的网络连接图标出现红叉以及一直转圈的原因和解决方法...
  2. Adobe官方旗舰店,现已上线“Adobe国际认证”专家证书
  3. 国际化(i18n)的js实现
  4. php 整型 范围,PHP Integer 整型
  5. 小米蓝牙耳机怎么串联,只有一边有声音
  6. docker原理及基本概念
  7. proface普洛菲斯触摸屏维修GP4601TAA PFXGP4601TAA及故障处理
  8. 电商数据分析指标体系
  9. 电子表格的历史:除非你知道它从何而来,否则你将无法预测它将走向何方
  10. 可以储存照片的字段类型是_在数据库中可用来存储图片的字段对象是哪种类型的字段?...