前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python】定时执行网站爬虫

【Python】定时执行网站爬虫

作者头像
会呼吸的Coder
发布2020-02-17 17:52:44
1.6K0
发布2020-02-17 17:52:44
举报
文章被收录于专栏:会呼吸的Coder会呼吸的Coder

今天我们额讨论如何使用Python,SQLite数据库与crontab工具将爬虫程序部署到服务器上并实现定时爬取存储

编写爬虫代码

编写一个爬虫程序,使用requestsbeautifulsoup4包爬取和解析Yahoo!股市-上市成交价排行与Yahoo!股市-上柜成交价排行的资料,再利用pandas包将解析后的展示出来。

代码语言:javascript
复制
import datetime
import requests
from bs4 import BeautifulSoup
import pandas as pd

def get_price_ranks():
    current_dt = datetime.datetime.now().strftime("%Y-%m-%d %X")
    current_dts = [current_dt for _ in range(200)]
    stock_types = ["tse", "otc"]
    price_rank_urls = ["https://tw.stock.yahoo.com/d/i/rank.php?t=pri&e={}&n=100".format(st) for st in stock_types]
    tickers = []
    stocks = []
    prices = []
    volumes = []
    mkt_values = []
    ttl_steps = 10*100
    each_step = 10
    for pr_url in price_rank_urls:
        r = requests.get(pr_url)
        soup = BeautifulSoup(r.text, 'html.parser')
        ticker = [i.text.split()[0] for i in soup.select(".name a")]
        tickers += ticker
        stock = [i.text.split()[1] for i in soup.select(".name a")]
        stocks += stock
        price = [float(soup.find_all("td")[2].find_all("td")[i].text) for i in range(5, 5+ttl_steps, each_step)]
        prices += price
        volume = [int(soup.find_all("td")[2].find_all("td")[i].text.replace(",", "")) for i in range(11, 11+ttl_steps, each_step)]
        volumes += volume
        mkt_value = [float(soup.find_all("td")[2].find_all("td")[i].text)*100000000 for i in range(12, 12+ttl_steps, each_step)]
        mkt_values += mkt_value
    types = ["上市" for _ in range(100)] + ["上柜" for _ in range(100)]
    ky_registered = [True if "KY" in st else False for st in stocks]
    df = pd.DataFrame()
    df["scrapingTime"] = current_dts
    df["type"] = types
    df["kyRegistered"] = ky_registered
    df["ticker"] = tickers
    df["stock"] = stocks
    df["price"] = prices
    df["volume"] = volumes
    df["mktValue"] = mkt_values
    return df

price_ranks = get_price_ranks()
print(price_ranks.shape)

这个的结果展示为

代码语言:javascript
复制
## (200, 8)

接下来我们利用pandas进行前几行展示

代码语言:javascript
复制
price_ranks.head()
price_ranks.tail()

接下来我们就开始往服务器上部署

对于服务器的选择,环境配置不在本课的讨论范围之内,我们主要是要讲一下怎么去设置定时任务。

接下来我们改造一下代码,改造成结果有sqlite存储。

代码语言:javascript
复制
import datetime
import requests
from bs4 import BeautifulSoup
import pandas as pd
import sqlite3

def get_price_ranks():
    current_dt = datetime.datetime.now().strftime("%Y-%m-%d %X")
    current_dts = [current_dt for _ in range(200)]
    stock_types = ["tse", "otc"]
    price_rank_urls = ["https://tw.stock.yahoo.com/d/i/rank.php?t=pri&e={}&n=100".format(st) for st in stock_types]
    tickers = []
    stocks = []
    prices = []
    volumes = []
    mkt_values = []
    ttl_steps = 10*100
    each_step = 10
    for pr_url in price_rank_urls:
        r = requests.get(pr_url)
        soup = BeautifulSoup(r.text, 'html.parser')
        ticker = [i.text.split()[0] for i in soup.select(".name a")]
        tickers += ticker
        stock = [i.text.split()[1] for i in soup.select(".name a")]
        stocks += stock
        price = [float(soup.find_all("td")[2].find_all("td")[i].text) for i in range(5, 5+ttl_steps, each_step)]
        prices += price
        volume = [int(soup.find_all("td")[2].find_all("td")[i].text.replace(",", "")) for i in range(11, 11+ttl_steps, each_step)]
        volumes += volume
        mkt_value = [float(soup.find_all("td")[2].find_all("td")[i].text)*100000000 for i in range(12, 12+ttl_steps, each_step)]
        mkt_values += mkt_value
    types = ["上市" for _ in range(100)] + ["上櫃" for _ in range(100)]
    ky_registered = [True if "KY" in st else False for st in stocks]
    df = pd.DataFrame()
    df["scrapingTime"] = current_dts
    df["type"] = types
    df["kyRegistered"] = ky_registered
    df["ticker"] = tickers
    df["stock"] = stocks
    df["price"] = prices
    df["volume"] = volumes
    df["mktValue"] = mkt_values
    return df

price_ranks = get_price_ranks()
conn = sqlite3.connect('/home/ubuntu/yahoo_stock.db')
price_ranks.to_sql("price_ranks", conn, if_exists="append", index=False)

接下来如果我们让他定时启动,那么,我们需要linux的crontab命令:

如果我们要设置每天的 9:30 到 16:30 之间每小时都执行一次

那么我们只需要先把文件命名为price_rank_scraper.py

然后在crontab的文件中添加

30 9-16 * * * /home/ubuntu/miniconda3/bin/python /home/ubuntu/price_rank_scraper.py

这样我们就成功的做好了一个定时任务爬虫

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 初级程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编写爬虫代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档