python - 使用 Python 抓取天空影院列表
问题描述
我想收集电影列表及其指向 Sky Cinema 网站上所有可用电影的链接。
该网站是:
我正在使用 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)
解决方案
在网络选项卡中有一个 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)
推荐阅读
- awk - 使用 awk 打印带有条件的字符串
- python - 使用 Panda3D 的简单平面相交
- reactjs - 如何在反应componentDidMount中从孩子调用父方法
- sql - 具有分组依据的 PIVOT SQL
- vue.js - 如何在 ...mapState (Vuex) 之间设置一个值
- git - 如何强制 git 从非废弃分支重新使用现有提交 sha1?
- android - LibSNDfile / Obeo 音频录制 Android 未正确写入标头
- javascript - 如何在 Sequelize 中按多对多关系排序?
- file - 如何获取具有特定扩展名的所有文件的路径
- oracle - ORA-06550 PLS-00103: 期待以下之一(类型
和 ORA-06550:PLS-00103: