返回列表 上一主題 發帖

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

回復 1# sujane0701

可用Python的Requests與BeautifulSoup模組達成目的,以下影片是範例,可理解後應用
https://www.youtube.com/watch?v=Ef0kh6NPiBE&t=9s
真心感謝每一位願意分享所學、指導新手的人!

TOP

本帖最後由 VBALearner 於 2017-2-7 14:52 編輯

回復 3# sujane0701

您是個肯學習的人,再幫你一些! 附圖是我用Python3寫的程式所抓出來的資料,這個動作只有查詢主提單的主要資料。更詳細的資料(像是貨品名稱、日期等)要再做第二次訪問動作,就等於是你在主提單查詢頁面上輸入主提單號碼查了第一次,等結果出來後再點擊主提單連結進行第二次訪問搜尋您要的全部資料。
程式須注意的細節 :
1.Requests.Session(),是為了保留登入認證用的Cookie,可以上網Google學習
2.該程式需要兩個非內建的公開模組,安裝完Python3後再自行安裝Requests、BeautifulSoup4模組,安裝方法(ex: Pip install)可上網Google學習
第二次的POST就先留給您試試看,完成的話就可以撰寫成迴圈,以達到重複多次查詢並存取資料的目的! (PS : Time模組目前暫時不須使用,但重複查詢的動作可能會被視為惡意程式,所以未來可能會需要用來減低程式密集的訪問頻率)
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 6# sujane0701

Python跟VBA是兩種不同的語言,VBA比較像是EXCEL專屬的物件語言,所以VBA在處理非EXCEL內建功能的問題上就有許多不足,但也因為功能都focus在EXCEL上,也比其他語言好學許多,認真學的話,一個月不到就可以學完9成的語法+應用。我一開始也是從VBA學起,想當初還耍任性求版大幫我升級xD,後來發現Python在抓網路資料更快、更方便的時候,我就移情別戀了,有關VBA去POST網頁的程式我比較不熟,這可能要問VBA高手們比較合適 : GBKEE、c_c_lai、准提布林...
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 6# sujane0701

對了,要"爬蟲"要學會看懂網頁原始碼(HTML)喔
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 10# sujane0701

爬蟲的知識要靠自己一點一滴慢慢去天天摸,天天累積,最重要的是,遇到問題要能在"GOOGLE搜尋"找答案,前人所累積的知識都存在於網路這個大資料庫裡,小弟我也是站在巨人的肩膀上學習。等您大概看懂HTML的主要標籤(常用的就好,不要鉅細靡遺的背),並能夠理解如何用Python、Chrome的開發人員工具實現POST動作後,您就可以改我的程式碼去做第二次POST動作,獲取您最終要的資料了,再配合xls套件把資料存檔即可。以下附圖提示第二次POST的參數所在位置,有關Python不懂的語法GOOGLE一下即可得知,有問題歡迎再提出,加油!!!
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 10# sujane0701

第二次POST所需參數如圖,用Chrome的開發人員工具觀察即可得知POST的所需資訊
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 12# VBALearner

發現少框兩個參數...
其實可以不用POST方法,用原始碼給的已附加參數的網址GET也可以
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 14# c_c_lai

c大,不好意思,這是我的錯xD
我沒有PO程式碼造成您的手動輸入錯誤...真是抱歉哈哈哈
魔鬼藏在網址的細節裡哈哈哈

Hint : I跟L還真像阿呵呵
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 16# c_c_lai

我發現昨天PO圖時打錯了網址的順序了,我把你的打成我的...正確是"大寫i"才對......= ="
附原始碼,希望可以一勞永逸解決這問題 ...
  1. import requests
  2. import time
  3. from bs4 import BeautifulSoup

  4. 主提單號碼 = ['160-69306532','608-10318674']

  5. with requests.session() as r:
  6.     res = r.get('https://accs.tradevan.com.tw/accsw-bin/APACCS/userLoginAction.do?userid=GUEST&password=GUEST')
  7.     for code in 主提單號碼:
  8.         print('主提單號碼 :',code,'\n')
  9.         payload = {'mawb_no':code,'查詢':'查詢'}
  10.         res = r.post("https://accs.tradevan.com.tw/accsw-bin/APACCS/cImMergeQueryAction.do", data=payload)
  11.         res.encoding = "big-5"
  12.         html = BeautifulSoup(res.text,"html.parser")
  13.         for tr in html.body.select('table')[4].select('tr')[1:]: #請詳閱w3school裡有關HTML的Table標籤知識,就能知道這裡在做啥
  14.             data = [] #建立陣列
  15.             for td in tr.select('td'):
  16.                 data.append(td.text.strip())
  17.                 if td == tr.select('td')[len(tr.select('td'))-1]: #這裡有下一個POST所需的資訊(payload),透過觀察網頁原始碼得知
  18.                     print('第二次POST的資料 :',td,'\n')
  19.             print('摘要資訊 :',data,'\n') #第一次查詢得到的摘要資料
複製代碼
真心感謝每一位願意分享所學、指導新手的人!

TOP

回復 18# sujane0701

Python有關Excel的操作有很多方式,xlrd模組是其中一種
真心感謝每一位願意分享所學、指導新手的人!

TOP

        靜思自在 : 人的眼睛長在前面,只看到別人的缺點,絲毫看不到自己的缺點。
返回列表 上一主題