拖鞋哥哥


很早以前他让我帮他写一篇文章,我立马答应了他但一直没有写,现在写起来觉得有些难度,不知道写些什么内容。技术我是不懂的随便写一点我们之间的故事吧。

我俩大概是在九月份认识的吧,算了也记不清楚了,这人挺有意思的加上我的微信说忘了我是哪个人了,哈哈,分分钟想打他。记得我们第一次约着出去玩那时候是刚下过雨他穿着拖鞋裤衩去见我,我问他为什么穿拖鞋他说鞋子踩水湿透了,这就是我们第一次见面也是第一次说话,说的就是你为什么穿着拖鞋就来了~~~~~~~~~

没在一起的时候他经常问我你觉得爱情是什么,这种空而大的问题我着实是回答不上来甚至觉得有些矫情,我记得我经常告诉他我崇尚柏拉图式的爱情,他不懂什么是柏拉图,自行百度后的他对我嗤之以鼻,我是一个追星女孩,我们为此吵过一架,最后大概是我赢吧。后来我把柏拉图爱情告诉了朋友,他总结说我并不是什么柏拉图崇尚者而是对爱情存在着一些不切实际的幻想缺乏安全感的表现,他说的不无道理但我也没有全部承认他说的完全正确。后来时间久了我发现关于什么是爱情这种空而大的问题我是无法回答的,只是觉得把握现在的就刚刚好了。

使用Python抓取12306火车信息,存入csv文件,仅介绍实现思路


马上就要年底过年了,提前去网站上请回家的票。神奇的抢到了硬座票,心里很是欣慰,今年终于不用站着回家了。
但是开心的时间总是那么短暂,一周过后我回来继续抢返程的火车票。真的是查了好几遍,都没有返程的车,多方验证之后发现没有返程的列车,所以……

网站抓取思路

打开12306的官方网站,按F12打开你的开发人员工具,找到Network标签,F5刷新一下,获取车站信息。

列车车次信息列表

获取车站信息

部分数据

var station_names ='@bjb|北京北|VAP|beijingbei|bjb|0@bjd|北京东|BOP|beijingdong|bjd|1@bji|北京|BJP|beijing|bj|2@bjn|北京南|VNP|beijingnan|bjn|3@bjx|北京西|BXP|beijingxi|bjx|4@gzn|广州南|IZQ|guangzhounan|gzn|…………
获取所有车次信息(朋友提供)

列车车次信息列表

车次详细信息查询

列车车次信息查询页面

查询到的信息

车次详细信息查询接口(G126为例)

按自己需求实现部分功能,部分功能不对外开放,仅介绍抓取思路
# -*- coding:utf-8 -*-
'''
车次信息查询页面
https://kyfw.12306.cn/otn/queryTrainInfo/init
车次信息查询接口
https://kyfw.12306.cn/otn/queryTrainInfo/query?leftTicketDTO.train_no=5i0000G12600&leftTicketDTO.train_date=2020-01-24&rand_code=

车站信息
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9138
车次信息
https://kyfw.12306.cn/otn/resources/js/query/train_list.js
'''
import json

import requests


class MainApp(object):
    def __init__(self):
        self.session = requests.session()

    def start(self):
        self.get_station_name()
        self.get_train_list()
        pass

    # 抓取火车车次信息
    def get_train_list(self):
        line = self.session.get('https://kyfw.12306.cn/otn/resources/js/query/train_list.js').text
        item = line.replace('var train_list =', '')
        json_now = json.loads(item)['2019-10-10']
        with open('train_list.csv', 'w+') as train_list_csv:
            train_list_csv.write('字段1,字段2,字段3,字段4,字段5,字段6,字段7')
            # 高铁
            for g in json_now['G']:
                print(g)
                no = g['train_no']
                station_train_code = str(g['station_train_code'])
                che = station_train_code[0:station_train_code.find('(')]
                se = station_train_code[station_train_code.find('(') + 1:-1].split('-')
                train_list_csv.write('\n%s,%s,%s,%s,%s,%s,%s' % (no, '高铁', 'G', che, se[0], se[1], '2019-10-10'))
            # 城际高铁
            for c in json_now['C']:
                print(c)
                no = c['train_no']
                station_train_code = str(c['station_train_code'])
                che = station_train_code[0:station_train_code.find('(')]
                se = station_train_code[station_train_code.find('(') + 1:-1].split('-')
                train_list_csv.write('\n%s,%s,%s,%s,%s,%s,%s' % (no, '城际高铁', 'C', che, se[0], se[1], '2019-10-10'))
            # 动车
            for d in json_now['D']:
                print(d)
                no = d['train_no']
                station_train_code = str(d['station_train_code'])
                che = station_train_code[0:station_train_code.find('(')]
                se = station_train_code[station_train_code.find('(') + 1:-1].split('-')
                train_list_csv.write('\n%s,%s,%s,%s,%s,%s,%s' % (no, '动车', 'D', che, se[0], se[1], '2019-10-10'))
            # 直达
            for z in json_now['Z']:
                print(z)
                no = z['train_no']
                station_train_code = str(z['station_train_code'])
                che = station_train_code[0:station_train_code.find('(')]
                se = station_train_code[station_train_code.find('(') + 1:-1].split('-')
                train_list_csv.write('\n%s,%s,%s,%s,%s,%s,%s' % (no, '直达', 'Z', che, se[0], se[1], '2019-10-10'))
            # 特快
            for t in json_now['T']:
                print(t)
                no = t['train_no']
                station_train_code = str(t['station_train_code'])
                che = station_train_code[0:station_train_code.find('(')]
                se = station_train_code[station_train_code.find('(') + 1:-1].split('-')
                train_list_csv.write('\n%s,%s,%s,%s,%s,%s,%s' % (no, '特快', 'T', che, se[0], se[1], '2019-10-10'))
            # 快速
            for k in json_now['K']:
                print(k)
                no = k['train_no']
                station_train_code = str(k['station_train_code'])
                che = station_train_code[0:station_train_code.find('(')]
                se = station_train_code[station_train_code.find('(') + 1:-1].split('-')
                train_list_csv.write('\n%s,%s,%s,%s,%s,%s,%s' % (no, '快速', 'K', che, se[0], se[1], '2019-10-10'))
            # 其他
            for o in json_now['O']:
                print(o)
                no = o['train_no']
                station_train_code = str(o['station_train_code'])
                che = station_train_code[0:station_train_code.find('(')]
                se = station_train_code[station_train_code.find('(') + 1:-1].split('-')
                train_list_csv.write('\n%s,%s,%s,%s,%s,%s,%s' % (no, '其他', 'O', che, se[0], se[1], '2019-10-10'))

    # 抓取火车站信息
    def get_station_name(self):
        line = self.session.get('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js').text
        item = line.replace('var station_names =\'', '').replace('\';', '').split('|')
        print(item)
        with open('station_name.csv', 'w+') as station_name_csv:
            station_name_csv.write('字段1,字段2,字段3,字段4,字段5,字段6')
            for i in item:
                if '@' in i:
                    station_name_csv.write('\n%s' % i)
                else:
                    station_name_csv.write(',%s' % i)


if __name__ == '__main__':
    main = MainApp()
    main.start()

抓取数据存入csv,后续会入库,提供个性化的查询,也会给出快捷跳转至12306官网查询页面,直接进行购票。

模拟正常人行为进行查询获取公共数据,防止对网站造成压力(我相信我做不到)

不做商业使用,进个人网站展示,展示功能不保证高可用,仅作学习交流分享出现。


高效率开发,分享我的开发工具,工具趁手才有生产力嘛


IntelliJ IDEA(有开源版本)

idea官方网站

IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一。

Intellij IDEA 最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行调试。

IntelliJ IDEA以前是收费软件,不过在2009年以后就开始推出了免费的社区开源版本。不过商用还是需要收费的。

idea界面截图

PyCharm(有开源版本)

PyCharm官方网站

PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

界面截图

WebStorm

WebStorm官方网站

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

界面截图

Eclipse

eclipse官方网站

Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++、PHP、Python等语言的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。

它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

eclipse界面

MyEclipse

MyEclipse官方网站

MyEclipse是一款功能强大的J2EE集成开发环境,由Genuitec公司发布,它是商用收费的。

MyEclipse 是对Eclipse IDE的扩展,利用它可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML、Struts、JSP、CSS、Javascript、SQL,Hibernate,Spring。

Navicat

产品地址

Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 数据库。它与 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Cloud、MongoDB Atlas、阿里云、腾讯云和华为云等云数据库兼容。你可以快速轻松地创建、管理和维护数据库。

界面截图

FinalShell

FinalShell 官方网站

本站关于FinalShell的介绍,摘自官网

FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.

界面截图

HBuilder

HBuilder 官网地址

HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE。 [1] HBuilder的编写用到了Java、C、Web和Ruby。HBuilder本身主体是由Java编写。

界面截图

UltraISO(软碟通)

UltraISO 中文官网

UltraISO软碟通是一款功能强大而又方便实用的光盘映像文件制作/编辑/转换工具,它可以直接编辑ISO文件和从ISO中提取文件和目录,也可以从CD-ROM制作光盘映像或者将硬盘上的文件制作成ISO文件。同时,你也可以处理ISO文件的启动信息,从而制作可引导光盘。使用UltraISO,你可以随心所欲地制作/编辑/转换光盘映像文件,配合光盘刻录软件烧录出自己所需要的光碟。

界面截图

Postman

Postman 官方网站

Postman是一个接口调试工具,我是这么用的,其他的咱也不知道。

Appium

Appium 官方网站

Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。Appium对IOS系统的支持得益于Dan Cuellar’s对于IOS自动化的研究。Appium也集成了Selendroid,来支持老android版本

界面截图

AirtestIDE

AirtestIDE 官方网站

跨平台的UI自动化测试编辑器,适用于游戏和App

界面截图

VMware Workstation

VMware Workstation 官网地址

借助 VMware 提供的软件定义的云计算、移动化、网络连接和安全性解决方案,构建或扩展您的数字化基础

界面截图

Typora

Typora 官方网站

Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如,不像其他编辑器的有编辑栏和显示栏。

推荐视图


推荐一款SSH连接工具,FinalShell 服务器管理,远程桌面加速软件,支持Windows,macOS,Linux


这应该是我最喜欢的连接工具了,好用支持中文

部分内容摘自官网,推荐大家使用这个,Java开发的连接工具,收费版本功能更加强大

FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.

特色功能:
免费海外服务器远程桌面加速,ssh加速,本地化命令输入框,支持自动补全,命令历史,自定义命令参数

Windows版下载地址:
http://www.hostbuf.com/downloads/finalshell_install.exe

macOS版下载地址:
http://www.hostbuf.com/downloads/finalshell_install.pkg

mac版安装路径
/Applications/FinalShell.app/Contents/Java/
配置文件路径
/Users/$USER/Library/FinalShell/

Linux版安装及教程:
http://www.hostbuf.com/t/1059.html

更新日志:
http://www.hostbuf.com/t/989.html

主要特性:
1.多平台支持Windows,macOS,Linux
2.多标签,批量服务器管理.
3.支持登录ssh和Windows远程桌面.
4.漂亮的平滑字体显示,内置100多个配色方案.
5.终端,sftp同屏显示,同步切换目录.
6.命令自动提示,智能匹配,输入更快捷,方便.
7.sftp支持,通过各种优化技术,加载更快,切换,打开目录无需等待.
8.服务器网络,性能实时监控,无需安装服务器插件.
9.内置海外服务器加速,加速远程桌面和ssh连接,操作流畅无卡顿.
10.双边加速功能,大幅度提高访问服务器速度.
11.内存,Cpu性能监控,Ping延迟丢包,Trace路由监控.
12.实时硬盘监控.
13.进程管理器.
14.快捷命令面板,可同时显示数十个命令.
15.内置文本编辑器,支持语法高亮,代码折叠,搜索,替换.
16.ssh和远程桌面均支持代理服务器.
17.打包传输,自动压缩解压.
18.支持rz,sz (zmodem)
19.多地点ping监控
20.命令输入框,支持自动补全,命令历史
21.自定义命令参数功能,可动态根据输入参数生成命令


拥有公网IP的宽带,内网实现域名动态解析,内网穿透


我为什么要做这个呢,是因为朋友家里有动态的公网ip,我那个羡慕呀,就想着搞一搞啦。

需要准备的材料

  • 域名一个
  • 拥有动态公网ip的宽带
  • 内网Centos一台

阿里云

  • 下载SDK,目前支持Java、php、python

JavaSDK 下载地址

PythonSDK 下载地址

phpSDK 下载地址

  • 这里我们只介绍解析记录的添加和删除

获取Accesskey,记得保存哦。

获取凭证

这里为了简单,我们直接编写shell脚本,实现动态域名解析

curl https://alidns.aliyuncs.com/?Action=AddDomainRecord
&DomainName=example.com
&RR=www
&Type=A
&Value=202.106.0.20
&<公共请求参数>
  • 添加定时执行使用centos系统定时器
crontab -e

* * * * * sleep 1; flock -xn /tmp/create.lock /opt/ddns.sh

上面的定时实现了每1秒,检测动态ip变动情况

腾讯云

文档地址

对照文档,修改执行地址即可。