php抓取网页所有图片( 我一直想用PythonandSelenium创建一个网页爬虫,但从来没有实现它)

优采云 发布时间: 2022-02-09 20:03

  php抓取网页所有图片(

我一直想用PythonandSelenium创建一个网页爬虫,但从来没有实现它)

  

  我一直想用 Python 和 Selenium 创建一个网络爬虫,但一直没有解决。几天前,我决定试一试,这听起来可能很复杂,但编写代码从 Unsplash 中抓取一些漂亮的图像是很容易的。

  一个简单的图片爬虫的组件一个简单的图片爬虫的制作

  一切都安装好了吗?好的!按照我们的代码,我将开始解释我们每个爬虫成分的作用。

  首先,我们将结合 Selenium webdriver 和 geckodriver 打开一个适合我们的浏览器窗口。首先,在Pycharm中创建一个项目,根据你的系统下载最新的geckodriver,打开下载的zip文件,将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)

  

  远程控制的 Firefox 窗口

  很简单,对吧?如果你做的一切都正确,你已经克服了困难,你应该看到一个类似于上面显示的浏览器窗口。

  接下来,我们应该向下滚动页面,以便在下载之前可以加载更多图像。我们还需要等待几秒钟,以防网络连接缓慢,图片没有完全加载。由于 Unsplash 是基于 React 构建的,5 秒的等待似乎是一个合适的时间,所以我们使用 time 包进行等待操作。我们还需要使用一些 Javascript 代码来滚动页面。

  --- 我们将使用 window.scrollTo() 来做到这一点。把它们放在一起,你应该得到这样的代码:

  unscrape.py

  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)

  滚动页面并等待 5 秒

  测试完上面的代码,你应该会看到浏览器向下滚动了一点,接下来我们需要做的是在网页上找到我们要下载的那些图像。解析recat生成的代码后,发现我们可以在页面代码中使用CSS选择器来定位我们想要的图片。也许以后页面的具体布局和代码可能会发生变化,但是在我写代码的时候我们可以使用#gridMulti img选择器来获取屏幕上出现的所有项目

  标签元素

  我们可以使用这些标签元素的列表集合,但是我们想要的是每个标签元素的 src 属性。因此,我们可以遍历列表集合并获取它们:

  unscrape.py

  选择图像标签元素并打印它们的 URL

  现在,要实际获取我们找到的图像,我们将使用 requests 包和 PIL 包的一部分 Image。我们还需要使用 io 包中的 BytesIO 将图像写入 ./images/ 文件夹,我们需要在项目文件夹中创建该文件夹。所以,为了把所有东西放在一起,我们需要向每个图像的 URL 发送一个 HTTP GET 请求,然后使用 Image 和 BytesIO,我们可以将图像存储在我们得到的响应中,这是一种方法:

  unscrape.py

  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

  下载图片

  下载一堆免费图像几乎是您所需要的。显然,除非您想制作图像原型或只需要获取随机图像,否则这个小爬虫并没有多大用处。所以我花了一些时间通过添加更*敏*感*词*来改进它:

  您可以(并且可能应该)尝试自己实现其中的一些功能。网络爬虫的完整版本可在此处获得。记得单独下载 geckodriver 并将其连接到您的项目,如 文章 开头所述。

  限制、反思和未来改进

  这个整体项目是一个非常简单的概念验证,用于查看网络爬虫是如何实现的,这意味着可以做很多事情来改进这个小工具:

  本文所有译文仅作学习交流之用,转载请务必注明文章译者、出处及本文链接

  我们的翻译工作遵循 CC 协议。如果我们的工作侵犯了您的权利,请及时与我们联系。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线