• 【python】爬虫记录每小时金价


    数据来源:

    https://www.cngold.org/img_date/

    因为这个网站是数据随时变动的,用requests、BeautifulSoup的方式解析html的话,数据的位置显示的是“--”,并不能取到数据。

    所以采用webdriver访问网站,然后从界面上获取金价。

    1、建表

    在本地(服务器)上的mysql上建表,主要字段:sku、date_time、price,分别对应产品(也就是黄金)、时间、价格

    2、读取金价函数

    这个函数主要就是读取金价,并调用插入sql的函数:

    1. def extract_info(url,id):
    2. print('开始')
    3. chrome_options = Options()
    4. chrome_options.add_argument('--disable-infobars')
    5. chrome_options.add_argument('--window-size=1920,1080') # 可以设置浏览器窗口大小
    6. chrome_options.add_argument('--start-maximized') # 可以让浏览器窗口最大化
    7. chrome_options.add_argument('--disable-extensions') # 禁用扩展
    8. chrome_options.add_argument('--no-sandbox') # 以最高权限运行
    9. chrome_options.add_argument('--disable-dev-shm-usage') # 用于解决Chrome crash问题
    10. chrome_options.add_argument('--disable-browser-side-navigation') # 禁用浏览器端导航
    11. chrome_options.add_argument('--enable-automation') # 允许自动化
    12. chrome_options.add_argument("--headless") # 设置Chrome无头模式
    13. print('过程1')
    14. driver=webdriver.Chrome(options=chrome_options)
    15. driver.get(url)
    16. print('过程2')
    17. driver.maximize_window()
    18. #time.sleep(5)
    19. text_list=driver.find_element(by=webdriver.common.by.By.XPATH,value='//html/body/div[3]/div/div[2]/div/div[3]/table/tbody/tr/td[2]/font')
    20. price_hour=text_list.text
    21. sql = 'insert into reptile.gold_price_log values("' + str(id) + '","' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '",' + str(price_hour) + ');'
    22. print(sql)
    23. sql_insert(sql, id)

    数据插入函数:

    1. def sql_insert(sql,id):
    2. sql=sqlalchemy.text(sql)
    3. print(sql_getcnt(id))
    4. if sql_getcnt(id) == 0:
    5. try:
    6. con.execute(sql)
    7. con.commit()
    8. except:
    9. print('执行失败')
    10. print(sql)
    3、数据验证函数

    因为爬取数据的目标是每个小时记录一次,为了避免测试、调试的数据干扰,做一个验证的方法,如果这个小时已经有数据了,就不再运行上个函数了:

    1. def sql_getcnt(id):
    2. g_sql = '''
    3. select
    4. count(*) as cnt
    5. from reptile.gold_price_log
    6. where sku="黄金"
    7. and date_format(date_time,'%Y-%m-%d %H:00:00')="''' + datetime.datetime.now().strftime('%Y-%m-%d %H:00:00') + '''"
    8. order by sku desc
    9. ,date_time desc
    10. '''
    11. g_sql = sqlalchemy.text(g_sql)
    12. data = pd.read_sql_query(sql=g_sql, con=con, index_col=['cnt'])
    13. cnt = list(data.index)[0]
    14. #print(cnt)
    15. return cnt
    4、主方法
    1. url_list=['https://www.cngold.org/img_date/']
    2. sku_list=['黄金']
    3. for i in range(len(sku_list)):
    4. print(sql_getcnt(sku_list[i]))
    5. if sql_getcnt(sku_list[i])>100:
    6. time.sleep(random.uniform(1, 5))
    7. print(str(sku_list[i])+'已存在')
    8. else:
    9. url_id=url_list[i]
    10. extract_info(url_id,sku_list[i])

    有些写法是之前脚本复制过来的,所以偶尔会有些奇怪哈哈哈。

    5、配置每小时调用

    因为这个脚本是设置在了云服务器上,所以要在linux服务器上设置定时执行,我这边的逻辑是shell脚本调用python脚本,然后定时执行shell脚本。

    shell脚本内容:

    然后:

    crontab -e

    这样,就可以每小时记录金价了。

  • 相关阅读:
    助老服务机器人结构设计
    RatSLAM配置(MATLAB版)
    JDK8函数式编程
    模型推理详细步骤以及如何排查模型和参数字典对不上的问题:Missing key(s) in state_dict: xxxx
    环模制粒机设计(说明书+CAD)
    十种排序方法
    Linux之环境变量
    liunx禁ping 详解traceroute的不同用法
    Java项目:SSM物业缴费管理系统
    【OpenSSL】VC编译OpenSSL
  • 原文地址:https://blog.csdn.net/weixin_39407597/article/details/139376868