返回列表 上一主題 發帖

[發問] 關於網頁資料抓取問題

本帖最後由 VBALearner 於 2017-2-10 21:24 編輯

回復 18# sujane0701
回復 20# c_c_lai

應C大的期待,加入第二次POST,完稿。
想當初C大也回應我許多VBA的低能問題xD,記得當時我PO了一篇分享文"三大法人買賣超資料整理...",結果就有高手用Python把自動下載Excel的程式碼貼出來,引發幾十頁的熱烈討論。若不是高手無私分享、令我對Python語言大開眼界並產生高度興趣的話,我便不會去學習Py,可能還停留在VBA吧... 因此,完整的程式碼S大、C大請享用,並鼓勵Py高手對我的程式碼提出建言,S大您接下來只需要把資料存成Excel,這一步很簡單,網路找找吧,加油。
  1. import requests
  2. import time
  3. from bs4 import BeautifulSoup

  4. postfreq = 0.8 #避免過度頻繁的訪問被當成惡意程式攻擊(類似小型DDOS),秒數間隔訪問是爬蟲的基本禮貌

  5. #僅以兩筆主提單號碼示範,欲增加自行更改即可
  6. 主提單號碼 = ['160-69306532','608-10318674'] #,'851-26325773','479-32003532','695-08802916','297-64647785']

  7. with requests.session() as r:
  8.     res = r.get('https://accs.tradevan.com.tw/accsw-bin/APACCS/userLoginAction.do?userid=GUEST&password=GUEST')
  9.     for code in 主提單號碼:
  10.         print('主提單號碼 :',code,'\n')
  11.         time.sleep(postfreq)
  12.         payload = {'mawb_no':code,'查詢':'查詢'}
  13.         res = r.post("https://accs.tradevan.com.tw/accsw-bin/APACCS/cImMergeQueryAction.do", data=payload) #第一次訪問
  14.         res.encoding = "big-5"
  15.         html = BeautifulSoup(res.text,"html.parser")
  16.         num = 1
  17.         for tr in html.body.select('table')[4].select('tr')[1:]: #把Table裡的tr資料逐列取出
  18.             summary = [] #建立摘要資訊的存放陣列
  19.             postdata = [] #二次訪問所需參數的存放陣列
  20.             for td in tr.select('td'):
  21.                 summary.append(td.text.strip())
  22.                 if td == tr.select('td')[len(tr.select('td'))-1]: #這裡有下一個POST所需的資訊(參數),透過觀察網頁原始碼得知
  23.                     postdata.append(str(td).split('&')[1].replace('flight_no=','')) #參數1
  24.                     postdata.append(str(td).split('&')[2].replace('flight_date=','')) #參數2
  25.                     postdata.append(str(td).split('&')[3].replace('est_arrival_date=','')) #參數3
  26.    
  27.             print('  ','摘要資訊'+str(num),':',summary,'\n') #第一次查詢得到的摘要資料
  28.             num+=1

  29.             payload = {'mawb_no':code,
  30.                        'voyage_flight_no':postdata[0],
  31.                        'est_arrival_date':postdata[2],
  32.                        'flight_date':postdata[1],
  33.                        'qry_mawb_no':code,
  34.                        'qry_sort':'0'
  35.                        }
  36.             time.sleep(postfreq)
  37.             res = r.post("https://accs.tradevan.com.tw/accsw-bin/APACCS/cImMergeListAction.do", data=payload) #第二次POST
  38.             res.encoding = "big-5"
  39.             html = BeautifulSoup(res.text,"html.parser")

  40.             print('  ','詳細資料如下 :')
  41.             for tr in html.select('table')[4].select('tr'):
  42.                 data = []
  43.                 for td in tr.select('td'):
  44.                     data.append(td.text.replace('\r','').replace('\n','').replace(' ','').strip())
  45.                 print('\t',data)
  46.             print('\n')
  47.             #運用其他模組把爬到的資料存成Excel即大功告成,甚至可以進一步運用select語法篩選特定位置的資料
複製代碼
真心感謝每一位願意分享所學、指導新手的人!

TOP

本帖最後由 VBALearner 於 2017-2-13 21:25 編輯

回復 23# sujane0701

沒關係,我只希望幫助願意學習而不是只伸手討免費程式的人。
您是個被程式威力激發熱情的人,跟小弟我一樣,小弟我一年前連一句程式碼都不會寫,希望您保持這份熱情持續學習。
您若只要部分資料,可以透過更改以下我PO的三句語法,去一一挑出要存取的資料位置。例如: html.select('table')[4].select('tr')[2].select('td')[1] 可以挑出表格中第三列從左數來第二個資料點,也就是"貨棧"的資料點,然後一一輸入進陣列後,再一併寫入Excel即可完成你的目標,工作順利 !
  1.             for tr in html.select('table')[4].select('tr'):
  2.                 data = []
  3.                 for td in tr.select('td'):
複製代碼
  1. data = []
  2. data.append(html.select('table')[4].select('tr')[2].select('td')[1])
  3. data.append(html.select('table')[4].select('tr')[?].select('td')[?])

  4. with open("xxx.xlsx",xx) as excel:
  5.     #寫入的程式碼
複製代碼
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 25# stillfish00

挖靠 VBA專家無誤
有關VBA的爬蟲程式似乎極為少見,敢問fish大是在哪裡學VBA爬蟲的語法呢?
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 27# stillfish00

感謝您! 我有空來研究研究,順便複習VBA,Py寫久了都忘記怎麼寫VBA了= ="
真心感謝每一位願意分享所學、指導新手的人!

TOP

        靜思自在 : 要批評別人時,先想想自己是否完美無缺。
返回列表 上一主題