[問題] 爬蟲 - requests後的資料查詢 (已解決)

作者: truth1999 (真)   2018-03-17 10:48:51
大家好,小弟剛接觸python幾天...
有個資料查詢的問題一直無法解決
(http://amis.afa.gov.tw/m_coop/CoopVegFullMarketMainProd.aspx )
該網站查詢的資料結果是url不變並以js呈現(請見諒非本科系的形容@@")
且結果若超過60筆,才會出現下一頁的按鈕可以點選
所以碰到的問題是在顯示資料之前
第2、3頁...下一頁的按鈕不會出現
而按鈕的方式是以javascripl:__doPostBack的方式寫入
因此問題有兩個:
1.我該如何才能獲得第1頁之後的資料
目前查到的方法好像要利用requests.session方法
但是怎麼寫都跑不出來
2.有辦法可以在查詢後,直接利用"下載"這個按鈕下載資料嗎
爬文後不知道能否利用request後,再配合selenium
只是找到的文章大多是利用cookie帶入,好像不適合這個網頁
不知道是否有善心版友可以協助指導新手...
以下附上查詢的code跟試著加入session的code
單純查詢一次性資料:
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import pandas as pd
resp =
requests.get('http://amis.afa.gov.tw/m_coop/CoopVegFullMarketMainProd.aspx')
soup = BeautifulSoup(resp.text, 'html5lib')
view_state = soup.find(id='__VIEWSTATE')['value']
event_validation = soup.find(id='__EVENTVALIDATION')['value']
viewstate_generator = soup.find(id='__VIEWSTATEGENERATOR')['value']
form_data = {
'__VIEWSTATE': view_state,
'__VIEWSTATEGENERATOR': viewstate_generator,
'__EVENTVALIDATION': event_validation,
'ctl00$contentPlaceHolder$txtStartDate':'106/12/01',
'ctl00$contentPlaceHolder$txtEndDate':'107/03/15',
'ctl00$contentPlaceHolder$ucCoopVegFruitMarket$radlMarketRange':'P',
'ctl00$contentPlaceHolder$ucCoopVegFruitMarket$lstMarket':'109',
'ctl00$contentPlaceHolder$ucCoopVegFruitMainProduct$radlProductType':'V',
'ctl00$contentPlaceHolder$ucCoopVegFruitMainProduct$lstProduct':'FA0',
'ctl00$contentPlaceHolder$dropProductClass':'1',
'ctl00$contentPlaceHolder$btnQuery':'查詢'
}
resp =
requests.post('http://amis.afa.gov.tw/m_coop/CoopVegFullMarketMainProd.aspx',
data=form_data)
df = pd.read_html(resp.text)[6].dropna(axis=0, how='any')
print(df)
作者: froce (froce)   2018-03-17 11:17:00
你都用selenium了,就直接用selenium模擬點擊就好。這網站不需要登入也能下載,你應該不用去考慮cookies問題。當然如果要快的話,還是得用requests去找ajax的網址去取得結果。另外他是用ajax去取下一頁,每次傳回一頁(60筆)的結果(html)。__doPostBack('ctl00$contentPlaceHolder$dataPager$ctl01$ctl0「頁數減1」','')上面是他控制頁數的javascript機制。詳細的話,得教你怎麼看browser的開發者工具,才能講得清楚。只能說你選錯網站了,新手沒網頁整體基礎學爬蟲,爬到asp web form就是個悲劇,最簡單就是利用selenium去模擬人點擊了。
作者: truth1999 (真)   2018-03-17 11:49:00
請問f大,所以儘管它是使用doPostBack,還是可以將ajax所得到html解出來嗎?一開始是學selenium,不過碰到選日期的年、月卡住選不了年跟月,所以才學requests,途中也發現我好像選錯網站了(選到大魔王之類的...),先謝謝您的回覆,感恩
作者: froce (froce)   2018-03-17 13:18:00
他執行選頁動作後,傳回的結果就是當頁的html。另外你要選日期,就照日期格式,對input做.send_keys()就行了啊。input.send_key("107/03/17")類似這樣。基本上,asp web form會送很多框架使用的request field,並且使用ajax去做很多的動作,很容易造成初學爬蟲者混淆。
作者: vi000246 (Vi)   2018-03-17 14:21:00
還好啦 asp.net都是用固定的控制項 去網路找一定有解法不像其他網頁 各種換頁方式都有 解讀起來比較複雜你按F12 觀察它換頁按鈕的html 會呼叫javascript按下去會將值賦到隱藏欄位再post 再觀察network裡的變數 就大概知道asp.net運作的原理了
作者: froce (froce)   2018-03-17 14:32:00
我們看慣的當然還好啊。哈
作者: vi000246 (Vi)   2018-03-17 14:33:00
" target="_blank" rel="nofollow">
asp.net的網頁是最好google的 不像其他的要靠臨機應變XD
作者: alansyue (alansyue)   2018-03-17 14:51:00
selenium
作者: froce (froce)   2018-03-17 17:20:00
哈,v你這樣說也對,因為看到要爬都已經習慣性的開開發者模式直接看送啥request了,根本沒想到對asp web form來google爬蟲。Orz
作者: coeric ( )   2018-03-18 01:09:00
注意第二頁開始,有多些參數要送hfldTransVolume、hfldTransAmount、hfldAvgPrice 這三個我可正常爬完(不過code很亂,整理完再分享了)
作者: truth1999 (真)   2018-03-18 02:24:00
謝謝c大指點,我自己也來試試看
作者: coeric ( )   2018-03-19 13:15:00
一樓的froce才是重點,要去看開發者模式

Links booklink

Contact Us: admin [ a t ] ucptt.com