网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- Pycharm (社区版就已经足够了)
- pip installrequests Pillow selenium
- geckodriver (具体见下文)
- Mozlla Firefox (如果你没有安装过的话)
- 正常的网络连接(显然需要的)
- 你宝贵的 30 分钟(也许更少)
简单图片爬虫的菜谱
以上的所有都安装好了?棒!在我们继续开始写代码前,我先来解释一下以上这些原料都是用来干什么的。
我们首先要做的是利用 Selenium webdriver 和 geckodriver 来为我们打开一个浏览器窗口。首先,在 Pycharm 中新建一个项目,根据你的操作系统下载最新版的 geckodriver,将其解压并把 geckodriver 文件拖到项目文件夹中。Geckodriver 本质上就是一个能让 Selenium 控制 Firefox 的工具,因此我们的项目需要它来让浏览器帮我们做一些事。
接下来我们要做的事就是从 Selenium 中导入 webdriver 到我们的代码中,然后连接到我们想爬取的 URL 地址。说做就做:
**from** selenium **import** webdriver
# 我们想要浏览的 URL 链接
url = "https://unsplash.com"
# 使用 Selenium 的 webdriver 来打开这个页面
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url) selenium **import** webdriver
# 我们想要浏览的 URL 链接
url = "https://unsplash.com"
# 使用 Selenium 的 webdriver 来打开这个页面
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
打开浏览器窗口到指定的 URL。
一个远程控制的 Firefox 窗口。
相当容易对吧?如果以上所说你都正确完成了,你已经攻克了最难的那部分了,此时你应该看到一个类似于以上图片所示的浏览器窗口。
接下来我们就应该 向下滚动 以便更多的图片可以加载出来,然后我们才能够将它们下载下来。我们还想再 等几秒钟 ,以便万一网络连接太慢了导致图片没有完全加载出来。由于 Unsplash 网站是使用 React 构建的,等个 5 秒钟似乎已经足够”慷慨”了,那就使用 Python 的 time
包等个 5 秒吧,我们还要使用一些 Javascript 代码来滚动网页——我们将会用到 [window.scrollTo()](https://bbs.csdn.net/topics/618317507)
函数来实现这个功能。将以上所说的合并起来,最终你的代码应该像这样:
**import** time
**from** selenium **import** webdriver
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
# 向下滚动页面并且等待 5 秒钟
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5) time
**from** selenium **import** webdriver
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
# 向下滚动页面并且等待 5 秒钟
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
滚动页面并等待 5 秒钟。
测试完以上代码后,你应该会看到浏览器的页面稍微往下滚动了一些。下一步我们要做的就是找到我们要下载的那些图片。在探索了一番 React 生成的代码之后,我发现了我们可以使用一个CSS 选择器 来定位到网页上画廊的图片。网页上的布局和代码在以后可能会发生改变,但目前我们可以使用 #gridMulti img
选择器来获得屏幕上可见的所有 <img>
元素。
我们可以通过 [find_elements_by_css_selector()](https://bbs.csdn.net/topics/618317507)
得到这些元素的一个列表,但我们想要的是这些元素的 src
属性。我们可以遍历这个列表并一一抽取出 src
来:
**import** time
**from** selenium **import** webdriver
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
# 选择图片元素并打印出他们的 URL
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
**for** image_element **in** image_elements:
image_url = image_element.get_attribute("src")
print(image_url) time
**from** selenium **import** webdriver
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
# 选择图片元素并打印出他们的 URL
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
**for** image_element **in** image_elements:
image_url = image_element.get_attribute("src")
print(image_url)
选择图片元素并获得图片 URL。
现在为了真正获得我们找到的图片,我们会使用 requests
库和 PIL
的部分功能,也就是 Image
。我们还会用到 io
库里面的 BytesIO
来将图片写到文件夹 ./images/
中(在项目文件夹中创建)。现在把这些都一起做了,我们要先往每张图片的 URL 链接发送一个 HTTP GET 请求 ,然后使用 Image
和 BytesIO
来将返回的图片 存储 起来。以下是实现这个功能的其中一种方式:
**import** requests
**import** time
**from** selenium **import** webdriver
**from** PIL **import** Image
**from** io **import** BytesIO
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
i = 0
**for** image_element **in** image_elements:
image_url = image_element.get_attribute("src")
# 发送一个 HTTP GET 请求,从响应内容中获得图片并将其存储
image_object = requests.get(image_url)
image = Image.open(BytesIO(image_object.content))
image.save("./images/image" + str(i) + "." + image.format, image.format)
i += 1 requests
**import** time
**from** selenium **import** webdriver
**from** PIL **import** Image
**from** io **import** BytesIO
### 最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划
![](https://img-blog.csdnimg.cn/d29631674929476f9c3b30f7ff58dff0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**