Python爬取网页中的图片(搜狗图片)详解

yizhihongxing

接下来我将为您详细讲解“Python爬取网页中的图片(搜狗图片)详解”的完整攻略。

标题

1. 确定爬取目标

要爬取搜狗图片,我们需要先确定要爬取的页面以及其中的图片。在本例中,我们将使用如下链接作为目标:

https://pic.sogou.com/pics?query=%E7%BE%8E%E5%A5%B3%E5%9B%BE%E7%89%87

此链接指向一个以“美女图片”为关键字的图片搜索结果页面。

2. 安装必要的库

在代码实现之前,需要先安装如下几个Python库:

pip install requests
pip install beautifulsoup4
pip install lxml

其中,requests用于向指定网站发送请求,beautifulsoup4用于解析HTML页面,lxml作为beautifulsoup4的解析器,用于解析HTML页面中的节点,获取其中的图片链接。

3. 获取图片链接

获取图片链接的过程需要经过以下几个步骤:

(1)向指定网站发送请求

import requests

url = 'https://pic.sogou.com/pics'
params = {
    'query': '美女图片',
    'mode': 1,
    'start': 48,
    'reqType': 'ajax',
    'tn': 0,
    'reqFrom': 'result'
}
response = requests.get(url, params=params)
response.encoding = 'utf-8'

我们使用requests库构造了一个GET请求,其中要发送的参数包括查询关键字、搜索模式、起始搜索位置、请求类型、以及请求来源等内容。获取到的搜索结果将会被放入response对象中。

(2)解析HTML页面

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'lxml')

使用BeautifulSoup构造器,我们将获取到的内容解析成了一个BeautifulSoup对象。为后续处理提供了便利。

(3)提取图片链接

img_tags = soup.find_all('img')
img_urls = [img['src'] for img in img_tags]

我们使用soup对象中提供的find_all方法,获取了页面中所有的img节点。遍历这些节点,可以提取其中的图片链接并存储在一个列表对象img_urls中。

4. 下载图片文件

当我们获取到了所有的图片链接之后,我们就可以使用Python提供的requests库来下载这些图片了。

import os

for idx, url in enumerate(img_urls):
    print('正在下载第{}张图片,链接:{}'.format(idx+1, url))
    response = requests.get(url)

    folder_name = 'images'
    if not os.path.exists(folder_name):
        os.makedirs(folder_name)

    with open('{}/{}.jpg'.format(folder_name, idx), 'wb') as f:
        f.write(response.content)

print('所有图片下载完成')

在以上代码中,我们遍历了所有的图片链接,使用requests库下载图片并存储在指定的文件夹中(在这里为images)。为了防止文件夹不存在的情况,我们使用os库的makedirs方法先行创建了文件夹。

示例

下面给出两个示例,分别演示了如何获取并下载搜狗图片搜索结果页面中的图片。

示例1:获取前2页的搜狗图片

以下示例可以获取前2页的搜狗图片,并将其保存至本地。

import requests
from bs4 import BeautifulSoup
import os

def download_image(url, max_page):
    for i in range(max_page):
        params = {
            'query': '美女图片',
            'mode': 1,
            'start': i * 48,  # 一页展示48张图片
            'reqType': 'ajax',
            'tn': 0,
            'reqFrom': 'result'
        }
        response = requests.get(url, params=params)
        soup = BeautifulSoup(response.text, 'lxml')
        img_tags = soup.find_all('img')
        img_urls = [img['src'] for img in img_tags]

        folder_name = 'images'
        if not os.path.exists(folder_name):
            os.makedirs(folder_name)

        for idx, img_url in enumerate(img_urls):
            print('正在下载第{}张图片,链接:{}'.format(idx+1, img_url))
            response = requests.get(img_url)
            with open('{}/{}.jpg'.format(folder_name, i*48+idx), 'wb') as f:
                f.write(response.content)
    print('所有图片下载完成')

if __name__ == '__main__':
    url = 'https://pic.sogou.com/pics'
    max_page = 2
    download_image(url, max_page)

示例2:获取指定关键字的搜狗图片

以下示例可以获取指定关键字的搜狗图片,并将其保存至本地。

import requests
from bs4 import BeautifulSoup
import os

def download_image(url, max_page, keyword):
    for i in range(max_page):
        params = {
            'query': keyword,
            'mode': 1,
            'start': i * 48,  # 一页展示48张图片
            'reqType': 'ajax',
            'tn': 0,
            'reqFrom': 'result'
        }
        response = requests.get(url, params=params)
        soup = BeautifulSoup(response.text, 'lxml')
        img_tags = soup.find_all('img')
        img_urls = [img['src'] for img in img_tags]

        folder_name = 'images_{}'.format(keyword)
        if not os.path.exists(folder_name):
            os.makedirs(folder_name)

        for idx, img_url in enumerate(img_urls):
            print('正在下载第{}张图片,链接:{}'.format(idx+1, img_url))
            response = requests.get(img_url)
            with open('{}/{}.jpg'.format(folder_name, i*48+idx), 'wb') as f:
                f.write(response.content)
    print('所有图片下载完成')

if __name__ == '__main__':
    url = 'https://pic.sogou.com/pics'
    max_page = 1
    keyword = '猫咪图片'
    download_image(url, max_page, keyword)

以上就是“Python爬取网页中的图片(搜狗图片)详解”的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬取网页中的图片(搜狗图片)详解 - Python技术站

(1)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python基于Socket实现简易多人聊天室的示例代码

    下面是详细的攻略。 Python基于Socket实现简易多人聊天室 概述 在本示例中,我们将使用Python的Socket库建立一个简单的多人聊天室。我们将会通过网络实现实时通信,让不同的客户端可以在同一台主机上互相聊天,并且能够观察到其他用户的消息。 实现步骤 1. 创建服务端 在Python中使用Socket实现多人聊天室,需要先创建一个服务端程序,接受…

    python 2023年5月19日
    00
  • python的scipy.stats模块中正态分布常用函数总结

    下面我将为您详细讲解“python的scipy.stats模块中正态分布常用函数总结”的完整攻略。 正态分布 正态分布是一种概率分布,是统计学中最常见的分布之一,通常被用来对实验数据进行建模和分析。在python中,可以通过scipy.stats模块来进行正态分布的相关计算。 常用函数 下面是scipy.stats模块中正态分布常用的函数: norm.cdf…

    python 2023年6月5日
    00
  • python实现股票历史数据可视化分析案例

    Python实现股票历史数据可视化分析案例 介绍 股票历史数据可视化分析是量化投资中重要的一环,既可以了解股票的历史走势,又可以预测未来股票的涨跌趋势。Python是一种使用广泛的编程语言,也是股票数据分析的重要工具之一。本文将详细讲解Python如何实现股票历史数据的可视化分析。 步骤 步骤一:导入必要的库 Python中用于股票数据分析的库有很多,其中比…

    python 2023年5月18日
    00
  • Python使用requests xpath 并开启多线程爬取西刺代理ip实例

    在本文中,我们将介绍如何使用Python的requests和xpath库爬取西刺代理IP,并开启多线程提高爬取效率。我们将使用requests库发送HTTP请求,并使用xpath库解析HTML文档,以实现爬取代理IP的功能。 1. 爬取代理IP 首先,我们需要爬取西刺代理IP的网站。我们可以使用requests库发送GET请求,获取代理IP的网站。以下是一个…

    python 2023年5月15日
    00
  • python 比较2张图片的相似度的方法示例

    Python中可以使用OpenCV库对图片进行处理和比较。OpenCV提供了两种常用的图片相似度比较方法:均方误差(MSE)和结构相似性指标(SSIM)。 1. 均方误差(MSE)方法 均方误差是一种测量两个信号间差异程度的方法。对于图像相似度比较,均方误差是指两幅图像所有像素点的对应差值的平方和的平均值。 使用Python中的OpenCV库实现MSE方法相…

    python 2023年5月18日
    00
  • 解决python3 HTMLTestRunner测试报告中文乱码的问题

    在Python3中使用HTMLTestRunner生成测试报告时,中文字符可能会出现乱码。本攻略将提供两种解决方法。 方法一:修改HTMLTestRunner源代码 下载HTMLTestRunner源代码 可以从这里下载HTMLTestRunner源代码。 修改HTMLTestRunner.py文件 在HTMLTestRunner.py文件中,找到以下代码:…

    python 2023年5月15日
    00
  • Python读写unicode文件的方法

    下面是Python读写unicode文件的方法的完整攻略。 一、关于Unicode 在讲解Python读写unicode文件的方法之前,我们先来了解一下Unicode。 Unicode是一种字符集,是计算机内部存储字符的一种方式。Unicode为每个字符定义了一个唯一的整数,换句话说就是为每个字符提供了一个数字编号。这个编号通常是16位的,被称为Unicod…

    python 2023年5月20日
    00
  • Python实现暴力破解有密码的zip文件的方法

    实现暴力破解有密码的zip文件,其主要思路是通过循环遍历所有可能的密码进行尝试。具体步骤如下: 导入必要的库 需要导入zipfile、tqdm、string、itertools等库。 import zipfile from tqdm import tqdm import string import itertools 设置密码组成方式 通过string.pr…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部