大家好,小弟刚接触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去模拟人点击了。