网页爬虫抓取百度图片(爬虫什么是爬虫?是蜘蛛么?是什么? )

优采云 发布时间: 2021-11-26 02:17

  网页爬虫抓取百度图片(爬虫什么是爬虫?是蜘蛛么?是什么?

)

  一、什么是爬虫

  什么是爬虫?爬行动物是蜘蛛吗?是优采云吗?不不不。

  

  

  爬虫是指请求网站并获取数据的自动化程序,也称为网络蜘蛛或网络机器。最常用的领域是搜索引擎,最常用的工具是优采云。

  其基本过程分为以下五个部分,依次为:

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

  爬虫的三大特点:

  爬虫可以写成什么:

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

  二、爬虫的前期准备

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

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

  2、安装python环境

  Python官网下载地址:

  安装过程:

  请自行百度。

  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请求头)

  windows默认为gbk编码格式,网页一般默认为utf-8编码,所以当你直接用windows电脑抓取网页内容信息时,可能会遇到乱码问题,所以在要求统一编码格式的时候要保证数据不乱请求方式包括post、get、put等验证方式,所以选择正确的请求方式来获取页面信息。如果不努力,可能会遇到404页面未找到或500服务器错误。header 请求头收录很多负面信息。如果我们常见的,比如:反爬虫机制,token验证,cookie验证等。

  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'Next\("\d+","(?P\d+)",.*?\)'

script_reg = r'+).htm]尾页'

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("执行已经结束了")

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线