2015-12-12 3 views
1

Я пытаюсь очистить результаты поиска на веб-сайте потокового видео. Результаты поиска загружаются динамически, и я думаю, поэтому я не получаю правильных результатов. После того, как я отправлю форму и верну свои результаты. Html, это всегда домашняя страница без того, чтобы поиск был выполнен ... Любая помощь будет отличной, если у Механизации просто нет этой возможности, возможно, кто-то может указать мне на правильную направление? Заранее спасибо.Проблема скремблирования динамического содержимого с помощью механизации

import mechanize 

br = mechanize.Browser() 

br.set_handle_robots(False) 
br.set_handle_equiv(False) 
br.addheaders = [('User-agent', 'Mozilla')] 

br.open('http://movietv.to') 

br.select_form(nr=0) 
br.form.set_all_readonly(False) 
br.form.set_value("Godfather", nr=0) 

resp = br.submit() 

with open('results.html', 'w') as f: 
    f.write(resp.read()) 

ответ

2

Mechanize не совсем хороший кандидат для этого конкретного «динамического» сайта. Самый простой подход высокого уровня состоял бы в том, чтобы перейти с помощью автоматизации браузера через selenium.

Хотя я сделал это, используя requests и BeautifulSoup HTML-парсер. Ключевыми моментами для этого были: 1) фильмы загружаются с помощью запроса XHR на http://movietv.to/index/loadmovies и 2) для этого запроса требуется отправить token - его можно извлечь из элемента script на главной странице.

Полная рабочая реализация:

import re 

import requests 
from bs4 import BeautifulSoup 


search = "Godfather" 

token_pattern = re.compile(r'var token_key="(.*?)";') 
with requests.Session() as session: # maintaining web-scraping session 
    session.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"} 

    # extract token 
    response = session.get("http://movietv.to/") 
    soup = BeautifulSoup(response.content, "html.parser") 

    script = soup.find("script", text=token_pattern).get_text() 
    match = token_pattern.search(script) 
    if not match: 
     raise ValueError("Cannot find token!") 

    token = match.group(1) 

    # search for the movies 
    response = session.post("http://movietv.to/index/loadmovies", data={ 
     "loadmovies": "showData", 
     "page": "1", 
     "abc": "All", 
     "genres": "", 
     "sortby": "Popularity", 
     "quality": "All", 
     "type": "movie", 
     "q": search, 
     "token": token 
    }) 

    soup = BeautifulSoup(response.content, "html.parser") 

    for movie in soup.select("div.item"): 
     title = movie.find("h2", class_="movie-title") 

     print(title.get_text()) 

печатает найденные фильмы:

The Godfather 
The Godfather: Part II 
The Godfather: Part III 
Смежные вопросы