使用Python刮刮Sky Cinema列表

时间:2019-04-28 10:29:49

标签: python web-scraping beautifulsoup

我想在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)

2 个答案:

答案 0 :(得分:0)

首先,请阅读您要抓取的网站的条款。

下一步,您需要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'})]

答案 1 :(得分:0)

在“网络”标签中可以找到一个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)