Python爬虫爬取Google图片

文章目录

    • urllib
      • urllib.request.urlretrieve
    • urllib3 in python3
      • PoolManager
        • Request
    • BeautifulSoup
      • 安装 Installation
      • 一些函数 Some functions
        • get_text
        • find_all(name, attrs, recursive, string, limit, **kwargs)
          • name - 通过标签名搜索
          • kwargs - keyword arguments 关键字参数进行搜索
          • CSS class - 通过CSS类进行搜索
          • string
          • limit - 设置limit参数设置匹配的数量限制
          • recursive - 设置recursive参数决定是否进行迭代
    • 爬虫程序
      • 确定CSS类
      • 检查元素复制html文档

-> 使用 Selenium 模拟浏览器操作

urllib

这是一个可以处理和读取url的python库

urllib.request.urlretrieve

函数原型:urlretrieve(url, filename = None, reporthook = None, data = None)

参数表:

参数说明
url我们所要请求的url地址,不能为空
filename下载内容保存的文件,如果没有指明,会自动创建一个临时文件
reporthook一个回调函数,我们可以传入一个回调函数,这个回调函数将会接收三个参数:第一个是当前已经传输的数据块的数目,第二个是数据块的大小,第三个是文件的总大小,可以通过这个回调函数在命令行中实现简单的下载进度条的显示
data发送给服务器的数据

简单起见,我们将使用这个函数来下载图片

urllib3 in python3

PoolManager

如果你希望使用urllib3来进行一些请求操作,在这之前,我们必须创建一个PoolManager对象:

import urllib3http = urllib3.PoolManager()

Request

好了,现在我们有了这个对象,我们试着从某个网页上拉取数据,例如:中山大学官方网站:http://www.sysu.edu.cn/2012/cn/index.htm。这时我们用到PoolManager对象的request方法:

# initialize url
base_url = 'http://www.sysu.edu.cn'
relative_path = '2012/cn/index.htm'
url = base_url + relative_path
# pool
r = http.request('GET', url)

request方法会返回一个HTTPResponse对象,这个对象有三个属性(attributes):

  • status
  • data
  • header

status
这个是请求的状态,200表示请求成功
在这里插入图片描述
data
这是我们需要的内容:html文件的文本
在这里插入图片描述
headers
这是请求响应报文的头部信息:
在这里插入图片描述

所以,通过HTTPResponse.data我们就可以得到网页文本了。接下来,我们要想办法从若干标签中找到我们要的图片标签中的图片地址,然后批量下载。

BeautifulSoup

BeautifulSoup是Python的bs4中的一个的库,在对网页的文档树进行处理上具有非常强大的功能,我们将运用BeautifulSoup来实现我们的网络爬虫程序。

安装 Installation

在命令行中输入:

pip install bs4

通过引入bs4中的BeautifulSoup,我们就可以使用它强大的功能了:

from bs4 import BeautifulSouphtml = 'some html'
# using BeautifulSoup parsing a html document tree
soup = BeautifulSoup(html, 'html_parser')

一些函数 Some functions

get_text

这个函数可以非常方便的获得标签(tag)中的内容,例如:

html = '<div><span>title</span></br><p> some paragrah</p></div>'

我们可以用get_text函数来获得标签内容:

soup = BeautifulSoup(html, 'html_parser')
print(soup.get_text())

最终将会返回一个string类型的结果并进行打印

find_all(name, attrs, recursive, string, limit, **kwargs)

我们经常需要遍历html页面文档树(Searching the tree)来寻找想要的内容,例如图片<img ...>,我们可以利用find_all函数来找到任何符合我们要求的标签以及内容。

name - 通过标签名搜索

这个参数可以制定我们要搜索的标签的名字(tag’s name),例如:

soup.find_all('title')

将会匹配所有的<title>标签

kwargs - keyword arguments 关键字参数进行搜索

这个参数的作用是:我们可以指定html标签的某个属性进行查找,例如当我们传入这样的参数:

images = soup.find_all(class_='rg_ic rg_i')

你会发现,我们传入的参数并不是find_all函数认识(recognize)的参数名,这时,find_all函数会把这个参数名当作html标签(tag)的一个属性(attribute)来进行过滤查找即:找到所有的classrg_ic rg_i的标签
假如你希望在一个王爷中找到某个链接,我们可以传入href属性:

soup.find_all(href='https://some-link')

查找某个元素:

soup.find_all(id='some-id')

可以指定任何我们感兴趣的标签属性来进行搜索。

CSS class - 通过CSS类进行搜索

在4.1.2中,如果你传入的参数是class的话,这时将会抛出错误,你必须使用class_作为关键字参数,例如:

soup.find_all(class_='some-class')

而很多时候,网页标签并不总是只有一个CSSclass,这时,任何一个拥有我们检索的class属性的标签都将被我们匹配到:

soup = BeautifulSoup('<img class="rg_ic rg_i" data-src="source">')soup.find_all(class_='rg_ic')soup.find_all(class_='rg_i')

这时,这个<img>标签都会被匹配到。当然,你也可以直接匹配这两个CSS类:

soup.find_all(class_='rg_ic rg_i')

仍然的,我们可以匹配到相同的<img>标签。但是如果字符串不同的话:

soup.find_all(class_='rg_i rg_ic')

将不会检索到相同的结果。

string

此外,我们还可以直接告诉BeautifulSoup我们想要搜索的内容,这时,我们可以利用string参数传入一个字符串,一个列表,一个正则表达式,甚至是一个函数来筛选我们想要的内容:

# 找到文档中所有的 'jade'
soup.find_all(string='jade')
# 找到文档中所有的列表中的内容
soup.find_all(string=['jade' 'jason'])
# 找到文档中包含'jade'的内容
soup.find_all(string=re.compile('jade'))
def is_the_only_string_with_a_tag(s):
# 满足子标签的内容和上层的标签的内容相同的内容,例如:
# <div><p>my dear jade</p></div>
# <div>和<p>这两个标签的内容相同return (s == s.parent.string)
# 找到所有标签的内容,这个标签满足其上层标签的内容依然和这个标签内容相同
soup.find_all(string=is_the_only_string_with_a_tag)

当然,你可以结合其他的参数一起使用,例如:

# 找到所有的内容为'jade'的<a>标签
soup.find_all('a', string='jade')

string参数名是BeautifulSoup在4.4.0中新的特性,在更早的版本中用的是text

# 找到所有的内容为'jade'的<a>标签
soup.find_all('a', text='jade')
limit - 设置limit参数设置匹配的数量限制

例如:

soup = BeautifulSoup('<p>a</p><p>b</p><p>c</p>')

设置limit为2:

soup.find_all('p', limit = 2)

将之会得到前两个结果:

['<p>a</p>', '<p>b</p>']
recursive - 设置recursive参数决定是否进行迭代

例如:

soup = BeautifulSoup('\<html><head><title> some title </title></head><html>'\
, 'html_parser')

那么,下面的两中方式将会得到不同的结果:

soup.html.find_all('title')
# get ['<title>some title</title>']
soup.html.find_all('title', recursive=False)
# get nothing

爬虫程序

假如我们希望批量的从google images的搜索结果中大量下载相关的图片,这时如果我们手动进行点击下载将会是一个非常繁冗的任务。但是,有了上面的知识为基础,我们只需要简单的编写一个python爬虫程序就可以让计算机自动帮我们完成这个任务。

确定CSS类

既然我们希望下载的是图片,那么不必说,标签自然就是<img>了。那么我们唯一需要解决的问题就是:Google images的图片结果的CSS类是什么?因为除了搜索结果的图片之外,页面中还存在其他一些界面元素,比如一些UI图片,而这些并不是我们的目标。
很简单,首先打开页面源代码,Ctrl+F搜索标签<img,这样我们可以筛选出页面中的图片元素,然后,找到搜索结果集中的地方,可以看到:在这里插入图片描述
alt属性的内容为““fire hydrant”图片的搜索结果”(假如我们要搜索下载消防栓的图片),alt标签的作用是:如果图片无法显示,将用该文本代替显示。所以我们知道了,这个就是我们的图片的搜索结果(你可能会很熟悉,当搜索图片没有刷出来的时候,显示的就是类似这样的文本,可以自己去尝试一下,当然,你也可以去探索更简单的能够检索到图片结果标签的办法)

这样我们就知道了:图片搜索结果的CSS类为class="rg_ic rg_i"

检查元素复制html文档

对于一些动态加载的页面来说,不同于静态网站,图片元素都是通过javascript生成的,所以我们在网页源代码里面看不到这些图片内容。
但是,我们可以通过检查元素来看到这些动态加载的元素:
在这里插入图片描述
我们可以先在页面上将所有的图片下拉出来,然后再复制上一层元素的内容(包含所有的图片),保存在本地文档中,然后,我们就可以读取这个文档进行处理了。

当然还可以使用Selenium完成这个操作,这个库可以模拟我们的网页操作,这里是进一步的介绍

from bs4 import BeautifulSoup
import urllib
# import urllib3
import time
import os
import sys# report hook with three parameters passed
# count_of_blocks  The number of blocks transferred
# block_size The size of block
# total_size Total size of the file
def progress_callback(count_of_blocks, block_size, total_size):# determine current progressprogress = int(50 * (count_of_blocks * block_size) / total_size)if progress > 50:progress = 50# update progress barsys.stdout.write("\r[%s%s] %d%%" % ('█' * progress, '  ' * (50 - progress), progress * 2))sys.stdout.flush()class Crawl:# called once we create a Crawl objectdef __init__(self):# self.url = base_url + message 我的锅# 这里改为我们初始化一个路径变量,为你本地的html文件的路径self.file_path = './your/path/to/your.html'# main functiondef crawl_images(self):# You can use urllib3 to get the html document, like:# 		http = urllib3.PoolManager()# 		html = http.request('Get', your_url).data# or copy then simply open the html document as we have shown abovehtml = open('./your/path/to/your.html', encoding='utf-8').read()# create a BeautifulSoup objectsoup = BeautifulSoup(html, 'html.parser')# find all the attributes of <img> with class 'rg_ic rg_i'# class_ instead of classimage_list = soup.findAll('img', class_='rg_ic rg_i')print('find total images: ' + str(len(image_list)))# make directory to store download imagesdir_ = './images'# check if there exists such a directoryif not os.path.exists(dir_):os.makedirs(dir_)# count for imagescount = 0for image in image_list:try:# image per secondtime.sleep(1)print('\ndownloading image ' + str(count) + ': ')# path to save the download imagepath = dir_ + '/image' + str(count) + '.png'# downloadurllib.request.urlretrieve(url = image['src'], filename = path, reporthook = progress_callback, data = None)count = count + 1except urllib.error.HTTPError as http_err:print(http_err)except Exception as err:print(err)def run(self):self.crawl_images()print('Complete!')if __name__ == '__main__':crawl = Crawl()crawl.run();

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28561.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python——爬虫抓取图片

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称&#xff1a;test.cpp * 作 者&#xff1a;李晓凯 * 完成日期&#xff1a;2019年 8 月 19 日 * 版 本 号&#xff1a;v1.0 * * 问题描述&#xff1a; * 输入描述&#xff1a; * 程…

python爬虫(爬取图片)

在家无聊写的爬虫程序&#xff0c;用来爬取图片&#xff0c;由于这个是好久之前写的&#xff0c;有点忘了&#xff0c;写的不详细&#xff0c;后面再写一份详细的 爬虫的基本原理就是&#xff1a; 发起请求->获取响应->解析内容->保存数据 第一步&#xff1a;发…

面试常见题(荷兰国旗问题

面试常见题&#xff0c;荷兰三色国旗问题 挺有意思的 #include<bits/stdc.h> using namespace std; int main(){vector<int>str{2, 3, 1, 9, 7, 6, 1, 4, 5,4};int nstr.size();int target4;int l-1,rn;int p0;//这里不能是l<r哦&#xff0c;p代表数组遍历指针…

快速排序之荷兰国旗问题

描述 荷兰国旗有三横条块构成&#xff0c;自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列&#xff0c;要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放最左边、所有白色的条块放中间、所有蓝色的条块放最右边。 …

从糖尿病捆绑支付看荷兰整合医疗

来源:中国数字科技馆 所谓捆绑支付模式,是指对于患有特定疾病的患者,在涉及多个照护提供方的时候,通过单一途径即可支付所接受的所有服务。在荷兰,随着老年人口及慢性疾病患者的增加,整合医疗开始受到政策决策者和保健提供者的关注,并将整合医疗定位为有前瞻性的、多学…

荷兰旗问题(三色旗排序)

摘要&#xff1a; 荷兰旗问题是三色排序&#xff0c;即某一组数据&#xff0c;元素的值只能为a,b ,c。把这组数据按照a, b, c的顺序排序。 本文介绍了一种时间复杂度为O&#xff08;n&#xff09;&#xff0c;空间复杂度O&#xff08;1&#xff09;的算法。 1. 问题描述 某…

荷兰国旗问题(分三块)

在说 “荷兰国旗” 问题之前&#xff0c;首先来看一个引例。 给定一个数组arr&#xff0c;和一个数num&#xff0c;请把小于等于num的数放在数组的左边&#xff0c;大于num的数放在数组的右边。要求额外空间复杂度O(1&#xff09;,时间复杂度 O(N&#xff09; 分析&#xff1…

荷兰国旗问题

Cousera Algorithms PartI第二周课后问答题&#xff0c;有这样一道题&#xff0c;当时没什么想法&#xff0c;直到学了第三周的归并排序&#xff0c;才弄明白要怎么做&#xff0c;这里记录一下自己的想法与最终代码。 问题描述 简而言之&#xff0c;这道题就是有红白蓝三种颜…

算法:荷兰国旗问题

什么是荷兰国旗问题 荷兰国旗是由红白蓝3种颜色的条纹拼接而成&#xff0c;如下图所示&#xff1a; 假设这样的条纹有多条&#xff0c;且各种颜色的数量不一&#xff0c;并且随机组成了一个新的图形&#xff0c;新的图形可能如下图所示&#xff0c;但是绝非只有这一种情况&am…

快排-荷兰国旗

在使用partition-exchange排序算法时&#xff0c;如快速排序算法&#xff0c;我们会遇到一些问题&#xff0c;比如重复元素太多&#xff0c;降低了效率&#xff0c;在每次递归中&#xff0c;左边部分是空的(没有元素比关键元素小)&#xff0c;而右边部分只能一个一个递减移动。…

BUUCTF 荷兰宽带数据泄露

题目 RouterPassView RouterPassView官方下载-RouterPassView中文免费版-华军软件园 ​ RouterPassView,大多数现代路由器允许您备份到一个文件路由器的配置&#xff0c;然后从文件中恢复配置时的需要。路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码&#xff0c…

荷兰国旗问题以及快速排序

文章目录 一、荷兰国旗问题1、啥是荷兰国旗问题2、荷兰国旗问题的抽象3、解决的思路4、详细的参考代码 二、快速排序1、啥是快排&#xff08;排序流程&#xff09;2、抽象后的快排流程3、详细的参考代码 大家好&#xff0c;我是周一。 最近几篇算法&#xff0c;我们都是聊的归…

拍卖理论 英式拍卖 和 荷兰式拍卖 是什么

拍卖理论 源自Vickrey&#xff08;1961&#xff09;的早期研究&#xff0c;其因此获得1996年的诺贝尔经济学奖。 目标一般为&#xff1a;拍卖人的收益最大化、社会的整体效率最优化 对科研和商业方面有非常价值 英式拍卖 又称增价拍卖。拍品的起拍价格即最低期望价格&#…

谈腾讯地图web api如何实现类似百度地图内置的城市切换、关键字输入提示功能

PC WEB端新增客户的时候需要填写客户地址和联系人信息&#xff0c;包括&#xff1a;省市区、街道、详细地址和经纬度以及联系人、固话和移动电话。获取客户地址信息之前用的是百度地图&#xff0c;由于小程序中客户拜访时&#xff0c;需要对客户进行定位、距离计算&#xff0c;…

数学系列 (二)自然数、分数、小数、算数、代数

从无到有 数的概念 出生不久的孩子你觉的他认识1、2、3类似的数字吗&#xff1f;应该都不知道&#xff0c;可见数字的概念也是随着我们人类成长逐渐认识到的&#xff0c;英国经济学创立者亚当斯密说“数是人类在精神上制造出来的最抽象的概念”&#xff0c;属于逻辑思维里面的…

html 省份,城市 选择器附效果图

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><link href"https://cdn.bootcss.com/bootstrap/3.3.7/css/boots…

深圳前海和后海的地理位置划分

前海后海的地理位置 前海和后海主要是相对于珠江口而言的&#xff0c;面向珠江口的为前海&#xff0c;背向珠江口的为后海或面向深圳湾的为后海。 前海知识拓展 https://www.sohu.com/a/490380431_124752

Python实现天气查询功能(外加Excel技巧)

昨天在网上发现了一个非常方便的天气API&#xff0c;就用Python试着用了一下。参数是挺少的&#xff0c;用起来也方便&#xff0c;但是那个城市代码确实是搞了我好长时间。 一、介绍 我们先来看一下实现的程序有什么功能&#xff1a; 功能也是非常简单的&#xff0c;输入城市…

找零钱问题——贪心算法

蓝桥杯——算法训练——找零钱 有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xf…

c语言 贪心算法 找零钱,贪心算法-找零钱(C#实现)

找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下。 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单,有注释 using System; using System.Collections.Generic; using Syst…