1、搭载QT环境

按win+R输入 pip install pyqt5 下载QT5 当然也可以去Qt的官网的下载 ,使用命令行更快捷方便 所以建议使用命令行 ,去官网下载安装有它的好处就是不用自己安装 toosl
作者使用的是pyCharm 完成后期的后台程序设置,使用pyCharm 外部工具链接把Designer,pyUIC,qrcTopy程序加进去


2、主窗体设置

打Qt5主程序设置主窗体,设计完成保存为windows
添加到创建好的python项目中,然后选中单击右键-》External toosl-》Py UIC 将ui文件转换成py文件
windows.py

from PyQt5.QtGui import QPalette, QPixmap, QColor# result = []  # 保存车次分类后最后的数据# UI类
class Ui_MainWindow(object):# 设置UI的方法def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")  # 设置窗体对象名称MainWindow.resize(960, 786)  # 设置窗体大小MainWindow.setMinimumSize(QtCore.QSize(960, 786))  # 主窗体最小值MainWindow.setMaximumSize(QtCore.QSize(960, 786))  # 主窗体最大值self.centralwidget = QtWidgets.QWidget(MainWindow)  # 主窗体的widget控件self.centralwidget.setObjectName("centralwidget")  # 设置对象名称# 通过label控件显示顶部图片self.label_title_img = QtWidgets.QLabel(self.centralwidget)self.label_title_img.setGeometry(QtCore.QRect(0, 0, 960, 141))self.label_title_img.setObjectName("label_title_img")title_img = QPixmap('img/TE3.png')  # 打开顶部位图self.label_title_img.setPixmap(title_img)  # 设置调色板# 查询部分的widgetself.widget_query = QtWidgets.QWidget(self.centralwidget)self.widget_query.setGeometry(QtCore.QRect(0, 141, 960, 80))self.widget_query.setObjectName("widget_query")# 开启自动填充背景self.widget_query.setAutoFillBackground(True)palette = QPalette()  # 调色板类palette.setBrush(QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img/bg2.png')))  # 设置背景图片self.widget_query.setPalette(palette)  # 为控件设置对应的调色板即可# 出发地与对应的编辑框控件self.label = QtWidgets.QLabel(self.widget_query)self.label.setGeometry(QtCore.QRect(30, 30, 54, 12))self.label.setObjectName("label")self.textEdit = QtWidgets.QTextEdit(self.widget_query)self.textEdit.setGeometry(QtCore.QRect(80, 20, 104, 31))font = QtGui.QFont()  # 创建QFont()对象font.setPointSize(13)  # 设置编辑框字体大小的值self.textEdit.setFont(font)  # 设置编辑框字体self.textEdit.setObjectName("textEdit")  # 出发地对应编辑框对象名称# 目的地与对应的编辑框self.label_2 = QtWidgets.QLabel(self.widget_query)self.label_2.setGeometry(QtCore.QRect(220, 30, 54, 12))self.label_2.setObjectName("label_2")self.textEdit_2 = QtWidgets.QTextEdit(self.widget_query)self.textEdit_2.setGeometry(QtCore.QRect(270, 20, 104, 31))font = QtGui.QFont()font.setPointSize(13)self.textEdit_2.setFont(font)self.textEdit_2.setObjectName("textEdit_2")# 出发日与有对应的编辑框self.label_3 = QtWidgets.QLabel(self.widget_query)self.label_3.setGeometry(QtCore.QRect(410, 30, 54, 12))self.label_3.setObjectName("label_3")self.textEdit_3 = QtWidgets.QTextEdit(self.widget_query)self.textEdit_3.setGeometry(QtCore.QRect(460, 20, 104, 31))font = QtGui.QFont()font.setPointSize(13)self.textEdit_3.setFont(font)self.textEdit_3.setObjectName("textEdit_3")# 查询按钮self.pushButton = QtWidgets.QPushButton(self.widget_query)self.pushButton.setGeometry(QtCore.QRect(610, 20, 91, 31))self.pushButton.setObjectName("pushButton")# 选择车次类型的widgetself.widget_checkBox = QtWidgets.QWidget(self.centralwidget)self.widget_checkBox.setGeometry(QtCore.QRect(0, 220, 961, 35))self.widget_checkBox.setAutoFillBackground(False)self.widget_checkBox.setObjectName("widget_checkBox")# 开启自动填充背景self.widget_checkBox.setAutoFillBackground(True)palette = QPalette()  # 调色板类palette.setBrush(QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img/bg3.png')))  # 设置背景图片self.widget_checkBox.setPalette(palette)  # 设置调色板控件对应的方法即可# 显示车次类型文字self.label_type = QtWidgets.QLabel(self.widget_checkBox)self.label_type.setGeometry(QtCore.QRect(30, 9, 65, 16))font = QtGui.QFont()font.setPointSize(10)self.label_type.setFont(font)self.label_type.setObjectName("label_type")# 选择高铁self.checkBox_G = QtWidgets.QCheckBox(self.widget_checkBox)self.checkBox_G.setGeometry(QtCore.QRect(100, 9, 70, 17))font = QtGui.QFont()font.setPointSize(10)self.checkBox_G.setFont(font)self.checkBox_G.setObjectName("checkBox_GC")# 选择动车self.checkBox_D = QtWidgets.QCheckBox(self.widget_checkBox)self.checkBox_D.setGeometry(QtCore.QRect(258, 9, 63, 17))font = QtGui.QFont()font.setPointSize(10)self.checkBox_D.setFont(font)self.checkBox_D.setObjectName("checkBox_D")# 选择直达self.checkBox_Z = QtWidgets.QCheckBox(self.widget_checkBox)self.checkBox_Z.setGeometry(QtCore.QRect(415, 9, 63, 17))font = QtGui.QFont()font.setPointSize(10)self.checkBox_Z.setFont(font)self.checkBox_Z.setObjectName("checkBox_Z")# 选择特快self.checkBox_T = QtWidgets.QCheckBox(self.widget_checkBox)self.checkBox_T.setGeometry(QtCore.QRect(572, 9, 63, 17))font = QtGui.QFont()font.setPointSize(10)self.checkBox_T.setFont(font)self.checkBox_T.setObjectName("checkBox_T")# 选择快速self.checkBox_K = QtWidgets.QCheckBox(self.widget_checkBox)self.checkBox_K.setGeometry(QtCore.QRect(730, 9, 63, 17))font = QtGui.QFont()font.setPointSize(10)self.checkBox_K.setFont(font)self.checkBox_K.setObjectName("checkBox_K")# 通过label控件显示火车信息图片self.label_train_img = QtWidgets.QLabel(self.centralwidget)self.label_train_img.setGeometry(QtCore.QRect(0, 256, 960, 62))self.label_train_img.setObjectName("label_train_img")train_img = QPixmap('img/bg4.png')  # 打开火车信息位图self.label_train_img.setPixmap(train_img)  # 设置调色板# 显示车次信息的列表self.tableView = QtWidgets.QTableView(self.centralwidget)self.tableView.setGeometry(QtCore.QRect(0, 320, 960, 440))self.tableView.setObjectName("tableView")self.model = QStandardItemModel()# 创建存储数据的模式# 根据空间自动改变列宽度并且不可修改列宽度self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)# 设置表头不可见self.tableView.horizontalHeader().setVisible(False)# 纵向表头不可见self.tableView.verticalHeader().setVisible(False)# 设置表格内容文字大小font = QtGui.QFont()font.setPointSize(10)self.tableView.setFont(font)# 设置表格内容不可编辑self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)# 垂直滚动条始终开启self.tableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)# 主窗体设置主WidgetMainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)  # 调用retranslateUi方法显示窗体文字QtCore.QMetaObject.connectSlotsByName(MainWindow)  # 关联信号槽def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "爬票"))self.checkBox_T.setText(_translate("MainWindow", "T-特快"))self.checkBox_K.setText(_translate("MainWindow", "K-快速"))self.checkBox_Z.setText(_translate("MainWindow", "Z-直达"))self.checkBox_D.setText(_translate("MainWindow", "D-动车"))self.checkBox_G.setText(_translate("MainWindow", "GC-高铁"))self.label_type.setText(_translate("MainWindow", "车次类型:"))self.label.setText(_translate("MainWindow", "出发地:"))self.label_2.setText(_translate("MainWindow", "目的地:"))self.label_3.setText(_translate("MainWindow", "出发日:"))self.pushButton.setText(_translate("MainWindow", "查询"))
def show_MainWindow():app = QtWidgets.QApplication(sys.argv)  # 首先必须实例化QApplication类,作为GUI主程序入口MainWindow = QtWidgets.QMainWindow()  # 实例化QtWidgets.QMainWindow类,创建自带menu的窗体类型QMainWindowui = Ui_MainWindow()  # 实例UI类ui.setupUi(MainWindow)  # 设置窗体UIMainWindow.show()  # 显示窗体sys.exit(app.exec_())  # 当来自操作系统的分发事件指派调用窗口时,# 应用程序开启主循环(mainloop)过程,# 当窗口创建完成,需要结束主循环过程,# 这时候呼叫sys.exit()方法来,结束主循环过程退出,# 并且释放内存。为什么用app.exec_()而不是app.exec()?# 因为exec是python系统默认关键字,为了以示区别,所以写成exec_if __name__ == "__main__":if isStations() == False:  # 判断是否有所有车站的文件,没有就下载,有就直接显示窗体getStation()  # 下载所有车站文件show_MainWindow()  # 调用显示窗体的方法else:show_MainWindow()  # 调用显示窗体的方法

3、下载网站文件

在这之前我们的先去12306网站分析相关参数

获取完整的查票地址,注意每一个时期的地址是会发生改变的
创建用于下载网站文件的py文件,get_stations.py

import re
import  requests
import osdef getStation():# 发送请求获取所有车站名称,通过输入的站名称转化查询地址的参数url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9190'response = requests.get(url, verify=True)  # 请求并进行验证stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)  # 获取需要的车站名称stations = dict(stations)  # 转换为dicstations = str(stations)  # 转换为字符串类型否则无法写入文件write(stations)           #调用写入方法
def write(stations):file = open('stations.text', 'w', encoding='utf_8_sig')  # 以写模式打开文件file.write(stations)  # 写入数据file.close()
def read():file = open('stations.text', 'r', encoding='utf_8_sig')  # 以写模式打开文件data = file.readline()                                  #读取文件file.close()return datadef isStations():isStations = os.path.exists('stations.text')      #判断车站文件是否存在return isStations

4、车票信息的请求与显示

创建 query_request.py文件用于发现数据后的处理工作

from get_stations import *
import requests'''5-7 目的地 3  车次 6  出发地 8  出发时间 9  到达时间 10 历时 26 无坐 29 硬座24 软座 28 硬卧 33 动卧 23 软卧 21 高级软卧 30 二等座 31 一等座 32 商务座特等座
'''
data = []  # 用于保存整理好的车次信息
type_data = []  # 保存车次分类后最后的数据
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36','Cookie':'_uab_collina=162044599452968647580256; JSESSIONID=ABB3D0F36AA12C3E5DAD5CD1D3CFF031; ''RAIL_EXPIRATION=1620786883959; RAIL_DEVICEID=hu-C8-xxpDNSCuX_BiPS1CGOlxAyoXu-dncsv32QDPvmjG''R9Ua0AUywoyJ6FDeqRWMoixIIL24hbMf9ucn2MrHcPWjgYFJ6y6Fon9ihvKvZV8SIiGDYmZTuR-S2OLu3wyezmWPPO''un2B-v2BR_Q0wEYkIrBLIE8j; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u4E0''A%u6D77%2CSHH; _jc_save_fromDate=2021-05-08; _jc_save_toDate=2021-05-08; _jc_save_wfdc_flag=''dc; BIGipServerpassport=988283146.50215.0000; route=495c805987d0f5c8c84b14f60212447d; BIGipS''erverotn=417857802.50210.0000; BIGipServerportal=3084124426.17183.0000'}
def query(date, from_station, to_station):data.clear()  # 清空数据type_data.clear()  # 清空车次分类保存的数据# 查询请求地址url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(date, from_station, to_station)# 发送查询请求response = requests.get(url=url,headers=headers)# # 将json数据转换为字典类型,通过键值对取数据result = response.json()result = result['data']['result']# 判断车站文件是否存在if isStations() == True:stations = eval(read())  # 读取所有车站并转换为dic类型if len(result) != 0:  # 判断返回数据是否为空for i in result:# # 分割数据并添加到列表中tmp_list = i.split('|')# 因为查询结果中出发站和到达站为站名的缩写字母,所以需要在车站库中找到对应的车站名称from_station = list(stations.keys())[list(stations.values()).index(tmp_list[6])]to_station = list(stations.keys())[list(stations.values()).index(tmp_list[7])]# 创建座位数组,由于返回的座位数据中含有空既“”,所以将空改成--这样好识别seat = [tmp_list[3], from_station, to_station, tmp_list[8], tmp_list[9], tmp_list[10], tmp_list[32], tmp_list[31], tmp_list[30], tmp_list[21], tmp_list[23], tmp_list[33], tmp_list[28], tmp_list[24], tmp_list[29], tmp_list[26]]newSeat = []# 循环将座位信息中的空既“”,改成--这样好识别for s in seat:if s == "":s = "--"else:s = snewSeat.append(s)  # 保存新的座位信息data.append(newSeat)return data  # 返回整理好的车次信息# 获取高铁信息的方法
def g_vehicle():if len(data) != 0:for g in data:  # 循环所有火车数据i = g[0].startswith('G')  # 判断车次首字母是不是高铁if i:  # 如果是将该条信息添加到高铁数据中type_data.append(g)# 移除高铁信息的方法
def r_g_vehicle():if len(data) != 0 and len(type_data) != 0:for g in data:i = g[0].startswith('G')if i:  # 移除高铁信息type_data.remove(g)# 获取动车信息的方法
def d_vehicle():if len(data) != 0:for d in data:  # 循环所有火车数据i = d[0].startswith('D')  # 判断车次首字母是不是动车if i == True:  # 如果是将该条信息添加到动车数据中type_data.append(d)# 移除动车信息的方法
def r_d_vehicle():if len(data) != 0 and len(type_data) != 0:for d in data:i = d[0].startswith('D')if i == True:  # 移除动车信息type_data.remove(d)# 获取直达车信息的方法
def z_vehicle():if len(data) != 0:for z in data:  # 循环所有火车数据i = z[0].startswith('Z')  # 判断车次首字母是不是直达if i == True:  # 如果是将该条信息添加到直达数据中type_data.append(z)# 移除直达车信息的方法
def r_z_vehicle():if len(data) != 0 and len(type_data) != 0:for z in data:i = z[0].startswith('Z')if i == True:  # 移除直达车信息type_data.remove(z)# 获取特快车信息的方法
def t_vehicle():if len(data) != 0:for t in data:  # 循环所有火车数据i = t[0].startswith('T')  # 判断车次首字母是不是特快if i == True:  # 如果是将该条信息添加到特快车数据中type_data.append(t)# 移除特快车信息的方法
def r_t_vehicle():if len(data) != 0 and len(type_data) != 0:for t in data:i = t[0].startswith('T')if i == True:  # 移除特快车信息type_data.remove(t)# 获取快速车数据的方法
def k_vehicle():if len(data) != 0:for k in data:  # 循环所有火车数据i = k[0].startswith('K')  # 判断车次首字母是不是快车if i == True:  # 如果是将该条信息添加到快车数据中type_data.append(k)# 移除快速车数据的方法
def r_k_vehicle():if len(data) != 0 and len(type_data) != 0:for k in data:i = k[0].startswith('K')if i == True:  # 移除快车信息type_data.remove(k)

5、在主窗体中显示查票信息

注意这些方法是写在windows.py
(1)创建 get_time 和is_valid.date方法用判断日期是否有效

def get_time():# 获得当前时间时间戳now = int(time.time())# 转换为其它日期格式,如:"%Y-%m-%d %H:%M:%S"timeStruct = time.localtime(now)strTime = time.strftime("%Y-%m-%d", timeStruct)return strTimedef is_valid_date(str):'''判断是否是一个有效的日期字符串'''try:time.strptime(str, "%Y-%m-%d")return Trueexcept:return False

(2)创建车次分类复选事件处理方法

 # 将所有车次分类复选框取消勾选def checkBox_default(self):self.checkBox_G.setChecked(False)self.checkBox_D.setChecked(False)self.checkBox_Z.setChecked(False)self.checkBox_T.setChecked(False)self.checkBox_K.setChecked(False)# 高铁复选框事件处理def change_G(self, state):# 选中将高铁信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取高铁信息g_vehicle()# 通过表格显示该车型数据self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_g_vehicle()self.displayTable(len(type_data), 16, type_data)# 动车复选框事件处理def change_D(self, state):# 选中将动车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取动车信息d_vehicle()# 通过表格显示该车型数据self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_d_vehicle()self.displayTable(len(type_data), 16, type_data)# 直达复选框事件处理def change_Z(self, state):# 选中将直达车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取直达车信息z_vehicle()self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_z_vehicle()self.displayTable(len(type_data), 16, type_data)# 特快复选框事件处理def change_T(self, state):# 选中将特快车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取特快车信息t_vehicle()self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_t_vehicle()self.displayTable(len(type_data), 16, type_data)# 快速复选框事件处理def change_K(self, state):# 选中将快车信息添加到最后要显示的数据当中if state == QtCore.Qt.Checked:# 获取快速车信息k_vehicle()self.displayTable(len(type_data), 16, type_data)else:# 取消选中状态将移除该数据r_k_vehicle()self.displayTable(len(type_data), 16, type_data)

(3)创建messageDialog与displayTable方法分别用于非法输入的处理与车辆信息的显示

# 显示消息提示框,参数title为提示框标题文字,message为提示信息def messageDialog(self, title, message):msg_box = QMessageBox(QMessageBox.Warning, title, message)msg_box.exec_()# 显示车次信息的表格# train参数为共有多少趟列车,该参数作为表格的行。# info参数为每趟列车的具体信息,例如有座、无座卧铺等。该参数作为表格的列def displayTable(self, train, info, data):self.model.clear()for row in range(train):for column in range(info):# 添加表格内容item = QStandardItem(data[row][column])# 向表格存储模式中添加表格具体信息self.model.setItem(row, column, item)# 设置表格存储数据的模式self.tableView.setModel(self.model)

(4)创建on_click方法该方法用于查询事件的处理

# 查询按钮的单击事件def on_click(self):get_from = self.textEdit.toPlainText()  # 获取出发地get_to = self.textEdit_2.toPlainText()  # 获取到达地get_date = self.textEdit_3.toPlainText()  # 获取出发时间# 判断车站文件是否存在if isStations() == True:stations = eval(read())  # 读取所有车站并转换为dic类型# 判断所有参数是否为空,出发地、目的地、出发日期if get_from != "" and get_to != "" and get_date != "":# 判断输入的车站名称是否存在,以及时间格式是否正确if get_from in stations and get_to in stations and is_valid_date(get_date):# 获取输入的日期是当前年初到现在一共过了多少天inputYearDay = time.strptime(get_date, "%Y-%m-%d").tm_yday# 获取系统当前日期是当前年初到现在一共过了多少天yearToday = time.localtime(time.time()).tm_yday# 计算时间差,也就是输入的日期减掉系统当前的日期timeDifference = inputYearDay - yearToday# 判断时间差为0时证明是查询当前的查票,# 以及29天以后的车票。12306官方要求只能查询30天以内的车票if timeDifference >= 0 and timeDifference <= 28:from_station = stations[get_from]  # 在所有车站文件中找到对应的参数,出发地to_station = stations[get_to]  # 目的地data = query(get_date, from_station, to_station)  # 发送查询请求,并获取返回的信息self.checkBox_default()if len(data) != 0:  # 判断返回的数据是否为空# 如果不是空的数据就将车票信息显示在表格中self.displayTable(len(data), 16, data)else:self.messageDialog('警告', '没有返回的网络数据!')else:self.messageDialog('警告', '超出查询日期的范围内,''不可查询昨天的车票信息,以及29天以后的车票信息!')else:self.messageDialog('警告', '输入的站名不存在,或日期格式不正确!')else:self.messageDialog('警告', '请填写车站名称!')else:self.messageDialog('警告', '未下载车站查询文件!')

(5)在retranslateUi方法中分别加入以下代码

self.textEdit_3.setText(get_time())  # 出发日显示当天日期self.pushButton.clicked.connect(self.on_click)  # 查询按钮指定单击事件的方法self.checkBox_G.stateChanged.connect(self.change_G)  # 高铁选中与取消事件self.checkBox_D.stateChanged.connect(self.change_D)  # 动车选中与取消事件self.checkBox_Z.stateChanged.connect(self.change_Z)  # 直达车选中与取消事件self.checkBox_T.stateChanged.connect(self.change_T)  # 特快车选中与取消事件self.checkBox_K.stateChanged.connect(self.change_K)  # 快车选中与取消事件

到此结束,以下是运行结果






用PyQt5编辑 12306车票信息爬取程序相关推荐

  1. 12306车站信息爬取(4)——添加车票的票价信息

    在前三篇文章的基础上: 12306车站信息爬取(1)--输入条件的判断,包括出发站,到达站,和出发时间,并获取车次信息的链接 12306车站信息爬取(2)--输入出发站,到达站和出发时间,获取车次信息 ...

  2. 12306车站信息爬取(1)——输入条件的判断,包括出发站,到达站,和出发时间,并获取车次信息的链接

    12306车站信息的爬取是一个比较复杂的系统,爬取需要的信息不是很难,但是要将最终的结果做的完善和美观却不是那么容易.作为一个学习Python的新手,我想把练习和整理结合起来,希望大家可以相互交流和探 ...

  3. Python基础之12306车票信息抓取案例

    Python基础之12306车票信息抓取案例 注:12306上请求网址链接经常变化,需要随时检查更改(我已经修改三遍了),请求的数据也有小几率发生变动,所以也需要检查更改 2018-10-22 第四遍 ...

  4. 12306车站信息爬取(3)——余票信息的查询(内含prettytable和colorama模块)

    12306车站信息定向爬虫-可实现查询功能 这个程序可实现由键盘输入出发站.到达站.出发日期以及需要查询的天数,首先将全部代码给出,然后我会分块对该代码进行讲解.在此之前,先说一下思路: 1.首先从1 ...

  5. Python爬取12306车票信息

    Python3爬取12306车票信息 第一次写爬虫,咱从入门级--12306车票爬取 开始 我们要爬取的信息是https://www.12306.cn/index/上的车票信息 当我们选择出发地和目的 ...

  6. 广西人才网实习信息爬取与数据库存储实战

    广西人才网实习信息爬取与数据库存储实战 https://www.gxrc.com/ 大家好,我是W 项目介绍:本项目为CrawlSpider结合MySQL.MongoDB爬取求职网站信息的项目,目标是 ...

  7. 生成osm文件_超酷城市肌理!地理数据信息爬取方法大全(B篇)DEM+POI+OSM

    WENWEN:这一弹是对第一弹的补充和深化讲解,上一弹请点击常用的地理数据信息爬取方法大全(前期场地信息获取第一弹),关于DEM获取地形地理空间数据云提交任务一直在排队的问题,这个应该是官网的问题,不 ...

  8. python网易云热歌榜歌曲信息爬取(iframe框架内数据爬取,src为空)

    为一线医护人员加油! 为武汉加油! 为中国加油! 为世界加油! 此爬虫是本人参考了了一位前辈的文章,并修改和优化了代码: 1.改为python3环境: 2.优化了抓取的歌曲时长中带一长串小数的问题: ...

  9. python爬虫公众号_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

最新文章

  1. Dos一键清理系统垃圾教程
  2. 关于sqlite数据库在使用过程中应该注意以下几点
  3. 326. Power of Three
  4. Ubuntu 16.04下Caffe-SSD的应用(七)——制作自己的VOC2007数据集
  5. OpenCv:椭圆上点的计算方程
  6. 一个javascript框架应有的功能
  7. python实时数据流_python – 使用烧瓶web-app监控实时数据流
  8. Tunnels 状压DP+BFS
  9. Ubuntu18.04 命令行安装PyCharm
  10. “互联网+创新2.0”、“工业制造4.0战略”、“工业互联网
  11. 编写一个班级管理程序java_java课程设计(班级管理系统)
  12. 军工产品元器件筛选标准,军用品测试实验室
  13. TransCAD教程 | 北航综合交通试验课程内容
  14. win10如何添加linux开机引导,win10 linux 双系统怎么设置开机引导
  15. 十二种不常见密码及部分实现脚本
  16. html怎么做左侧广告,网站横幅怎么制作,html横幅广告代码
  17. 视频教程-使用 Unity 进行 Daydream 开发-其他
  18. 分布式ID生成算法——雪花算法
  19. odroid xu4安装ROS melodic+远程登录+Roboware 开发
  20. 实现调用阿里云API第一章——API请求与认证

热门文章

  1. 那些漏洞挖掘高手都是怎么挖漏洞的?
  2. 一个小的发现,求各位大佬来解答
  3. 「揭秘GP」VLDB 创始人:为什么和其他相比,Greenplum 是最好的
  4. 深度解析拉卡拉支付产品架构
  5. 伺服驱动器cn1引脚定义_伺服驱动器CN1引脚定义,和面板操作设置,跪求高手指点。说明书弄丢了。...
  6. 升级chrome后字体模糊的解决办法
  7. Cocos2d-x技能冷却还要等多久?---之游戏开发《赵云要格斗》(9)
  8. office办公文档doc、docx、xls、xlsx、ppt、pptx在线预览解决方案一,背景
  9. 传播智客黑马Java学习笔记_day06
  10. 「死磕Java并发编程」说说Java Atomic 原子类的实现原理