网络抓取 - 名侦探柯南

Posted

技术标签:

【中文标题】网络抓取 - 名侦探柯南【英文标题】:Web Scraping - Detective Conan 【发布时间】:2020-06-29 07:06:17 【问题描述】:

我正在尝试从 https://www.kiss-anime.ws/ 下载名侦探柯南的所有剧集(感谢他们)。从网站上抓取下载 URL 时,我遇到了一个问题。

假设我想下载名侦探柯南的第一集,所以我使用这个 URL (https://www.kiss-anime.ws/Anime-detective-conan-1) 来抓取下载 URL。现在,当我尝试获取网站的 html 代码时,使用以下代码提取下载 URL:

from urllib.request import Request, urlopen

req = Request('https://www.kiss-anime.ws/Anime-detective-conan-1', headers='User-Agent': 'Mozilla/5.0')
webpage = urlopen(req).read()

我收到以下错误

Traceback(最近一次调用最后一次):文件“refine.py”,第 41 行,在 网页 = urlopen(req).read() 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py”, 第 222 行,在 urlopen 中 返回 opener.open(url, data, timeout) 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py”, 第 531 行,开放 响应=方法(请求,响应)文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py”, 第 640 行,在 http_response 中 response = self.parent.error(文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py”, 第 569 行,错误 返回 self._call_chain(*args) 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py”, 第 502 行,在 _call_chain 中 结果 = func(*args) 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py”, 第 649 行,在 http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 503: Service Temporarily 不可用

我不想访问每个链接并手动单击下载链接,因为有超过 900 集。获得链接后,我将使用以下代码下载该剧集:(以防有人想知道我会怎么做)

import webbrowser
webbrowser.open("https://www.kiss-anime.ws/download.php?id=VkE3eFcvTlpZb0RvKzJ0Tmx2V2ROa3J4UWJ1U09Ic0VValh1WGNtY2Fvbz0=&key=B2X2kHBdIGdzAxn4kHmhXDq0XNq5XNu1WtujWq==&ts=1584489495")

任何帮助将不胜感激,谢谢!

【问题讨论】:

您是否仅限于使用内置 Python 模块,或者也可以使用第三方模块,例如 requests Daweo 当我使用请求模块时,该站点检测到我正在使用使用隐藏输入的机器人,因此我无法抓取数据。您还有其他解决方案吗? 我建议看看Selenium,因为使用它你看起来像网页的人类用户 【参考方案1】:

所以,显然有 808 集。看看这段代码,这里发生了很多事情,但是很容易理解。我测试了大约 5-6 集的下载,它可以正常工作...

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from http.client import RemoteDisconnected
import time


def get_browser():
    chrome_options = Options()
    chrome_options.add_argument("--disable-extensions")
    chrome_options.add_argument('--disable-notifications')
    chrome_options.add_argument('--incognito')
    driver = webdriver.Chrome(options=chrome_options)
    return driver


driver = get_browser()
page_url = "https://www.kiss-anime.ws/Anime-detective-conan-1"

try:
    driver.set_page_load_timeout(40)
    driver.get(page_url)
except TimeoutException:
    raise Exception(f"\tpage_url - Timed out receiving message from renderer")
except RemoteDisconnected:
    raise Exception(f"\tError 404: page_url not found.")

WebDriverWait(driver, timeout=40).until(EC.presence_of_element_located((By.ID, "selectEpisode")))
driver.find_element_by_id("selectEpisode").click()
soup = BeautifulSoup(driver.page_source, "html.parser")

options = soup.find("select", attrs="id": "selectEpisode").find_all("option")
print(f"Found len(options) episodes...")


base_url = "https://www.kiss-anime.ws/"
for idx, option in enumerate(options):
    print(f"Downloading idx+1 of len(options)...")
    page_url = option['value']

    try:
        driver.set_page_load_timeout(40)
        driver.get(page_url)
    except TimeoutException:
        print(f"\tpage_url - Timed out receiving message from renderer")
        continue
    except RemoteDisconnected:
        print(f"\tError 404: page_url not found.")
        continue

    WebDriverWait(driver, timeout=40).until(EC.presence_of_element_located((By.ID, "divDownload")))
    driver.find_element_by_id("divDownload").click()
    print(f"\t Downloading...")
    time.sleep(15)


driver.quit()
print("done")

所以,首先,我在 chrome 浏览器中打开 URL,并读取总共 808 的下拉值。现在,我正在遍历这 808 个 URL 中的每一个,以获取下载视频所需的实际链接。通过在循环中使用.click(),我实际上是在模拟按钮单击,视频开始下载。请记住更改time.sleep(x),其中x 应表示根据您的互联网速度下载一集所需的大约时间(秒)。

您需要使用pip install 安装seleniumbs4 软件包。另外,下载chromedriver.exe 并确保它与此脚本的路径相同。

【讨论】:

非常感谢您所做的出色工作,此代码确实有效,我想我现在可以享受这部动画了。虽然有一个小问题,但有时当程序点击链接时,它会将机器人重定向到一个虚假的广告网站,就像我们在浏览浏览器时遇到的一般弹出窗口一样。有没有办法确保当程序单击链接时只下载剧集而没有其他任何事情发生。请帮我解决这个问题。 :) 您可以尝试在 chrome 浏览器上安装广告拦截器扩展程序,然后从代码中删除这行 chrome_options.add_argument("--disable-extensions")。另外,如果有帮助,请考虑对答案进行投票...

以上是关于网络抓取 - 名侦探柯南的主要内容,如果未能解决你的问题,请参考以下文章

名侦探柯南主线剧情整理

求《名侦探柯南》中与黑暗组织、FBL、CLA相关的集数

名侦探柯南Gin(琴酒)的出场集数!越详细越好!

我的名字叫江户川柯南

Vijos CoVH之柯南开锁 (二分图)

vijos p1204——CoVH之柯南开锁