在Ubuntu16.04的服务器上,通过自动运行Web浏览器来定时观测Web上的特定数据(第三部分)- 使用Cron自动运行方式

背景

我在网络上找到了实时变化的数据。我决定编写一个定期检查该值的程序,但是因为需要登录页面,编写爬虫代码很麻烦。为了解决这个问题,我决定使用selenium来操作Web浏览器并进行爬虫。我将把这个过程记录下来作为备忘录。

另外,我本可以使用我的个人电脑和网络浏览器进行批处理自动执行,但是……由于我不希望我的个人电脑上的常用浏览器自动启动会产生干扰,所以我决定在租用的服务器上(Ubuntu 16.04)自动运行。

以下是更具體的描述:
(1)通過Python啟動網頁瀏覽器 – 在第一部分中解釋了詳情
(2)使用Selenium操作網頁瀏覽器,處理Web數據 – 在第二部分中解釋了詳情
(3)將處理後的數據存儲到MongoDB中 – 在第三部分(本帖)中解釋了詳情
(4)通過cron自動執行執行(1)〜(3)的Python程序 – 在第三部分(本帖)中解釋了詳情
(5)在數值有一定變動的情況下通過郵件通知 – 在附加篇中解釋了詳情

因為已經成功製作出能夠自動獲取特定的網絡數據的程式,所以現在我們只需要設定這個程式以便在CRON中自動執行。

环境

操作系统:Ubuntu16.04(さくらVPS)
Python:版本3.5
MongoDB:版本2.6.10
PhantomJS:版本2.1.1

第一步)进行CRON的设置

# cronの動作確認
sudo service cron status

# cronの設定ファイルを編集
crontab -e

在crontab中,可以按照以下方式进行描述。

*/5 * * * * <path_to_python>/python3 /<path_to_file/test.py >> /<path_to_log>/test.log 2>>&1

只需将在Part1和Part2中编写的Python程序指定给作业,浏览器将在每5分钟自动启动并获取特定网站的特定数据。

第二步) 准备将获取的数据存储到数据库中。

从这里开始是额外的内容。我在初始设置的Ubuntu上创建了这个定点观测程序,所以顺便记下了关于DB存储的备忘录。

如果只需要将文本输出到txt文件中,那就没必要再写了。

f = open( "test.txt", "a+" )
f.write( data )
f.close

可以的。

我实际上将其存储在MongoDB中。

安装MongoDB

按照以下步骤进行安装。

1) 公開鍵の設定
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

2) mongodb.listの作成
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list

3) 実際にインストールする
sudo apt-get update
#sudo apt-get install mongodb-10gen

4) mongod.serviceの作成
sudo vim /lib/systemd/system/mongod.service

 ▼mongod.serviceの中身

 [Unit]
 Description=MongoDB Database Service
 Wants=network.target
 After=network.target

 [Service]
 ExecStart=/usr/bin/mongod --config /etc/mongod.conf
 ExecReload=/bin/kill -HUP $MAINPID
 Restart=always
 User=mongodb
 Group=mongodb
 StandardOutput=syslog
 StandardError=syslog

 [Install]
 WantedBy=multi-user.target

(参考链接)请访问此网址:http://qiita.com/pelican/items/bb9b5290bb73acedc282

安装pymongo

安装pymongo包来操作MongoDB,使用python语言。

pip3 install pymongo

启动MongoDB

sudo systemctl start mongod

第三步)通过浏览器的自动执行,完整观测定点的程序以获取网络数据。

综合考虑Part1、Part2和本篇文章,我将尝试编写一个简单的定点观测程序。

和第二部分一样,由于我无法公开观测到的数据,因此这次我将编写一个程序来自动获取在Qiita的热门文章中的帖子。

整理程序的内容如下:
(1)启动浏览器PhantomJS。
(2)自动登录Qiita并自动获取前20个帖子的标题。
(3)将(2)中获取的帖子标题存储到列表中,并输出到MongoDB。

实际的程序代码如下所示。

import time
import datetime

from selenium import webdriver
from bs4 import BeautifulSoup

URL = "https://qiita.com/"
USERID = "<YOUR_USER_ID>"
PASS = "<YOUR_PASSWORD>"

#PhantomJSの自動起動とQiitaへのアクセス
browser = webdriver.PhantomJS(executable_path='<path/to/phantomjs>')
browser.get(URL)
time.sleep(3)

#ログインページ
browser.find_element_by_id("identity").send_keys(USERID)
browser.find_element_by_id("password").send_keys(PASS)
browser.find_element_by_xpath('//input[@name="commit"]').click()
time.sleep(5)

#ホーム画面の投稿一覧の取得
html = browser.page_source.encode('utf-8')
soup = BeautifulSoup(html, "lxml")
posts_source = soup.select(".item-box-title > h1 > a")

#投稿名のデータ整理
posts = []
for i in (0,len(posts_source)):
 posts[i] = post.text.strip()

#定点観測の時刻を取得
output = {}
output["date"] = str(datetime.date.today())
output["datetime"] = str(datetime.datetime.today().strftime("%H:%M:%S"))
output["content"] = posts

#MongoDBへ格納
mongo = MongoClient('localhost:27017')
db = mongo_client["qiita"]
new_posts = db_connect["new_posts"]
new_posts.insert(output)

#ブラウザを閉じる  
browser.close()

就是这样的。通过在cron中定期执行该程序,它会从登录后的Qiita动态中记录20条最新的投稿标题。(由于这是一个用于测试的程序,没有实际用途)

如果应用这个程序,则无论是有GET/POST还是没有,都可以对各种网页中的数据进行定点观测。

广告
将在 10 秒后关闭
bannerAds