一直想用 Python 写一个网页爬虫,但一直没去实现。直到最近才决定动手,从网站上抓取一些漂亮的图片。这看起来似乎艰巨,但实际上极其简单。
简单图片爬虫的原料
- Python (3.6.3 或以上)
- PyCharm (社区版即可)
- pip install selenium
- pip install requests
- pip install pillow
- 正常的网络连接
- 你宝贵的时间
简单图片爬虫的菜谱
以上工具都安装好了?棒!在继续写代码前,先解释一下这些组件的作用。
我们要利用 Selenium WebDriver 和 Geckodriver 来打开浏览器窗口。首先,在 PyCharm 中新建项目,根据你的操作系统下载最新版的 Geckodriver,解压后将其文件拖到项目文件夹中。Geckodriver 本质上是让 Selenium 控制 Firefox 的工具。
接下来从 Selenium 中导入 webdriver,连接到想爬取的 URL:
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
url = "https://unsplash.com"
# 指定 geckodriver 路径,确保该文件可执行或在系统 PATH 中
driver = webdriver.Firefox(service=Service(r'./geckodriver.exe'))
driver.get(url)
打开浏览器窗口到指定 URL。
如果正确完成,你会看到一个远程控制的 Firefox 窗口。此时你已经攻克了最难的部分。
接下来需要向下滚动以便更多图片加载,然后才能下载。Unsplash 使用 React 构建,等待 5 秒足够网络慢的情况。使用 Python 的 time 包等待,并使用 JavaScript 代码滚动网页——调用 window.scrollTo() 函数。
import time
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
url = "https://unsplash.com"
driver = webdriver.Firefox(service=Service(r'./geckodriver.exe'))
driver.get(url)
# 向下滚动页面并且等待 5 秒钟
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
测试后,页面会稍微往下滚动。下一步是找到要下载的图片。探索 React 生成的代码后,发现可以使用 CSS 选择器定位画廊图片。目前可以使用 #gridMulti img 选择器获得屏幕上可见的所有 <img> 元素。
使用 find_elements 得到元素列表,遍历并抽取 src 属性:
from selenium.webdriver.common.by By
image_elements = driver.find_elements(By.CSS_SELECTOR, )
image_element image_elements:
image_url = image_element.get_attribute()
(image_url)


