python爬取火車票網的時刻表數據
導包
**
import re,requests,datetime,time,json
from prettytable import PrettyTable
from colorama import init,Fore
from pyquery import PyQuery as pq
import random
import pymysql.cursors
**
導包遇到問題的解決方法
1.在pycharm中: File ——> Setting——>Project Interpreter,在package一欄最後有個加號,點進去搜requests下載就可以了。
2.方法1沒解決的話,打開cmd輸入cd進入你的python運行環境script文件夾的位置,例如:cd D://python//python37//script,然後輸入:pip install requests(舉例requests模塊,其它也可)。
3,方法1和方法2還未解決的話,下載你要導入模塊相應的whl文件,whl文件鏈接地址:python的whl文件下載,下載後存到:E://pythonWhl(舉例),然後打開cmd輸入cd進入你的python運行環境script文件夾的位置,例如:cd C://python//python37//script,然後輸入:pip install E://pythonWhl//.whl,下載完whl文件後再pip install requests(舉例requests模塊,其它也可)就可以了。
4.如果方法1,2,3都沒用,建議重新啓動,或者檢查網絡,我在下pyMySQL模塊時三個方法都用了還是不行,結果第二天打開 File ——> Setting——>Project Interpreter找到pyMySQL模塊下載成功了,哈哈哈哈。
代碼
# -*- coding: utf-8 -*-
import re,requests,datetime,time,json
from prettytable import PrettyTable
from colorama import init,Fore
from pyquery import PyQuery as pq
import random
import pymysql.cursors
# 關閉https證書驗證警告
requests.packages.urllib3.disable_warnings()
init(autoreset=False)
# 全局變量,每增加一次加1
sta_num=1#記錄station表的增加次數
tra_num=1#記錄train表的增加次數
#取每一輛車的具體信息
def showTrainInfo(train_name,conn):
#打印傳過來的火車名
print(train_name)
# 獲取數據執行cursor
cursor=conn.cursor()
# 獲取url
url="http://search.huochepiao.com/chaxun/resultc.asp?txtCheci={}&cc.x=60&cc.y=8".format(train_name)
# 獲取頭信息
header = {
#在自己的瀏覽器打開F12隨便找一個request Header裏面就有
"User-Agent": ""
}
try:
# 獲取鏈接
r = requests.get(url, headers=header)
# 設置編碼格式
r.encoding = r.apparent_encoding
# 獲取頁面中的html並解析
doc = pq(r.text)
# 獲取所有table中的tr
trs = doc('tr')
# 定義train表的字段
trian_num, running_time, station_start, station_end, start_time, arrival_time, train_type, mileage, version_date = '', '', '', '', '', '', '', '', ''
# 循環獲取每一個tr
for tr in trs:
# 時刻表
if len(tr) == 12 or len(tr) == 13:
if tr[0].text_content()!='車次' and tr[0].text_content()!="":
global sta_num
sql_1 = "insert into station values({},'{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(sta_num,tr[0].text_content(),tr[1].text_content(),tr[2].text_content(),tr[3].text_content(),tr[4].text_content(),tr[5].text_content(),tr[6].text_content(),tr[7].text_content(),tr[8].text_content())
# print('車次:', tr[0].text_content(), ',站次:', tr[1].text_content(), ',站名:', tr[2].text_content(), ',到達時間:',
# tr[3].text_content(), ',開車時間:', tr[4].text_content(), ',停留時間:', tr[5].text_content(), ',運行時間:',
# tr[6].text_content(), ',天數:', tr[7].text_content(), ',里程:',tr[8].text_content())
print(sql_1)
cursor.execute(sql_1)
sta_num+=1
else:
continue
elif 3<len(tr)<12:
# train組裝
if tr[1].text_content()=='站站查詢':
continue
elif tr[1].text_content()=='車次':
trian_num =tr[2].text_content()
running_time=tr[4].text_content()
# print("車次:",tr[2].text_content())
# print("運行時間:", tr[4].text_content())
# pass
elif tr[0].text_content() == '始發站':
# print("始發站:", tr[1].text_content())
# print("終點站:", tr[3].text_content())
station_start=tr[1].text_content()
station_end=tr[3].text_content()
# pass
elif tr[0].text_content() == '發車時間':
# print("發車時間:", tr[1].text_content())
# print("到站時間:", tr[3].text_content())
start_time=tr[1].text_content()
arrival_time=tr[3].text_content()
# pass
elif tr[0].text_content() == '類型':
# print("類型:", tr[1].text_content())
# print("全程:", tr[3].text_content())
train_type=tr[1].text_content()
mileage=tr[3].text_content()
# pass
else:
# pass
varsion_date=tr[0].text_content()
# print("版本日期:",tr[0].text_content())
else:
continue
if trian_num!="":
#聲明全局變量
global tra_num
sql_2 = "insert into train values({},'{}','{}','{}','{}','{}','{}','{}','{}','{}','運行中')".format(tra_num,trian_num, running_time,station_start, station_end,start_time, arrival_time,train_type, mileage,version_date)
print(sql_2)
cursor.execute(sql_2)
tra_num+=1
conn.commit()
except Exception as e:
print("錯誤原因:",e)
showTrainInfo(train_name)
def main():
# 獲取數據連接
#host:本地數據庫主機名或雲數據庫的主機名
#port:MySQL的端口號(一般3306)
#user:MySQL的用戶名
#passwd:MySQL的密碼
#db:要鏈接的庫名
conn = pymysql.connect(host="", port=, user="", passwd="", db="")
# 以下是測試
# 獲取執行者cursor
# cursor = conn.cursor()
# sql = "insert into station values(null,'3','3','3','3','3','3','3')"
# cursor.execute(sql)
# conn.commit()
# 查詢車次,總共446頁,獲取每一頁的數據
for i in range(1,447):
print(i)
# 獲取url
url = "http://search.huochepiao.com/update/bianhao/?p={}&key=".format(i)
# 設置頭信息
header = {
#在自己的瀏覽器打開F12隨便找一個request Header裏面就有
"User-Agent": ""
}
try:
# 獲取鏈接
r = requests.get(url, headers=header)
# 設置編碼格式
r.encoding = r.apparent_encoding
# 獲取頁面中的html並解析
doc = pq(r.text)
# 獲取所有table中的tr
trs = doc('tr')
# 循環獲取每一個tr
for tr in trs:
# 如果這一行長度不是5也去掉,只取車次名
if len(tr) == 5:
# 如果這一行開頭不是車次
if tr[0].text_content() != '車次':
# print(tr[0].text_content())
showTrainInfo(tr[0].text_content(),conn)#車次名、數據庫連接、cursor作爲參數
else:
continue
else:
continue
except Exception as e:
print("錯誤原因:", e)
i=i-1
continue
conn.close()#關閉數據庫資源
print("恭喜你,完成了!!!")
main()
注意
1.數據庫以及對應的表要建好
2.我當時爬完所有數據花了3、4個小時,train表有7146條數據,station表有83809條數據
3.我用的python是2019.02.06版本,環境是python37
4.train表的version_date爬的數據後面很多空值,而且前面都是版本日期+時間,建議爬完所有後在數據庫修改:update train set version_date=‘2020/03/05’(舉例)