30分钟的Python Web抓取工具
我一直想使用Python和Selenium创建Web抓取工具已有一段时间了,但从未尝试过。 几天前,我决定试一下。 看起来很艰巨 ,编写代码以从Unsplash抓取一些漂亮的图像非常容易。
简单的图像抓取器的成分
- Python (3.6.3或更高版本)
- Pycharm (社区版就可以了)
-
pip install requests Pillow selenium
- 壁虎驱动程序 (请参阅下面的说明)
- Mozlla Firefox (好像您没有安装它一样)
- 正常的互联网连接(显然)
- 30分钟的时间(可能更少)
一个简单的图像抓取器的配方
准备好一切了吗? 好! 在我们继续编写代码的过程中,我将解释所有这些成分的作用。
我们要利用的第一件事是将Selenium Webdriver与geckodriver结合使用,以打开一个浏览器窗口,可以为我们完成工作。 首先,请在Pycharm中创建一个项目,为您的操作系统下载最新版本的geckodriver,打开压缩文件并将geckodriver文件拖放到项目的文件夹中。 Geckodriver基本上是让Selenium能够控制Firefox的原因,因此我们需要在项目文件夹中使用它才能使用浏览器。
我们要做的下一步是将Webdriver从Selenium导入到我们的代码中并连接到我们想要的URL。 因此,让我们这样做:
很简单吧? 如果您已正确完成所有操作,则说明您已经过了最困难的部分,并且应该会看到类似于上图所示的浏览器窗口。
接下来,我们应该向下滚动,以便在下载图像之前可以加载更多图像。 我们还想等待几秒钟 ,以防连接速度慢并且图像没有完全加载。 由于Unsplash是由React构建的,因此等待大约5秒钟似乎是一个慷慨的时间范围,因此我们应该使用time
包来做到这一点。 我们还希望使用一些Javascript代码来滚动页面-我们将使用window.scrollTo()
完成此操作。 放在一起,您应该得到这样的结果:
测试完上面的代码后,您应该看到浏览器将页面向下滚动一点。 我们需要做的下一件事是从网站查找我们要下传的图像。 在深入研究React生成的代码之后,我发现我们可以使用CSS选择器来专门定位页面画廊中的图像。 页面的特定布局和代码将来可能会更改,但是在撰写本文时,我可以使用#gridMulti img
选择器来获取出现在屏幕上的所有<img>
元素。
我们可以使用find_elements_by_css_selector()
获得这些元素的列表,但是我们想要的是每个元素的src
属性。 因此,我们可以遍历列表并获取这些列表:
现在,实际获取我们发现的图像。 为此,我们将使用requests
和PIL
包的一部分,即Image
。 我们还希望使用io
BytesIO
将图像写入将在项目文件夹中创建的./images/
文件夹。 因此,将所有内容放在一起,我们需要向每个图像的URL发送一个HTTP GET请求 ,然后使用Image
和BytesIO
来存储在响应中获得的图像 。 这是执行此操作的一种方法:
这几乎是您下载一堆免费图像所需的全部。 显然,除非您想对设计进行原型设计并且只需要随机图像,否则此小刮板将无用。 因此,我花了一些时间通过添加更多功能来对其进行改进:
- 允许用户指定搜索查询的命令行参数以及用于滚动的数字值,该参数允许页面显示更多图像以供下载。
- 可定制的CSS选择器。
- 基于搜索查询的定制结果文件夹 。
- 如果需要,可以通过裁剪缩略图的URL来显示全高清图像 。
- 基于URL的命名图像。
- 在该过程结束时关闭浏览器窗口。
您可以(可能应该)尝试自己实现其中一些功能。 Web刮板的全功能版本可在此处获得 。 请记住,按照本文开头的说明,分别下载geckodriver并将其连接到您的项目。
局限性,考虑因素和未来改进
整个项目是一个非常简单的概念验证,可以了解如何完成网络抓取,这意味着可以通过此小工具进行很多改进:
- 不将图片的原始上传者视为功劳,这是一个非常糟糕的主意。 Selenium绝对有能力解决此问题,因此每个图像都带有作者的名字。
- Geckodriver不应放置在项目文件夹中,而应全局安装并成为
PATH
系统变量的一部分。 - 搜索功能可以轻松扩展为包括多个查询,因此可以简化下载大量图像的过程。
- 可以将默认浏览器从Firefox更改为Chrome,甚至可以将PhantomJS更改为这种项目。
From: https://hackernoon.com/30-minute-python-web-scraper-39d6d038e5da