我熟悉使用Scrapy抓取网站,但我似乎无法抓住this一个(也许是javascript?)。
我正在尝试从本网站下载某些个人研究的商品历史数据: http://www.mcxindia.com/SitePages/BhavCopyDateWiseArchive.aspx
在此网站上,您必须选择日期,然后单击“开始”。加载数据后,您可以单击“在Excel中查看”以下载当天商品价格的CSV文件。我正在尝试构建一个刮刀来下载这些CSV文件几个月。但是,这个网站似乎是一个难以破解的难题。任何帮助将不胜感激。
我尝试过的事情: 1)查看页面源以查看是否正在加载数据但未显示(隐藏) 2)使用firebug查看是否有任何AJAX请求 3)修改POST标头,看看我是否可以获取不同日期的数据。帖子标题看起来很复杂。
答案 0 :(得分:2)
Asp.net网站众所周知难以抓取,因为它依赖viewsessions
,对请求和其他废话非常严格。
幸运的是,你的案子似乎很简单。您的scrapy方法应该类似于:
import scrapy
from scrapy import FormRequest
class MxindiaSpider(scrapy.Spider):
name = "mxindia"
allowed_domains = ["mcxindia.com"]
start_urls = ('http://www.mcxindia.com/SitePages/BhavCopyDateWiseArchive.aspx',)
def parse(self, response):
yield FormRequest.from_response(response,
formdata={
'mTbdate': '02/13/2015', # your date here
'ScriptManager1': 'MupdPnl|mImgBtnGo',
'__EVENTARGUMENT': '',
'__EVENTTARGET': '',
'mImgBtnGo.x': '12',
'mImgBtnGo.y': '9'
},
callback=self.parse_cal, )
def parse_cal(self, response):
inspect_response(response, self) # everything is there!
我们在这里做的是从我们已有的FormRequest
对象创建response
。它足以找到<input>
和<form>
字段并生成formdata。
但是,某些没有默认值或我们需要覆盖默认值的输入字段需要用formdata
参数覆盖。
所以我们提供formdata
参数和更新的表单值。检查请求时,您可以看到成功请求所需的所有表单值:
所以只需将所有这些内容复制到formdata
即可。 Asp对于formdata非常肛门,因此需要一些时间来试验所需要的和不需要的东西。
我会让您自己弄清楚如何到达下一页,通常只是添加formadata
的附加密钥,例如'page': '2'
。