首页 > 解决方案 > 使用 Python 抓取天空影院列表

问题描述

我想收集电影列表及其指向 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)

标签: pythonweb-scrapingbeautifulsoup

解决方案


在网络选项卡中有一个 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)

推荐阅读