我一直试图从这个网站上抓取一些列表http://www.golf.org.au我基于ASP.NET做了一些研究,看来我必须在POST请求中传递一些值才能使网站获取数据我做了那些表,但我仍然没有想到我错过了什么?
这是我的代码:
# -*- coding: utf-8 -*-
import scrapy
class GolfscraperSpider(scrapy.Spider):
name = "golfscraper"
allowed_domains = ["golf.org.au","www.golf.org.au"]
ids = ['3012801330', '3012801331', '3012801332', '3012801333']
start_urls = []
for id in ids:
start_urls.append('http://www.golf.org.au/handicap/%s' %id)
def parse(self, response):
scrapy.FormRequest('http://www.golf.org.au/default.aspx?
s=handicap',
formdata={
'__VIEWSTATE':
response.css('input#__VIEWSTATE::attr(value)').extract_first(),
'ctl11$ddlHistoryInMonths':'48',
'__EVENTTARGET':
'ctl11$ddlHistoryInMonths',
'__EVENTVALIDATION' :
response.css('input#__EVENTVALIDATION::attr(value)').extract_first(),
'gaHandicap' : '6.5',
'golflink_No' : '2012003003',
'__VIEWSTATEGENERATOR' : 'CA0B0334',
},
callback=self.parse_details)
def parse_details(self,response):
for name in response.css('div.rnd-course::text').extract():
yield {'name' : name}
答案 0 :(得分:1)
是的,ASP页面很难抓。很可能缺少一些小参数。
解决方案:
而不是通过scrapy.FormRequest(...)
创建请求,请使用scrapy.FormRequest.from_response()方法(请参阅下面的代码示例)。这将捕获大部分甚至全部隐藏的表单数据,并使用它来预填充FormRequest的数据。
您似乎忘了退回请求,也许这也是另一个潜在的问题......
据我记得__VIEWSTATEGENERATOR也会每次更改,必须从页面中提取
如果这不起作用,请使用Firebug插件或Chrome的开发者工具启动Firefox浏览器,在浏览器中执行请求,然后检查完整的请求标头和正文数据您的请求中的相同数据。会有一些不同。
包含我所有建议的示例代码:
def parse(self, response):
req = scrapy.FormRequest.from_response(response,
formdata={
'__VIEWSTATE': response.css('input#__VIEWSTATE::attr(value)').extract_first(),
'ctl11$ddlHistoryInMonths':'48',
'__EVENTTARGET': 'ctl11$ddlHistoryInMonths',
'__EVENTVALIDATION' : response.css('input#__EVENTVALIDATION::attr(value)').extract_first(),
'gaHandicap' : '6.5',
'golflink_No' : '2012003003',
'__VIEWSTATEGENERATOR' : 'CA0B0334',
},
callback=self.parse_details)
log.info(req.headers)
log.info(req.body)
return req