30分钟的Python Web抓取工具

我一直想使用Python和Selenium创建Web抓取工具已有一段时间了,但从未尝试过。 几天前,我决定试一下。 看起来很艰巨 ,编写代码以从Unsplash抓取一些漂亮的图像非常容易。

30分钟的Python Web抓取工具
图片来源: Blake Connally通过Unsplash.com

简单的图像抓取器的成分

一个简单的图像抓取器的配方

准备好一切了吗? 好! 在我们继续编写代码的过程中,我将解释所有这些成分的作用。

我们要利用的第一件事是将Selenium Webdrivergeckodriver结合使用,以打开一个浏览器窗口,可以为我们完成工作。 首先,请在Pycharm中创建一个项目,为您的操作系统下载最新版本的geckodriver,打开压缩文件并将geckodriver文件拖放到项目的文件夹中。 Geckodriver基本上是让Selenium能够控制Firefox的原因,因此我们需要在项目文件夹中使用它才能使用浏览器。

我们要做的下一步是将Webdriver从Selenium导入到我们的代码中并连接到我们想要的URL。 因此,让我们这样做:

30分钟的Python Web抓取工具
远程控制的Firefox窗口

很简单吧? 如果您已正确完成所有操作,则说明您已经过了最困难的部分,并且应该会看到类似于上图所示的浏览器窗口。

接下来,我们应该向下滚动,以便在下载图像之前可以加载更多图像。 我们还想等待几秒钟 ,以防连接速度慢并且图像没有完全加载。 由于Unsplash是由React构建的,因此等待大约5秒钟似乎是一个慷慨的时间范围,因此我们应该使用time包来做到这一点。 我们还希望使用一些Javascript代码来滚动页面-我们将使用window.scrollTo()完成此操作。 放在一起,您应该得到这样的结果:

测试完上面的代码后,您应该看到浏览器将页面向下滚动一点。 我们需要做的下一件事是从网站查找我们要下传的图像。 在深入研究React生成的代码之后,我发现我们可以使用CSS选择器来专门定位页面画廊中的图像。 页面的特定布局和代码将来可能会更改,但是在撰写本文时,我可以使用#gridMulti img选择器来获取出现在屏幕上的所有<img>元素。

我们可以使用find_elements_by_css_selector()获得这些元素的列表,但是我们想要的是每个元素的src属性。 因此,我们可以遍历列表并获取这些列表:

现在,实际获取我们发现的图像。 为此,我们将使用requestsPIL包的一部分,即Image 我们还希望使用io BytesIO将图像写入将在项目文件夹中创建的./images/文件夹。 因此,将所有内容放在一起,我们需要向每个图像的URL发送一个HTTP GET请求 ,然后使用ImageBytesIO存储在响应中获得的图像 这是执行此操作的一种方法:

这几乎是您下载一堆免费图像所需的全部。 显然,除非您想对设计进行原型设计并且只需要随机图像,否则此小刮板将无用。 因此,我花了一些时间通过添加更多功能来对其进行改进:

  • 允许用户指定搜索查询的命令行参数以及用于滚动的数字值,该参数允许页面显示更多图像以供下载。
  • 可定制的CSS选择器。
  • 基于搜索查询的定制结果文件夹
  • 如果需要,可以通过裁剪缩略图的URL来显示全高清图像
  • 基于URL的命名图像。
  • 在该过程结束时关闭浏览器窗口。

您可以(可能应该)尝试自己实现其中一些功能。 Web刮板的全功能版本可在此处获得 请记住,按照本文开头的说明,分别下载geckodriver并将其连接到您的项目。

局限性,考虑因素和未来改进

整个项目是一个非常简单的概念验证,可以了解如何完成网络抓取,这意味着可以通过此小工具进行很多改进:

  • 不将图片的原始上传者视为功劳,这是一个非常糟糕的主意。 Selenium绝对有能力解决此问题,因此每个图像都带有作者的名字。
  • Geckodriver不应放置在项目文件夹中,而应全局安装并成为PATH系统变量的一部分。
  • 搜索功能可以轻松扩展为包括多个查询,因此可以简化下载大量图像的过程。
  • 可以将默认浏览器从Firefox更改为Chrome,甚至可以将PhantomJS更改为这种项目。

From: https://hackernoon.com/30-minute-python-web-scraper-39d6d038e5da