在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还是没有,都可以对各种网页中的数据进行定点观测。