[问题] 爬虫 - 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
https://imgur.com/a/PSR5Lasp.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