[問題] 爬蟲 - requests後的資料查詢 (已解決)
大家好,小弟剛接觸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)
---------------------------------------------------------------------------
加上session,但是資料一直無法跳到第2頁> < :
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')
with requests.session() as s:
s.headers['user-agent'] = 'Mozilla/5.0'
soup = BeautifulSoup(resp.content, 'html5lib')
target = (
'ctl00$contentPlaceHolder$dataPager$ctl02$ctl{:02d}'
)
# unsupported CSS Selector 'input[name^=ctl00][value]'
data = { tag['name']: tag['value']
for tag in soup.select('input[name^=ctl00]') if tag.get('value')
}
state = { tag['name']: tag['value']
for tag in soup.select('input[name^=__]')
}
data.update(state)
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':'查詢'
}
#
data['ctl00$FhMainContent$FhContent$ctl00$AnalysesCourse$CustomPager$total']
resp =
requests.post('http://amis.afa.gov.tw/m_coop/CoopVegFullMarketMainProd.aspx',
data=form_data)
soup = BeautifulSoup(resp.text, 'html5lib')
sl = soup.find_all("span")
last_page = '+'.join([span.get_text() for span in sl][-2])
# for page in range(last_page + 1):
for page in range(int(last_page)):
data['__EVENTTARGET'] = target.format(page)
df = pd.read_html(resp.text)[7].dropna(axis=0, how='any')
print(df)
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.170.50
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1521254934.A.7ED.html
※ 編輯: truth1999 (180.217.170.50), 03/17/2018 10:51:12
→
03/17 11:17,
7年前
, 1F
03/17 11:17, 1F
→
03/17 11:18,
7年前
, 2F
03/17 11:18, 2F
→
03/17 11:22,
7年前
, 3F
03/17 11:22, 3F
→
03/17 11:22,
7年前
, 4F
03/17 11:22, 4F
→
03/17 11:30,
7年前
, 5F
03/17 11:30, 5F
→
03/17 11:30,
7年前
, 6F
03/17 11:30, 6F
→
03/17 11:30,
7年前
, 7F
03/17 11:30, 7F
→
03/17 11:30,
7年前
, 8F
03/17 11:30, 8F
→
03/17 11:31,
7年前
, 9F
03/17 11:31, 9F
是的,只是妙的是,它的"下一頁"js的控制頁數都是使用
ctl00$contentPlaceHolder$dataPager$ctl02$ctl00,並且不會變動
所以我原本想簡單一點,直接由結果抓到共x頁,然後執行x-1次換頁即可
→
03/17 11:32,
7年前
, 10F
03/17 11:32, 10F
→
03/17 11:32,
7年前
, 11F
03/17 11:32, 11F
→
03/17 11:35,
7年前
, 12F
03/17 11:35, 12F
→
03/17 11:35,
7年前
, 13F
03/17 11:35, 13F
→
03/17 11:35,
7年前
, 14F
03/17 11:35, 14F
→
03/17 11:49,
7年前
, 15F
03/17 11:49, 15F
→
03/17 11:51,
7年前
, 16F
03/17 11:51, 16F
→
03/17 11:52,
7年前
, 17F
03/17 11:52, 17F
→
03/17 11:53,
7年前
, 18F
03/17 11:53, 18F
→
03/17 11:53,
7年前
, 19F
03/17 11:53, 19F
推
03/17 13:18,
7年前
, 20F
03/17 13:18, 20F
推
03/17 13:22,
7年前
, 21F
03/17 13:22, 21F
→
03/17 13:22,
7年前
, 22F
03/17 13:22, 22F
→
03/17 13:22,
7年前
, 23F
03/17 13:22, 23F
推
03/17 13:25,
7年前
, 24F
03/17 13:25, 24F
→
03/17 13:25,
7年前
, 25F
03/17 13:25, 25F
→
03/17 14:21,
7年前
, 26F
03/17 14:21, 26F
→
03/17 14:22,
7年前
, 27F
03/17 14:22, 27F
推
03/17 14:29,
7年前
, 28F
03/17 14:29, 28F
→
03/17 14:29,
7年前
, 29F
03/17 14:29, 29F
→
03/17 14:30,
7年前
, 30F
03/17 14:30, 30F
推
03/17 14:32,
7年前
, 31F
03/17 14:32, 31F
推
03/17 14:33,
7年前
, 32F
03/17 14:33, 32F
→
03/17 14:33,
7年前
, 33F
03/17 14:33, 33F
→
03/17 14:51,
7年前
, 34F
03/17 14:51, 34F
推
03/17 17:20,
7年前
, 35F
03/17 17:20, 35F
→
03/17 17:20,
7年前
, 36F
03/17 17:20, 36F
→
03/17 17:20,
7年前
, 37F
03/17 17:20, 37F
謝謝f大、v大跟a大的回覆與建議,v大提到的部份我有注意到
承上回覆,所以我有嘗試將換頁按鈕js的dopostback參數寫入。
不管是頁碼按鈕(值為頁數-1)、或者是下一頁按鈕(值不變),
還是寫不出如何在第一次取得requests後,再送出eventTarget
來拿到下一頁的查詢結果...
可能是因為此網站的設定是,要取到第一次的查詢後,
才會觀察(搜尋?)到eventTarget,所以這是我困擾的點><
※ 編輯: truth1999 (180.217.170.50), 03/17/2018 18:02:07
推
03/18 01:09,
7年前
, 38F
03/18 01:09, 38F
→
03/18 01:10,
7年前
, 39F
03/18 01:10, 39F
→
03/18 01:11,
7年前
, 40F
03/18 01:11, 40F
→
03/18 02:24,
7年前
, 41F
03/18 02:24, 41F
謝謝C大的資訊,真的在第二頁開始加上參數就可以了
超級感謝您
※ 編輯: truth1999 (180.217.170.50), 03/18/2018 14:07:34
→
03/19 13:15,
7年前
, 42F
03/19 13:15, 42F
Python 近期熱門文章
PTT數位生活區 即時熱門文章