2014-06-02 5 views
1

Я хочу отменить данные обо всех фильмах cbfcindia.Скребок DATA из Javascript с использованием SCRAPY и PYTHON

1) В поле для поиска, если Title = "а" все фильмы начиная с "а" заполняются (в URL, уа = а & Тип = поиск) 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" 

ответ

1

Если посмотреть глубже в источник каждое звено имеет следующую разметку:

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

Теперь вы знаете, как это javascript весело ction действительно вызывается, у вас есть значение аргумента цели и события события. Чтобы убедиться, что вы находитесь на правильном пути, вы также можете проверить, что происходит, исследуя страницу с помощью инструментов разработчика, если вы используете хром, помните, чтобы проверить кнопку «сохранить журнал». Вы увидите первый аргумент для возврата в href как EVENTTARGET.

После XPath с регулярными выражениями даст вам все аргументы обратной передачи:

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

Вам нужно сделать запрос POST с каждыми парами, чтобы получить информацию. Обратите внимание, что ваша веб-страница использует iframe, поэтому вам нужно сначала войти в источник iframe.

[email protected]:~/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_items, чем переместить парсинг логику parse_items (от синтаксического анализа).

Не забывайте о разбиении на страницы, это делается с помощью обратных передач!

Эти страницы asp.net с обратной передачей обычно наиболее сложны для синтаксического анализа. Read more about them if you are interested

+0

где вы находите «AGNI PARIKSHAYA» – user3698581

+0

просто посмотрите на консоль, используйте инструменты разработчика наведите курсор на каждый фильм –

Смежные вопросы