【问题标题】:Scraping DATA from Javascript using SCRAPY and PYTHON使用 SCRAPY 和 PYTHON 从 Javascript 中抓取数据
【发布时间】:2014-06-02 09:54:52
【问题描述】:

我想从 cbfcindia 删除有关所有电影的数据。

1) 在 SEARCH BOX 中,如果 Title = "a" 则填充所有以 "a" 开头的电影,(在 URL 中,va=a&Type=search) http://cbfcindia.gov.in/html/uniquepage.aspx?va=a&Type=search

2) 电影列表填充在表格中,现在这里是 JAVASCRIPT,如果我点击第一部电影,我会输入它的详细信息,我希望为所有电影抓取所有这些详细信息。 但我连一部电影都做不到。

3)我的观察:在源代码中有以下功能:

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

我们需要根据JS来传递参数。但我不知道怎么做。

items.py

from scrapy.item import Item, Field

class CbfcItem(Item):
    MovieName = Field()
    MovieLanguage = Field()
    Roffice = Field()
    CertificateNo = Field()
    CertificateDate = Field()
    Length = Field()
    NameofProducer = Field()
    #pass

cbfcspider.py

from cbfc.items import CbfcItem

class MySpider(BaseSpider):
    name = 'cbfc'
    allowed_domains= ["http://cbfcindia.gov.in/"]
    start_urls = ["http://cbfcindia.gov.in/html/uniquepage.aspx?va=a&Type=search"]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select("//tbody")    #Check
        print titles
        items = []
        for titles in titles:
            print "in FOR loop"
            item = CbfcItem()
            item ["MovieName"] = hxs.path('//*[@id="lblMovieName"]/text()').extract()
            item ["MovieLanguage"] = hxs.path('//*[@id="lblLanguage"]').extract()
            item ["Roffice"] = hxs.path('//*[@id="lblRegion"]').extract()
            item ["CertificateNo"] = hxs.path('//*[@id="lblCertNo"]').extract()
            item ["CertificateDate"] = hxs.path('//*[@id="Label1"]').extract()
            item ["Length"] = hxs.path('//*[@id="lblCertificateLength"]').extract()
            item ["NameofProducer"] = hxs.path('//*[@id="lblProducer"]').extract()
            items.append(item)          
            print "this is ITEMS"
        return items
        print "End of FOR"

【问题讨论】:

    标签: javascript python scrapy


    【解决方案1】:

    如果您深入了解源代码,每个链接都有以下标记:

    <a id="DGMovie_ctl03_lnk" href="javascript:__doPostBack('DGMovie$ctl03$lnk','')">AGNI PARIKSHAYA</a>
    

    现在你知道这个 javascript 函数是如何被调用的了,你有了事件目标和事件参数的值。为了确保您走在正确的轨道上,您还可以通过使用开发人员工具调查页面来检查发生了什么,如果您使用的是 chrome,请记住检查“保留日志”按钮。您将在 href 中看到回发的第一个参数为 EVENTTARGET。

    使用正则表达式跟随 xpath 将为您提供所有回发参数:

    sel.xpath("//*[contains(@id,'DGMovie')]/@href").re("doPostBack\(\'([^']+)")
    

    您需要对每个参数发出 POST 请求以获取您的信息。请注意,您的网页使用 iframe,因此您需要先进入 iframe 源。

    pawel@stack:~/stack$ scrapy shell "http://cbfcindia.gov.in/html/uniquepage.aspx?va=a&Type=search"
    In [31]: url = sel.xpath("//iframe/@src").extract()[0]
    
    In [33]: url
    Out[33]: u'searchresults.aspx?va=a&Type=search'
    
    In [35]: from urlparse import urljoin
    
    In [36]: url = urljoin(response.url, url) 
    
    In [39]: from scrapy.http import Request
    
    In [40]: req = Request(url)
    in [41]: fetch(req)
    
    # after fetching request..
    In [48]: js_links = sel.xpath("//*[contains(@id,'DGMovie')]/@href").re("doPostBack\(\'([^']+)")
    In [49]: param = js_links[0]
    
    In [50]: param
    Out[50]: u'DGMovie$ctl03$lnk'
    
    In [51]: from scrapy.http import FormRequest
    
    In [52]: fr = FormRequest.from_response(response, formdata={"__EVENTTARGET":param})
    
    In [53]: fetch(fr)
    2014-06-02 21:09:09+0100 [default] DEBUG: Redirecting (302) to <GET http://cbfcindia.gov.in/html/SearchDetails.aspx?mid=15&Loc=Backlog> from <POST http://cbfcindia.gov.in/html/searchresults.aspx?va=a&Type=search>
    2014-06-02 21:09:10+0100 [default] DEBUG: Crawled (200) <GET http://cbfcindia.gov.in/html/SearchDetails.aspx?mid=15&Loc=Backlog> (referer: None)
    In [54]: view(response)
    

    在蜘蛛中,您需要重构您的 parse 方法,以便它产生带有回调到 parse_items 的 FormRequest,而不是将您的解析逻辑移动到 parse_items(来自 parse)。

    不要忘记分页,这也是通过回发完成的!

    那些带有回发的asp.net页面通常最难解析。 Read more about them if you are interested

    【讨论】:

    • 你在哪里找到 "AGNI PARIKSHAYA"
    • 只需在控制台中查找,使用开发者工具将鼠标悬停在每部电影上
    • 我还没有从那个 cpan 的东西中理解任何东西。我面临类似的问题。请指导一下。
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2015-02-05
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多