Использование Python для очистки списка Sky Cinema

Я хотел бы собрать список фильмов и их ссылки на все доступные фильмы на сайте Sky Cinema.

Сайт:

http://www.sky.com/tv/channel/skycinema/find-a-movie#/search?genre=all&window=skyCinema&certificate=all&offset=0&scrollPosition=200

Я использую Python 3.6 и Beautiful Soup.

У меня проблемы с поиском названия и ссылки. Тем более, что есть несколько страниц, по которым можно щелкнуть - возможно, в зависимости от положения прокрутки (в URL-адресе?)

Я пробовал использовать BS и Python, но результата нет. Код, который я пробовал, вернул бы только заголовок. Я бы хотел название и ссылку на фильм. Поскольку они находятся в разных областях сайта, я не знаю, как это делается.

Код, который я пробовал:

from bs4 import BeautifulSoup
import requests

link = "http://www.sky.com/tv/channel/skycinema/find-a-movie#/search?genre=all&window=skyCinema&certificate=all&offset=0&scrollPosition=200"
r = requests.get(link)
page = BeautifulSoup(r.content, "html.parser")

for dd in page.find_all("div", {"class":"sentence-result-infos"}):
    title = dd.find(class_ = "title ellipsis ng-binding").text.strip()
    print(title)

spans=page.find_all('span', {'class': 'title ellipsis ng-binding'})
for span in spans:
    print(span.text)

Я хотел бы, чтобы результат отображался как заголовок, ссылка.

Обновлено:

Я только что попробовал следующее, но получить «текст» не является атрибутом:

from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://www.sky.com/tv/channel/skycinema/find-a-movie/search?genre=all&window=skyCinema&certificate=all&offset=0&scrollPosition=200')
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find('span', {'class': 'title ellipsis ng-binding'}).text.strip()
print(title)

Что вы имеете в виду под ссылкой? Пожалуйста, приведите пример ссылки на заголовок.

sentence 28.04.2019 12:59

На странице, когда вы нажимаете на постер, он переходит к вам на страницу. Он находится в разделе «sentence-result-pod ng-isolate-scope», связанном через href. Например: <a class = "sentence-result-pod ng-isolate-scope" href = "/tv/movie/death-race-beyond-anarchy-2018?genre=all&amp‌​;window=skyCinema&am‌​p;certificate= все" data-search = "search" data-ng-click = "takeMeToMovieDetails($event)" data-movie = "movie">

Mr O 28.04.2019 13:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
218
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Прежде всего, ознакомьтесь с условиями сайта, который вы собираетесь парсить.

Далее вам нужно selenium:

from selenium import webdriver
import bs4

# MODIFY the url with YOURS
url = "type the url to scrape here"


driver = webdriver.Firefox()
driver.get(url)

html = driver.page_source
soup = bs4.BeautifulSoup(html, "html.parser")

baseurl = 'http://www.sky.com/'

titles = [n.text for n in soup.find_all('span', {'class':'title ellipsis ng-binding'})]
links = [baseurl+h['href'] for h in soup.find_all('a', {'class':'sentence-result-pod ng-isolate-scope'})]

Спасибо тебе за это. Мне пришлось сменить Firefox на Chrome. Когда я запускаю приведенное выше и добавляю URL-адрес (из исходного сообщения), я получаю пустую страницу Chrome без данных. Еще раз спасибо.

Mr O 28.04.2019 13:26

Прочтите эта почта, чтобы использовать драйвер Chrome для selenium.

sentence 28.04.2019 13:31
Ответ принят как подходящий

На вкладке сети есть API. Вы можете получить все результаты одним звонком. Вы можете установить ограничение на число, превышающее ожидаемый результат.

r = requests.get('http://www.sky.com/tv/api/search/movie?limit=10000&window=skyMovies').json()

Или используйте номер, который вы можете увидеть на странице

import requests
import pandas as pd

base = 'http://www.sky.com/tv'
r = requests.get('http://www.sky.com/tv/api/search/movie?limit=1555&window=skyMovies').json()

data = [(item['title'], base + item['url']) for item in r['items']]
df = pd.DataFrame(data, columns = ['Title', 'Link'])
print(df)

Другие вопросы по теме