python爬取火車票網的時刻表數據

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’(舉例)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章