Scrapy - Javascript网站

时间:2016-02-16 05:32:39

标签: python scrapy

我熟悉使用Scrapy抓取网站,但我似乎无法抓住this一个(也许是javascript?)。

我正在尝试从本网站下载某些个人研究的商品历史数据: http://www.mcxindia.com/SitePages/BhavCopyDateWiseArchive.aspx

在此网站上,您必须选择日期,然后单击“开始”。加载数据后,您可以单击“在Excel中查看”以下载当天商品价格的CSV文件。我正在尝试构建一个刮刀来下载这些CSV文件几个月。但是,这个网站似乎是一个难以破解的难题。任何帮助将不胜感激。

我尝试过的事情: 1)查看页面源以查看是否正在加载数据但未显示(隐藏) 2)使用firebug查看是否有任何AJAX请求 3)修改POST标头,看看我是否可以获取不同日期的数据。帖子标题看起来很复杂。

1 个答案:

答案 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参数和更新的表单值。检查请求时,您可以看到成功请求所需的所有表单值: enter image description here

所以只需将所有这些内容复制到formdata即可。 Asp对于formdata非常肛门,因此需要一些时间来试验所需要的和不需要的东西。

我会让您自己弄清楚如何到达下一页,通常只是添加formadata的附加密钥,例如'page': '2'