提示:
高铁 : 二等座 + 学生票+ F位
火车: 默认硬卧 + 学生票(也可以选择硬座,将BuyTicket,py里w=='2'的注释打开即可)

为什么搞这个呢?因为每当开学的时候,我老是买不到票,这个气啊!都是卡准时间进的,但终归是手速不行,跟不上,不是在排队中,就是没票…后来就想,别人都能写脚本,我为啥不行,我也是计科人啊,所以就搜资料看视频,不断的加工,终于–还算是写出来了吧,虽然这个版本bug不断,抢票全靠运气

文章目录

  • 图片展示
  • 环境准备
  • 下载第三方库
  • 查票
  • 抢票
  • 查票+抢票
  • 完整代码
  • 总结

图片展示

视频不过审,就换图片了

运行,在控制台输入相应信息,查询车次

确认购票,输入车次前对应的次序,开始等待自动抢票(当前抢的是预售票,自动刷新)

最终抢票界面(一切顺利,大概4s左右订单就提交了)

环境准备

python解释器(python环境)
官网下载地址:https://www.python.org/downloads/windows/

谷歌驱动(chromedriver.exe)
下载地址:https://chromedriver.storage.googleapis.com/index.html

将下载解压后的驱动(chromedriver.exe)分别放到谷歌和python环境下
python环境放置位置

谷歌放置位置

下载第三方库

这里主要用到了就是一个交互和滑块检测

pip install selenium==4.1.1

这里建议指定版本下载,我最开始是默认版本(最新),出现闪退,就降版本了
pip下载慢的,看这篇https://blog.csdn.net/m0_58730471/article/details/128793934

查票

查票这里是接上一篇https://blog.csdn.net/m0_58730471/article/details/128881512
在原基础上进行了部分修改(city.json文件在上一行给的文章里)

# 数据请求模块
import requests
# 序列化和反序列化
import json
# 表格格式输出(美化输出)
import prettytable as pt
import datetime
#导入自定义模块
import BuyTicket as buy# 读取city.json文件
f = open('city.json', mode='r', encoding='utf-8')
text = f.read()
city_json = json.loads(text)#进行查票(在指定乘车日期+指定出发时间段+有票)
flag=False
while True:print()print("========================开始购票============================")print()while True:from_station = input('请输入你的出发地: ')try:city_json[from_station]breakexcept:print()print("出发地不存在,或输入不正确")print()while True:to_station = input('请输入你的目的地: ')try:city_json[to_station]breakexcept:print()print("目的地不存在,或输入不正确")print()version=input("乘车类型(高铁-1,火车-2,所有车次-3):")# 购票日期while True:# 获取当前系统时间now1 = datetime.datetime.now().strftime('%Y-%m-%d')now=now1.split('-')train_date1 = input('请输入乘车时间(格式:'+now1+'): ')train_date=train_date1.split('-')# 判断输入合法性# 判断日期时间是不是满足要求(当天+后继14天)if len(train_date)==3:if len(train_date[0])==4 and train_date[0]>=now[0]:if len(train_date[1])==2 and '00'<train_date[1]<='12':if len(train_date[2])==2 and '00'<train_date[2]<='31':date2=datetime.datetime.strptime(now1[0:10],"%Y-%m-%d")date1=datetime.datetime.strptime(train_date1[0:10],"%Y-%m-%d")if 0<=(date1-date2).days<15:breakprint("日期输入有误,请再次输入!!!")# 出发时间段while True:times=input("输入想要购票的时间段(24小时制)(例:10-14):").split('-')try:if len(times)==2:if 0<=int(times[0])<=int(times[1]) and int(times[1])<=23:breakelse:print("是时间,24小时制的时间(0-23),不要闹好不好")else:print("再闹没票了啊!!!")except:print("还闹,不管你了啊!!!")#访问urlurl = "https://kyfw.12306.cn/otn/leftTicket/queryZ?"#携带的请求参数data = {'leftTicketDTO.train_date': train_date1,'leftTicketDTO.from_station': city_json[from_station],'leftTicketDTO.to_station': city_json[to_station],'purpose_codes': 'ADULT'}#携带验证信息headers = {'Cookie': '_uab_collina=167499505748263902067472; JSESSIONID=EBB7BB72E53FB9EBDF572A1FB5F9501F; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6D1B%u9633%u9F99%u95E8%2CLLF; _jc_save_toStation=%u5B89%u9633%u4E1C%2CADF; _jc_save_wfdc_flag=dc; RAIL_EXPIRATION=1675700441381; RAIL_DEVICEID=qe8Urc4t2EKH4vO7M9o074ICj3yjpgbyj6OtWFWizKxzSPkD_UHtsq7uqt8EQlU55v57L_ra7h0HgkwUIhuajVkSm8Xi2ezDrFIWl_hg05ZDcuvwTrwHWNsc_x8MN4x5Cippb8ILX9U_2zwe6DDHxtxMZKiYeaPb; BIGipServerotn=2229797130.50210.0000; BIGipServerpassport=803733770.50215.0000; fo=g4nfuizb5y3uxsafrbjh5eUbePmfMzR2ut8WtkFjj-THCc1n0cQeaR31JlgmsQqwW4_p2scXT7hb1zuzVv6lD-UTrEDL4xtGjZOZt_R1KOPDlO6bldWB3bhMNDZEwYqudPnSoV-jLO-sxKJEfVSftKitQTlFTNd5fVAaVfDwHX0hm7lPEYM4aBB0bwI; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_toDate=2023-02-04; _jc_save_fromDate=2023-02-12',}# 发送请求res = requests.get(url=url, params=data, headers=headers)# 自动转码(中文乱码)res.encoding = res.apparent_encodingprint(res)# 获得携带的需求数据result=res.json()['data']['result']# 数据格式化tb=pt.PrettyTable()if version=='1':# 高铁tb.field_names=['次序','车次','出发时间','到达时间','耗时','特等座','一等','二等',]elif version=='2':# 火车tb.field_names=['次序','车次','出发时间','到达时间','耗时','软卧','硬卧','硬座','无座',]else:# 表头(所有车次)tb.field_names=['次序','车次','出发时间','到达时间','耗时','特等座','一等','二等','软卧','硬卧','硬座','无座',]#遍历拆分数据page=1for index in result:# requests.utils.unquote(index)# index_list = index.replace('有', 'Yes').replace('无', 'No').split('|')index_list = index.split('|')# print(index_list)train_number = index_list[3]  # 车次time_1 = index_list[8]  # 出发时间time_2 = index_list[9]  # 到达时间use_time=index_list[10] # 耗时# 高铁prince_seat = index_list[32]  # 特等座first_class_seat = index_list[31]  # 一等座second_class = index_list[30]  # 二等座# 火车hard_seat = index_list[29]  # 硬座no_seat = index_list[26]  # 无座soft_sleeper = index_list[23]  # 软卧hard_sleeper = index_list[28]  # 硬卧# 指定时间段if int(times[0])<=int(time_1.split(':')[0])<=int(times[1]):# 高铁if version=='1' and train_number[0]=='G':if prince_seat!='无' or first_class_seat!='无' or second_class!='无':# 表格内容tb.add_row([page,train_number,time_1,time_2,use_time,prince_seat,first_class_seat,second_class,])# 火车 elif version=='2' and train_number[0]!='G':if hard_seat!='无' or no_seat!='无' or soft_sleeper!='无' or hard_sleeper!='无':# 表格内容tb.add_row([page,train_number,time_1,time_2,use_time,soft_sleeper,hard_sleeper,hard_seat,no_seat,])# 所有车次 elif version!='1' and version!='2':# 表格内容tb.add_row([page,train_number,time_1,time_2,use_time,prince_seat,prince_seat,second_class,soft_sleeper,hard_sleeper,hard_seat,no_seat,])page+=1print(tb)print()print()

抢票

这里是自己瞎搞的,也确实能买到票,但终归是小白入门,所以嗯哼~

思路:
1 访问网址,填写账号密码,点击登录
2 借助网上大神的解释,解决滑块验证
3 后面就是查找出发地、目的地、日期的对应位置,填入预订信息
4 去检测指定车次的预订位置

判断指定位置的内容:
是预订,就点击跳转,进入下一页,选择乘车人信息
如果是16点起售,就是没到放票时间,不断刷新

5 选择乘车人信息(指定选择了第一个)
6 解决学生票弹窗(我是学生,所以购买的学生票,点击的是)
7 提交订单,选择车位(选的F位,两人位靠窗,多爽啊)
8 狂刷点击确定,直到出现订单提交(这时候别退,要多等一会儿,确保买到票)
9 嗯~,没有了,目前就这些(但是技术不断变化,当前可行,可能一段时间就GG了)
10 对了,有一个问题,有时候都到预定了,一点机预订,会二次弹出账号密码登录,我试着写了,但没解决,后来代码写成了现在这b样子,就不想动他了,终归遇到的次数不多,也就这样了,后续了解了,继续优化

注意:
ser = Service(f’D:\Python\chromedriver.exe’)
里面的路径就是最开始环境搭建时候下载的驱动在python中的放置位置
#账号(后面是你的登录账号,一般就用手机哈)
driver.find_element_by_css_selector(‘#J-userName’).send_keys(‘137xxxxxxxx’)
#密码(这个填入的是你的账号对应的密码)
driver.find_element_by_css_selector(‘#J-password’).send_keys(‘123hdsjdwe’)

BuyTicket.py

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#from password import account, password
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 导入动作链对应的类
from selenium.webdriver import ActionChains
# 反检测
from selenium.webdriver import ChromeOptions
from time import sleep# 购票
def buy_ticket(num,from_station,to_station,sendData,w):option=ChromeOptions()# 谷歌驱动路径ser = Service(f'D:\Python\chromedriver.exe')# 实现规避检测option.add_experimental_option('excludeSwitches', ['enable-automation'])option.add_experimental_option("detach", True)# 定义为全局,避免窗口一闪而过global driverdriver=webdriver.Chrome(service=ser,options=option)# 隐式等待5sdriver.implicitly_wait(10)driver.get("https://kyfw.12306.cn/otn/resources/login.html")# 采取去除特征识别,即以下两行代码。script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'driver.execute_script(script)# js = 'return window.navigator.webdriver'# print(driver.execute_script(js))   # 可以直接在终端输出webdriver检测结果#账号(后面是你的登录账号,一般就用手机哈)driver.find_element_by_css_selector('#J-userName').send_keys('137xxxxxxxx')#密码(这个填入的是你的账号对应的密码)driver.find_element_by_css_selector('#J-password').send_keys('123hdsjdwe')#点击登录driver.find_element_by_css_selector('#J-login').click()sleep(0.5)#找到滑块div_TAG=driver.find_element(By.ID,"nc_1_n1z")# 动作链action=ActionChains(driver)# 点击并长按指定的标签action.click_and_hold(div_TAG)# 渐移for i in range(6):#perform() 立即执行动作链操作# move_by_offset(x,y): x 水平方向 y数值方向 两个参数action.move_by_offset(50,0).perform()sleep(0.5)action.release().perform()# 绕过检测# driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {#     "source": """#                 Object.defineProperty(navigator, 'webdriver', {#                     get: () => undefined#                 })#                 """# })#回车# driver.find_element_by_css_selector('#link_for_ticket').send_keys(Keys.ENTER)# 通过元素定位, 点击车票预定driver.find_element_by_css_selector('#link_for_ticket').click()# 始发地点 =======================================# 通过元素定位, 点击键盘回车# driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)# 通过元素定位, 清空输入框内容driver.find_element_by_css_selector('#fromStationText').clear()# 通过元素定位, 点击一下输入框driver.find_element_by_css_selector('#fromStationText').click()# 通过元素定位, 输入出发城市driver.find_element_by_css_selector('#fromStationText').send_keys(from_station)# 通过元素定位, 点击键盘回车driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)# 终点地点====================================driver.find_element_by_css_selector('#toStationText').clear()driver.find_element_by_css_selector('#toStationText').click()driver.find_element_by_css_selector('#toStationText').send_keys(to_station)driver.find_element_by_css_selector('#toStationText').send_keys(Keys.ENTER)# 购票时间====================================driver.find_element_by_css_selector('#train_date').clear()driver.find_element_by_css_selector('#train_date').click()driver.find_element_by_css_selector('#train_date').send_keys(sendData)driver.find_element_by_css_selector('#train_date').send_keys(Keys.ENTER)#===========================循环抢票=====================================#思路:(自己瞎搞的,小白入门)# 如果预订点击有效,会进行页面跳转,url发生变化,所以去捕获url,变化了,就是有票了(买买买买....),# 不跳转就刷寻查询,继续判断(这里默认为时无法预订导致的url不变,# 其实还有一种情况就是,跳转了,只是代码执行太快了,页面还没加载上就又去获取了ulr2,url2和url1一样了)# 哈哈哈,很垃圾,见笑见笑,小白,纯纯小白。while True:# 点击查询try:driver.find_element_by_css_selector('#query_ticket').click()except:break#获取当前urlurl1=driver.current_url#============================ 预订============================ # 获取指定位置内容 # 内容为预订,就点击购票 # 内容为16点起售,就是还没有放票,就不断的查询刷新#queryLeftTable tr:nth-child(1) .no-br  16点起售try:content= driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*num-1}) .no-br').textexcept:breakif content=='预订':try:driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*num-1}) .btn72').click()except:breakelse:continue#在测试的时候,在点击预订后,会弹出您尚未登录,让重新登录#所以就想着把之前的登录操作在搞一遍就是了,但是后边又突然不出现二次登陆了,所以这一块儿对于二次登录弹窗#不知道可行不,还得测试try:    login=driver.find_element_by_css_selector(f'#login > div.modal-login-tit > h2').textif login=='您尚未登录':#账号driver.find_element_by_css_selector('#J-userName').send_keys('137xxxxxxxx')#密码driver.find_element_by_css_selector('#J-password').send_keys('123sahdjahdj')#点击登录driver.find_element_by_css_selector('#J-login').click()#找到滑块div_TAG=driver.find_element(By.ID,"nc_1_n1z")# 动作链action=ActionChains(driver)# 点击并长按指定的标签action.click_and_hold(div_TAG)# 渐移for i in range(2):#perform() 立即执行动作链操作# move_by_offset(x,y): x 水平方向 y数值方向 两个参数action.move_by_offset(150,0).perform()action.release().perform()except:passfinally:try:#获取当前urlurl2=driver.current_urlif driver.find_element_by_css_selector(f'#normal_passenger_image_id').text=='乘车人':break# 判断url不一样,就是发生了页面跳转print("url2==================================="+url2)if url1!=url2:breakexcept:continue     #==============================================================#==================================================================================# # 买票(默认选第一乘车人和F座)# 选择乘车人driver.find_element_by_css_selector('#normalPassenger_0').click()# 学生票选择(确定买)driver.find_element_by_css_selector('#dialog_xsertcj_ok').click()# 提交订单driver.find_element_by_css_selector('#submitOrder_id').click()# 选座位(F位) 高铁选座位,火车就直接确定了if w=='1':driver.find_element_by_css_selector('#erdeng1 > ul:nth-child(4) > li:nth-child(2) a').click()#火车如果选择硬座,请打开该注释,不打开默认选的硬卧# if w=='2':#     driver.find_element_by_css_selector('#seatType_1 > option:nth-child(2)').click()#订单确认(进入待支付状态)try:while True:    driver.find_element_by_css_selector('#qr_submit_id').click()except:print()print()print('||======================================||')print('||                                      ||')print("||  购票成功,请在10分钟内完成支付 ! ! ! ||")print('||                                      ||')print('||======================================||')print()print()return# buy_ticket(5,'洛阳龙门','安阳东','2023-02-09','2')

查票+抢票

在前面有对应的校验

出发地
目的地
日期(2023-02-05格式的,只能是当前日期或者后推14天的日期,只预售15天,还带上当天)
发车时间段(24小时制的0-23)

查询车次之后,打印的带一个次序号,想要乘坐那个车,就输入对应的车次号
在这里有一点就是,对应车次的预订按钮变化是(1,3,5,7,9,奇数)式的,后边做了处理就是(2*num-1),总归就是坐哪个车就输入对应的次序(例:G656–>7)

连接纽扣

while True:if version=='1' or version=='2':choise=input("是否开始购票-----(Y/N)")print()print()if choise=='Y' or choise=='y':Train_number=int(input("输入预购票车次序号(例:6):"))while True:try:buy.buy_ticket(Train_number,from_station,to_station,train_date1,version)flag2=Truebreakexcept:print()print()print('购票失败!!!')print()print()#跳出当前购票,并终止程序if flag2:flag=Truebreakelif choise=='N' or choise=='n':# 是否继续查询判定again = input('是否继续查询(Y/N): ')if again == 'Y' or again == 'y':breakelse:flag=Truebreakelse:x=input('所有车次展示完毕,如需购票(高铁输入--1, 火车输入--2,再次查询--3): ')if x=='1' or x=='2':version=xelse:break# 终止程序if flag:print()print('=======================程序已退出=========================')print()print()print()break

完整代码

里面导入的BuyTicket就是抢票对应的代码
#导入自定义模块
import BuyTicket as buy

最终的文件夹里放的就是这三个

抢票终极版.py

# 数据请求模块
import requests
# 序列化和反序列化
import json
# 表格格式输出(美化输出)
import prettytable as pt
import datetime
#导入自定义模块
import BuyTicket as buy# 读取city.json文件
f = open('city.json', mode='r', encoding='utf-8')
text = f.read()
city_json = json.loads(text)#进行查票(在指定乘车日期+指定出发时间段+有票)
flag=False
while True:print()print("========================开始购票============================")print()while True:from_station = input('请输入你的出发地: ')try:city_json[from_station]breakexcept:print()print("出发地不存在,或输入不正确")print()while True:to_station = input('请输入你的目的地: ')try:city_json[to_station]breakexcept:print()print("目的地不存在,或输入不正确")print()version=input("查询车辆信息(高铁-1,火车-2,所有车次-3):")# 购票日期while True:# 获取当前系统时间now1 = datetime.datetime.now().strftime('%Y-%m-%d')now=now1.split('-')train_date1 = input('请输入乘车时间(格式:'+now1+'): ')train_date=train_date1.split('-')# 判断输入合法性# 判断日期时间是不是满足要求(当天+后继14天)if len(train_date)==3:if len(train_date[0])==4 and train_date[0]>=now[0]:if len(train_date[1])==2 and '00'<train_date[1]<='12':if len(train_date[2])==2 and '00'<train_date[2]<='31':date2=datetime.datetime.strptime(now1[0:10],"%Y-%m-%d")date1=datetime.datetime.strptime(train_date1[0:10],"%Y-%m-%d")if 0<=(date1-date2).days<15:breakprint("日期输入有误,请再次输入!!!")# 出发时间段while True:times=input("输入想要购票的时间段(24小时制)(例:10-14):").split('-')try:if len(times)==2:if 0<=int(times[0])<=int(times[1]) and int(times[1])<=23:breakelse:print("是时间,24小时制的时间(0-23),不要闹好不好")else:print("再闹没票了啊!!!")except:print("还闹,不管你了啊!!!")#访问urlurl = "https://kyfw.12306.cn/otn/leftTicket/queryZ?"#携带的请求参数data = {'leftTicketDTO.train_date': train_date1,'leftTicketDTO.from_station': city_json[from_station],'leftTicketDTO.to_station': city_json[to_station],'purpose_codes': 'ADULT'}#携带验证信息headers = {'Cookie': '_uab_collina=167499505748263902067472; JSESSIONID=EBB7BB72E53FB9EBDF572A1FB5F9501F; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6D1B%u9633%u9F99%u95E8%2CLLF; _jc_save_toStation=%u5B89%u9633%u4E1C%2CADF; _jc_save_wfdc_flag=dc; RAIL_EXPIRATION=1675700441381; RAIL_DEVICEID=qe8Urc4t2EKH4vO7M9o074ICj3yjpgbyj6OtWFWizKxzSPkD_UHtsq7uqt8EQlU55v57L_ra7h0HgkwUIhuajVkSm8Xi2ezDrFIWl_hg05ZDcuvwTrwHWNsc_x8MN4x5Cippb8ILX9U_2zwe6DDHxtxMZKiYeaPb; BIGipServerotn=2229797130.50210.0000; BIGipServerpassport=803733770.50215.0000; fo=g4nfuizb5y3uxsafrbjh5eUbePmfMzR2ut8WtkFjj-THCc1n0cQeaR31JlgmsQqwW4_p2scXT7hb1zuzVv6lD-UTrEDL4xtGjZOZt_R1KOPDlO6bldWB3bhMNDZEwYqudPnSoV-jLO-sxKJEfVSftKitQTlFTNd5fVAaVfDwHX0hm7lPEYM4aBB0bwI; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_toDate=2023-02-04; _jc_save_fromDate=2023-02-12',}# 发送请求res = requests.get(url=url, params=data, headers=headers)# 自动转码(中文乱码)res.encoding = res.apparent_encodingprint(res)# 获得携带的需求数据result=res.json()['data']['result']# 数据格式化tb=pt.PrettyTable()if version=='1':# 高铁tb.field_names=['次序','车次','出发时间','到达时间','耗时','特等座','一等','二等',]elif version=='2':# 火车tb.field_names=['次序','车次','出发时间','到达时间','耗时','软卧','硬卧','硬座','无座',]else:# 表头(所有车次)tb.field_names=['次序','车次','出发时间','到达时间','耗时','特等座','一等','二等','软卧','硬卧','硬座','无座',]#遍历拆分数据page=1for index in result:# requests.utils.unquote(index)# index_list = index.replace('有', 'Yes').replace('无', 'No').split('|')index_list = index.split('|')# print(index_list)train_number = index_list[3]  # 车次time_1 = index_list[8]  # 出发时间time_2 = index_list[9]  # 到达时间use_time=index_list[10] # 耗时# 高铁prince_seat = index_list[32]  # 特等座first_class_seat = index_list[31]  # 一等座second_class = index_list[30]  # 二等座# 火车hard_seat = index_list[29]  # 硬座no_seat = index_list[26]  # 无座soft_sleeper = index_list[23]  # 软卧hard_sleeper = index_list[28]  # 硬卧# 指定时间段if int(times[0])<=int(time_1.split(':')[0])<=int(times[1]):# 高铁if version=='1' and train_number[0]=='G':if prince_seat!='无' or first_class_seat!='无' or second_class!='无':# 表格内容tb.add_row([page,train_number,time_1,time_2,use_time,prince_seat,first_class_seat,second_class,])# 火车 elif version=='2' and train_number[0]!='G':if hard_seat!='无' or no_seat!='无' or soft_sleeper!='无' or hard_sleeper!='无':# 表格内容tb.add_row([page,train_number,time_1,time_2,use_time,soft_sleeper,hard_sleeper,hard_seat,no_seat,])# 所有车次 elif version!='1' and version!='2':# 表格内容tb.add_row([page,train_number,time_1,time_2,use_time,prince_seat,prince_seat,second_class,soft_sleeper,hard_sleeper,hard_seat,no_seat,])page+=1print(tb)print()print()while True:if version=='1' or version=='2':choise=input("是否开始购票-----(Y/N)")print()print()if choise=='Y' or choise=='y':Train_number=int(input("输入预购票车次序号(例:6):"))while True:try:buy.buy_ticket(Train_number,from_station,to_station,train_date1,version)flag2=Truebreakexcept:print()print()print('购票失败!!!')print()print()#跳出当前购票,并终止程序if flag2:flag=Truebreakelif choise=='N' or choise=='n':# 是否继续查询判定again = input('是否继续查询(Y/N): ')if again == 'Y' or again == 'y':breakelse:flag=Truebreakelse:x=input('所有车次展示完毕,如需购票(高铁输入--1, 火车输入--2,再次查询--3): ')if x=='1' or x=='2':version=xelse:break# 终止程序if flag:print()print('=======================程序已退出=========================')print()print()print()break

总结

到这里就完了。总归来说,爬虫真的挺有意思,这一类脚本语言还是有必要学的,毕竟作为一个计科人,多学一些东西是没坏处的。但是这个抢票还是得看天意了(这个取决于你的电脑性能,网速,还有就是会不会遇到稀奇古怪的问题,不过还是希望各位都能-码到票成
感觉还可以的就,麻烦大佬动动您致富的小手指,来个点赞+关注吧!

12306_qiang票子(爬虫小练_2)相关推荐

  1. 12306查询车票(爬虫小练_1)

    文章目录 导入模块 导入City.json文件 内容分析 撸代码 city.json文件 导入模块 # 数据请求模块 import requests # 序列化和反序列化 import json # ...

  2. python爬虫简单练手:音乐top250

    python爬虫简单练手:音乐top250 使用的库bs4和requests: 通过requests发送网络请求 通过bs4的beautifulsoup解析html 页面分析: top250一共有10 ...

  3. python爬取b站排行榜_实时爬取B站排行榜并保存为表格——每周一个爬虫小教程系列...

    从这周开始,每周来一个爬虫小教程,希望对你们有所帮助,这次的目标是B站排行榜至于爬取什么内容,目前感觉就把序号,名称以及评分爬取下来吧(因为我是边写教程边写代码的) 这次需要用到的知识:Request ...

  4. 绕开登录进行爬虫_爬虫小偏方:绕开登陆和访问频率控制

    - 该APP必须登陆才能访问所有页面. - 你的账号如果没有关注对方,对方的详细介绍页面的很多信息就被隐藏了. - APP的用户详细页面一个账号大概只能访问100次/天(有点记不清具体数字了)就不能访 ...

  5. c语言数组蛇形编程,C语言每天小练(二)——蛇形数组

    C语言每日小练(二)--蛇形数组 例:在n*n方阵里输入1,2,3,...,n*n,要求填成蛇形.例如n=4时方阵为: 10 11 12  1 9 16 13  2 8 15 14  3 7   6 ...

  6. python小练——下载指定url中的图片

    python小练--下载指定url中的图片 #coding=gbk #download pictures of the url #useage: python downpicture.py www.b ...

  7. 9139 位艺人在 Python 面前不值一提 # Python 爬虫小课 5-9

    本篇博客的最终目标是爬取世界上 9139 位艺人的身高.体重.生日.血型,当然有些数据目标网站没有提供,不在做过多的扩展. 爬虫小课系列文章导读链接 第一篇:Python 爬虫小课 1-9 宝妈程序媛 ...

  8. 基于python爬虫的岗位数据分析以拉勾网为例_爬虫小实例-拉勾网数据分析岗位...

    原标题:爬虫小实例-拉勾网数据分析岗位 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数据分析挖 ...

  9. PyQt5制作一个爬虫小工具,爬取雪球网上市公司的财务数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于可以叫我才哥 ,作者:可以叫我才哥 最近有朋友需要帮忙写个爬虫脚本,爬取雪球网一些上 ...

最新文章

  1. 画布之轮播图片HTML5,Axure原型设计之轮播图
  2. 建筑工程的发展、未来那个职业将会兴起!
  3. 刷算法的时候有没有必要自写测试用例?
  4. 使用pxe来实现无人值守linux
  5. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察
  6. 三星q90r如何升级系统_看尚电视强制升级风行系统,如何安装第三方软件?
  7. python集合的两种类型_python 入门之 – 集合类型(十九)
  8. mysql binlog 备份_做好mysql运维,必须熟练掌握备份和恢复,实战一次不行多来几次...
  9. 《深入剖析Tomcat》阅读(三)
  10. 微软的SQLHelper类(含完整中文注释)
  11. hdu 4421(枚举+2-sat)
  12. onvif协议之初探
  13. 计算机科学与技术专业要选修的课程,计算机科学与技术专业课程探讨
  14. STM32工作笔记0100---认识设备的IMEI号和SN号的区别
  15. python tk/ttk制作 安卓群控助手,多台设备多任务多线程执行
  16. unity3d 地面印花_Unity3D 中的贴花效果
  17. matlab2018a课后答案,[2018年最新整理]matlab习题及答案.doc
  18. Puppeteer通过evaluate执行脚本获取cookie
  19. 如何运用计算机制作合同书,Word 2007 制作一份专业合同书实例WORD2007 -电脑资料...
  20. str和repr显示格式

热门文章

  1. 图书管理系统(Java语言)
  2. 手机如何批量提取视频中的音频
  3. java pg数据库事务回滚_PostgreSQL事务特性之ROLLBACK
  4. 安卓集成云闪付,以及So库冲突多moudle项目解决办法
  5. 简单好用高薪的Python!!!!
  6. Docker中的资源分配详解
  7. UE4 游戏窗口前台后台监听
  8. Java -- SQL注入
  9. 用小姐姐的声音为你指路,实时语音导航功能如何实现?
  10. cmd 下删除mysql 服务命令