最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用Playwright庫(kù)進(jìn)行電影網(wǎng)站數(shù)據(jù)的獲取

 更新時(shí)間:2023年05月17日 09:23:51   作者:PorterZhang  
playwright庫(kù)是微軟開(kāi)源的一個(gè)庫(kù),這個(gè)庫(kù)的功能更加的強(qiáng)大,除了可以實(shí)現(xiàn)同步操作,同樣也可以實(shí)現(xiàn)異步的操作,這篇文章主要介紹了如何利用Playwright庫(kù)進(jìn)行電影網(wǎng)站數(shù)據(jù)的獲取,需要的朋友可以參考下

簡(jiǎn)單概述

本系列可能是一個(gè)比較長(zhǎng)的系列,主要是對(duì)《Python3網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)實(shí)戰(zhàn)》前七章的一個(gè)內(nèi)容總結(jié)并且熟悉使用一下相關(guān)的框架與技術(shù)。

任務(wù)目標(biāo)

爬取電影數(shù)據(jù)網(wǎng)站ssr1.scrape.center/, 此網(wǎng)站無(wú)反爬,數(shù)據(jù)通過(guò)服務(wù)端渲染,需要爬取的部分為列表頁(yè)里面的電影數(shù)據(jù)詳情。

任務(wù)目標(biāo)解析

  • 爬取ssr1.scrape.center/, 網(wǎng)站的列表頁(yè)面,通過(guò)列表頁(yè)面的內(nèi)容獲取到需要的URL
  • 爬取ssr1.scrape.center/detail/{id}, 網(wǎng)站內(nèi)的數(shù)據(jù)詳情,需要獲取的部分有:

    電影標(biāo)題

    電影圖片的url

    電影上映時(shí)間

    電影分類

    電影評(píng)分

    劇情簡(jiǎn)介

  • 將內(nèi)容存放到需要的數(shù)據(jù)庫(kù)中

技術(shù)選型與爬取

如何爬取

playwright庫(kù)是微軟開(kāi)源的一個(gè)庫(kù),這個(gè)庫(kù)的功能更加的強(qiáng)大,除了可以實(shí)現(xiàn)同步操作,同樣也可以實(shí)現(xiàn)異步的操作,這個(gè)庫(kù)可以說(shuō)是現(xiàn)在功能最強(qiáng)大的庫(kù)也不為過(guò),因?yàn)槠溥€支持xpath,css選擇器等一些元素的選擇操作,甚至可以通過(guò)點(diǎn)擊鼠標(biāo)進(jìn)行操作,然后實(shí)現(xiàn)自動(dòng)化構(gòu)建代碼,整體的功能真的十分強(qiáng)大。

構(gòu)建基礎(chǔ)的爬取函數(shù)

# 抓取網(wǎng)頁(yè)內(nèi)容
def scrape_page(page, url):
    logging.info('scraping %s ...', url)
    try:
        page.goto(url)
        page.wait_for_load_state('networkidle')
    except:
        logging.error('error occured while scraping %s', url, exc_info=True)

對(duì)于網(wǎng)頁(yè)內(nèi)容的操作,我們只需要對(duì)頁(yè)面選項(xiàng)卡進(jìn)行操作,傳入頁(yè)面選項(xiàng)卡對(duì)象和url鏈接實(shí)現(xiàn)我們想要完成的頁(yè)面請(qǐng)求,在這種請(qǐng)求下,我們通過(guò)等待網(wǎng)絡(luò)請(qǐng)求的響應(yīng)情況來(lái)判斷頁(yè)面是否完全響應(yīng)。

構(gòu)建列表頁(yè)的爬取函數(shù)

這個(gè)部分只需要分析出最基礎(chǔ)的URL的頁(yè)碼規(guī)則就可以完成對(duì)頁(yè)面內(nèi)容的爬取,經(jīng)過(guò)分析我們可以發(fā)現(xiàn)https://ssr1.scrape.center/page/{page}可以發(fā)現(xiàn)變動(dòng)的內(nèi)容在{page}部分,因此構(gòu)建的抓取方式如下:

def scrape_index(page, page_index):
    index_url = f'{BASE_URL}/page/{page_index}'
    return scrape_page(page, index_url)

構(gòu)建詳情頁(yè)的爬取函數(shù)

詳情頁(yè)的爬取是建立在解析列表的基礎(chǔ)上獲得的,因此詳情頁(yè)爬取函數(shù)只需要知道url就可以直接調(diào)用基礎(chǔ)爬取函數(shù),而這里我們只需要對(duì)列表頁(yè)解析后就可以獲取到我們所需要的url,因此整體的構(gòu)建方式如下:

def scrape_detail(page, url):
    return scrape_page(page, url)

如何解析

解析列表頁(yè)后獲取詳情頁(yè)的URL

快速便捷的選擇器讓我們通過(guò)一行代碼就獲取到我們所需要的標(biāo)簽與屬性,十分方便的完成了我們需要獲取詳情頁(yè)的URL.

# 獲取解析內(nèi)容
def parse_index(page):
    # 獲取網(wǎng)頁(yè)內(nèi)容請(qǐng)求
    elements = page.query_selector_all('a.name')
    # 獲取元素信息
    for element in elements:
        part_of_url = element.get_attribute('href')
        detail_url = urljoin(BASE_URL, part_of_url)
        logging.info('get url: %s', detail_url)
        yield detail_url

解析詳情頁(yè)獲取需要的數(shù)據(jù)

當(dāng)詳情頁(yè)數(shù)據(jù)獲取到之后,對(duì)網(wǎng)頁(yè)內(nèi)的信息進(jìn)行解析,實(shí)現(xiàn)對(duì)電影名稱,電影類別,圖片地址,劇情簡(jiǎn)介以及評(píng)分的內(nèi)容獲?。?/p>

def parse_detail(page):
    # 獲取標(biāo)題
    name = None
    name_tag = page.query_selector('h2.m-b-sm')
    if name_tag:
        name = name_tag.text_content()
    # 獲取圖片
    cover = None
    cover_tag = page.query_selector('img.cover')
    if cover_tag:
        cover = cover_tag.get_attribute('src')
    # 獲取分類
    categories = []
    category_tags = page.query_selector_all('div.categories > button > span')
    if category_tags:
        categories = [category.text_content() for category in category_tags]
    # 獲取評(píng)分
    score = None
    score_tag = page.query_selector('p.score')
    if score_tag:
        score = score_tag.text_content().strip()
    # 劇情簡(jiǎn)介
    drama = None
    drama_tag = page.query_selector('div.drama > p')
    if drama_tag:
        drama = drama_tag.text_content().strip()
    return {
        # 標(biāo)題
        'name': name,
        # 圖片
        'cover': cover,
        # 分類
        'categories': categories,
        # 簡(jiǎn)介
        'drama': drama,
        # 評(píng)分
        'score': score
    }

如何存儲(chǔ)

本次存儲(chǔ)使用txt文本進(jìn)行文件內(nèi)容的存儲(chǔ),直接將文件內(nèi)容寫(xiě)入一個(gè)txt文件當(dāng)中。

# 數(shù)據(jù)內(nèi)容存儲(chǔ)
def save_data(data):
    # 文件存放地址
    data_path = '{0}/movies.txt'.format(RESULT_DIR)
    # 進(jìn)行文件寫(xiě)入
    with open(data_path, 'a+', encoding='utf-8') as file:
        name = data.get('name', None)
        cover = data.get('cover', None)
        categories = data.get('categories', None)
        drama = data.get('drama', None)
        score = data.get('score', None)
        file.write('name:'+name+'\n')
        file.write('cover:'+cover+'\n')
        file.write('categories:'+str(categories)+'\n')
        file.write('drama:'+drama+'\n')
        file.write('score:'+score+'\n')
        file.write('='*50 + '\n')

源代碼

import logging
from os import makedirs
from os.path import exists
from urllib.parse import urljoin
from playwright.sync_api import sync_playwright
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s: %(message)s')
#
BASE_URL = 'https://ssr1.scrape.center'
TOTAL_PAGE = 10
RESULT_DIR = 'results'
exists(RESULT_DIR) or makedirs(RESULT_DIR)
# 抓取網(wǎng)頁(yè)內(nèi)容
def scrape_page(page, url):
    logging.info('scraping %s ...', url)
    try:
        page.goto(url)
        page.wait_for_load_state('networkidle')
    except:
        logging.error('error occured while scraping %s', url, exc_info=True)
def scrape_index(page, page_index):
    index_url = f'{BASE_URL}/page/{page_index}'
    return scrape_page(page, index_url)
def scrape_detail(page, url):
    return scrape_page(page, url)
# 獲取解析內(nèi)容
def parse_index(page):
    # 獲取網(wǎng)頁(yè)內(nèi)容請(qǐng)求
    elements = page.query_selector_all('a.name')
    # 獲取元素信息
    for element in elements:
        part_of_url = element.get_attribute('href')
        detail_url = urljoin(BASE_URL, part_of_url)
        logging.info('get url: %s', detail_url)
        yield detail_url
def parse_detail(page):
    # 獲取標(biāo)題
    name = None
    name_tag = page.query_selector('h2.m-b-sm')
    if name_tag:
        name = name_tag.text_content()
    # 獲取圖片
    cover = None
    cover_tag = page.query_selector('img.cover')
    if cover_tag:
        cover = cover_tag.get_attribute('src')
    # 獲取分類
    categories = []
    category_tags = page.query_selector_all('div.categories > button > span')
    if category_tags:
        categories = [category.text_content() for category in category_tags]
    # 獲取評(píng)分
    score = None
    score_tag = page.query_selector('p.score')
    if score_tag:
        score = score_tag.text_content().strip()
    # 劇情簡(jiǎn)介
    drama = None
    drama_tag = page.query_selector('div.drama > p')
    if drama_tag:
        drama = drama_tag.text_content().strip()
    return {
        # 標(biāo)題
        'name': name,
        # 圖片
        'cover': cover,
        # 分類
        'categories': categories,
        # 簡(jiǎn)介
        'drama': drama,
        # 評(píng)分
        'score': score
    }
# 數(shù)據(jù)內(nèi)容存儲(chǔ)
def save_data(data):
    # 文件存放地址
    data_path = '{0}/movies.txt'.format(RESULT_DIR)
    # 進(jìn)行文件寫(xiě)入
    with open(data_path, 'a+', encoding='utf-8') as file:
        name = data.get('name', None)
        cover = data.get('cover', None)
        categories = data.get('categories', None)
        drama = data.get('drama', None)
        score = data.get('score', None)
        file.write('name:'+name+'\n')
        file.write('cover:'+cover+'\n')
        file.write('categories:'+str(categories)+'\n')
        file.write('drama:'+drama+'\n')
        file.write('score:'+score+'\n')
        file.write('='*50 + '\n')
def main():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        for page_index in range(1, TOTAL_PAGE + 1):
            scrape_index(page, page_index)
            detail_urls = list(parse_index(page))
            for detail_url in detail_urls:
                scrape_detail(page, detail_url)
                data = parse_detail(page)
                logging.info('get data: %s', data)
                save_data(data)
    browser.close()
if __name__ == '__main__':
    main()

版權(quán)信息

本文由PorterZhang整理或?qū)懽魍瓿?br />本人的Github: PorterZhang2021
本人的博客地址:PorterZhang

到此這篇關(guān)于如何利用Playwright庫(kù)進(jìn)行電影網(wǎng)站數(shù)據(jù)的獲取的文章就介紹到這了,更多相關(guān)Playwright庫(kù)電影網(wǎng)站數(shù)據(jù)的獲取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • TensorFlow模型保存/載入的兩種方法

    TensorFlow模型保存/載入的兩種方法

    這篇文章主要為大家詳細(xì)介紹了TensorFlow 模型保存/載入的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • opencv形態(tài)學(xué)中的孔洞填充詳細(xì)圖解

    opencv形態(tài)學(xué)中的孔洞填充詳細(xì)圖解

    我們?cè)谶M(jìn)行圖像分割后,分割結(jié)果有時(shí)會(huì)有一些小孔洞,如圖1所示,其中黑白兩色表示兩種不同的類別。一般情況下,這些孔洞屬于錯(cuò)分情況,為了優(yōu)化結(jié)果,我們通常對(duì)這些孔洞進(jìn)行填充。今天我們就用python語(yǔ)言基于OpenCV實(shí)現(xiàn)孔洞填充
    2022-10-10
  • Python可視化之pyechart庫(kù)使用詳解

    Python可視化之pyechart庫(kù)使用詳解

    這篇文章主要介紹了Python可視化之pyechart庫(kù)使用詳解,Pyecharts 提供了一個(gè)簡(jiǎn)單而直觀的 API 接口,使得使用者無(wú)需了解復(fù)雜的 JavaScript 語(yǔ)法,即可通過(guò) Python 代碼實(shí)現(xiàn)高度定制化的圖表設(shè)計(jì),需要的朋友可以參考下
    2023-12-12
  • 自定義Django_rest_framework_jwt登陸錯(cuò)誤返回的解決

    自定義Django_rest_framework_jwt登陸錯(cuò)誤返回的解決

    這篇文章主要介紹了自定義Django_rest_framework_jwt登陸錯(cuò)誤返回的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python實(shí)現(xiàn)多進(jìn)程之間共享變量

    Python實(shí)現(xiàn)多進(jìn)程之間共享變量

    Python多線程和多進(jìn)程之間共享變量的方法有所不同,多線程可以直接使用global變量,而多進(jìn)程則需要使用multiprocessing庫(kù)中的Value、Array、Queue等或Manager模塊,Pool進(jìn)程池中進(jìn)程間共享變量時(shí),必須使用Manager模塊,在共享list時(shí),不能直接賦值
    2024-11-11
  • python Tkinter的簡(jiǎn)單入門(mén)教程

    python Tkinter的簡(jiǎn)單入門(mén)教程

    這篇文章主要介紹了python Tkinter的簡(jiǎn)單入門(mén)教程,幫助大家更好的理解和學(xué)習(xí)使用python制作gui程序,感興趣的朋友可以了解下
    2021-04-04
  • Python并發(fā):多線程與多進(jìn)程的詳解

    Python并發(fā):多線程與多進(jìn)程的詳解

    今天小編就為大家分享一篇關(guān)于Python并發(fā):多線程與多進(jìn)程的詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解

    Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解

    這篇文章主要介紹了Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 用Python和MD5實(shí)現(xiàn)網(wǎng)站掛馬檢測(cè)程序

    用Python和MD5實(shí)現(xiàn)網(wǎng)站掛馬檢測(cè)程序

    系統(tǒng)管理員通常從svn/git中檢索代碼,部署站點(diǎn)后通常首先會(huì)生成該站點(diǎn)所有文件的MD5值,如果上線后網(wǎng)站頁(yè)面內(nèi)容被篡改(如掛馬)等,可以比對(duì)之前生成MD5值快速查找去那些文件被更改,為了使系統(tǒng)管理員第一時(shí)間發(fā)現(xiàn),可結(jié)合crontab或nagios等工具
    2014-03-03
  • python字符串中加空格的四種方法

    python字符串中加空格的四種方法

    本文主要介紹了python字符串中加空格的四種方法,包括使用加法運(yùn)算符、join()方法、format()方法和f-string,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評(píng)論

潼南县| 黄浦区| 博兴县| 营口市| 卓资县| 萝北县| 台中县| 乾安县| 竹北市| 海丰县| 色达县| 凯里市| 信阳市| 濉溪县| 广德县| 交口县| 通江县| 赣州市| 苗栗县| 衢州市| 若尔盖县| 岳池县| 烟台市| 岫岩| 博兴县| 正安县| 申扎县| 庐江县| 呼图壁县| 金堂县| 武安市| 余干县| 奎屯市| 阳高县| 营口市| 宁夏| 乌恰县| 北宁市| 顺平县| 礼泉县| 澳门|