利用预构建的 Python Selenium 示例在 Docker 容器中设置自动化的、定时的抓取任务,轻松实现定时抓取,满足您的需求。
从单页应用框架(如 React、Vue.js 或 Angular)抓取数据可能非常棘手,尤其是在没有用户界面的情况下。这类应用程序很多使用与鼠标相关的交互或基于 JavaScript 计算状态。因此,Selenium 是从单页应用抓取数据的最佳选择。
完成抓取逻辑后,您通常需要按计划运行它,并将数据发送到数据库或其他服务。
这是一个 Docker 容器,包含了使用 Selenium 抓取器的完整示例,带有完整的用户界面。
使用示例
Docker 容器是“selenium grid standalone firefox”的一个分支。它使用一个完整集成的 VNC 服务器,可以帮助您“查看”抓取器当前正在执行的操作。
GitHub - therealthoren/python-selenium-scraper-template: Watch your python scraper with selenium in a docker container - GitHub[1]
首先,您克隆这个模板仓库。
然后输入所有您抓取逻辑所在目标仓库的详细信息。
在创建完您的仓库后,从您的仓库进行 git 克隆。
构建和运行 Docker
模板项目生成了一个名为“python-selenium-scraper-template”的 Docker 容器。如果您想修改,请更改文件 build.sh 和 run.sh。
您可以通过调用以下 shell 脚本来构建 Docker 容器。
chmod +x build.sh
sh build.sh
然后您可以通过运行以下命令来运行您的 Docker 容器:
chmod +x run.sh
sh run.sh
就是这样。现在您的抓取器会自动运行。
修改计划定时器
默认情况下,抓取器每 15 分钟调用一次。这仅用于测试目的,您可以通过修改相应的 Dockerfile 并重新构建它来更改此调度器。
dockerfile
...
RUN (crontab -l ; echo "*/15 * * * * /opt/scheduler.sh >> /var/log/cron/cron-scheduled.log 2>&1") | crontab
....
查看抓取器的运行状态
如果您想查看抓取器当前的运行情况,可以打开浏览器并访问地址:http://localhost:4444/ui/
保存抓取的数据 —— 包含 Python 示例
通常,您会希望将抓取的数据保存到数据库或发送到 API。在 app/scraper.py中有一个关于如何保存数据的示例。
如果您想将数据保存到 webhook 端点,可以使用 WebhookNotification。如果您想使用其他通知方式或自定义的通知方式,请在文件 app/notifier.py 中进行更改。
# 如果您想使用 Webhooks 作为通知,请使用以下代码行
# TODO: 将 Webhook URL 改为您的 URL 或实现您自己的接收数据的通知逻辑
####
# logic = LogicController(notification=WebhookNotification("http://your-scraped-data-receiver-url.com/endpoint"
# , only_finished=True))
####
# 通常您会使用 EmptyNotification,它只会将数据打印到控制台,您需要自己保存抓取的数据
logic = LogicController(notification=EmptyNotification())
这是来自 app/scraper.py 的示例抓取器的示例。
def runScraper(driver: WebDriver, logic: INotification):
# driver 是 selenium webdriver
# logic 默认是 "Empty Notification" - 它什么都不做
yourScrapedData = []
#### 在此处编写您的代码 ####
driver.get("https://www.google.de/")
sleep(1)
# 找到 button>div[contains(text(), '')]
button = driver.find_elements(By.XPATH, "//div//button//div[contains(text(), 'All')]")
if button is not None and len(button) > 0:
button[0].click()
sleep(2)
# 实现抓取逻辑
textareas = driver.find_elements(By.XPATH, "//textarea")
if textareas is not None and len(textareas) > 0:
textareas[0].send_keys("Hello World")
sleep(1)
textareas[0].send_keys(Keys.ENTER)
sleep(2)
# 点击第一个链接
links = driver.find_elements(By.XPATH, "//span//h3")
if links is not None and len(links) > 0:
logic.message("Clicking on the first link: "+links[0].text)
links[0].click()
logic.message("Title: " + driver.title)
#### 在此处编写您的代码 ####
sleep(2)
return yourScrapedData
快乐抓取!
感谢阅读.
更多信息
本文由笔者翻译整理自:https://medium.com/@thoren.lederer/automate-your-web-scraping-with-docker-schedule-python-selenium-scripts-on-cron-and-watch-the-a15511701a75,如对您有帮助,请帮忙点赞、转发、关注。谢谢!
References
[1] GitHub - therealthoren/python-selenium-scraper-template: Watch your python scraper with selenium in a docker container - GitHub: https://github.com/therealthoren/python-selenium-scraper-template
本文暂时没有评论,来添加一个吧(●'◡'●)