网页爬虫抓取百度图片(通用网络爬虫和聚焦爬虫(一):百度图片爬取)

优采云 发布时间: 2022-02-17 17:21

  网页爬虫抓取百度图片(通用网络爬虫和聚焦爬虫(一):百度图片爬取)

  通用爬虫和焦点爬虫

  根据使用场景,网络爬虫可以分为通用爬虫和专注爬虫。

  万能网络爬虫:是搜索引擎爬虫系统(百度、谷歌、雅虎等)的重要组成部分,它从互联网上采集网页和采集信息,这些网页信息用于构建一个为搜索引擎提供支持的索引,它决定了整个引擎系统的内容是否丰富,信息是否即时,所以其性能的好坏直接影响到搜索引擎的效果。主要目的是将互联网上的网页下载到本地,形成互联网内容的镜像备份。

  

  聚焦爬虫:是一种“面向特定主题需求”的网络爬虫程序。它与一般搜索引擎爬虫的区别在于,焦点爬虫在实现网络爬虫时会对内容进行处理和过滤,并尽量保证只爬取与需求相关的内容。网页信息。也就是一般意义上的爬行动物。

  百度图片爬取

  需求分析,至少要实现两个功能:一是搜索图片,二是自动下载

  分析网页(注意:不用的参数可以删除不影响页面加载)源码,用F12

  编写正则表达式或其他解析器代码

  本地存储数据

  正式写python爬虫代码

  页面分析非常重要。不同的需求对应不同的URL,不同的URL的源码明显不同。因此,掌握如何分析页面是爬虫成功的第一步。本页源码分析如下图所示:

  

  import os

import re

import requests

from colorama import Fore

def download_image(url, keyword):

"""

下载图片

:param url: 百度图片的网址

:return: Bool

"""

# 1. 向服务器发起HTTP请求

response = requests.get(url)

# 2. 获取服务器端的响应信息

# 响应信息: status_code, text, url

data = response.text # 获取页面源码

# 3. 编写正则表达式,获取图片的网址

# data = ...[{"ObjURL":"http:\/\/images.freeimages.com\/images\/large-previews\/3bc\/calico-cat-outside-1561133.jpg",....}]...

# 需要获取到的是: http:\/\/images.freeimages.com\/images\/large-previews\/3bc\/calico-cat-outside-1561133.jpg

# 正则的语法: .代表除了\n之外的任意字符, *代表前一个字符出现0次或者无数次. ?代表非贪婪模式

pattern = r'"objURL":"(.*?)"'

# 4. 根据正则表达式寻找符合条件的图片网址.

image_urls = re.findall(pattern, data)

# 5. 根据图片网址下载猫的图片到本地

index = 1

for image_url in image_urls:

print(image_url) # 'xxxx.jpg xxxx.png'

# response.text 返回 unicode 的文本信息, response.text 返回 bytes 类型的信息

try:

response = requests.get(image_url) # 向每一个图片的url发起HTTP请求

except Exception as e:

print(Fore.RED + "[-] 下载失败: %s" % (image_url))

else:

old_image_filename = image_url.split('/')[-1]

if old_image_filename:

# 获取图片的后缀

image_format = old_image_filename.split('.')[-1]

# 处理 url 为...jpeg?imageview&thumbnail=550x0 结尾(传参)的情况

if '?' in image_format:

image_format = image_format.split('?')[0]

else:

image_format = 'jpg'

# 生成图片的存储目录

keyword = keyword.split(' ', '-')

if not os.path.exists(keyword):

os.mkdir(keyword)

image_filename = os.path.join(keyword, str(index) + '.' + image_format)

# 保存图片

with open(image_filename, 'wb') as f:

f.write(response.content)

print(Fore.BLUE + "[+] 保存图片%s.jpg成功" % (index))

index += 1

if __name__ == '__main__':

keyword = input("请输入批量下载图片的关键字: ")

url = 'http://image.baidu.com/search/index?tn=baiduimage&word=' + keyword

print(Fore.BLUE + '[+] 正在请求网址: %s' % (url))

download_image(url, keyword)

  结果:

  

  常见问题:

  为什么只有30张图片,百度有30多张图片

  百度图片是响应式的,下拉的时候会不断的加载新的图片,也就是说浏览器中的页面是通过JS处理数据的结果,Ajax爬虫的内容这里不再详述。

  搜索页面下点击单张图片的url与程序中获取的ObjURL不一致

  这可能是百度缓存处理的结果。每张图片本质上都是“外网”,不是百度,所以在程序中,选择向实际存储图片的url发起HTTP请求。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线