簡體   English   中英

Web 使用 selenium 從 IMDB 抓取記錄並單擊下一頁

[英]Web scrape records from IMDB using selenium and clicking next page

我正在嘗試 web 從 IMDB 中抓取熱門劇集,起初我使用 beautiful soup 實現它以獲得前 10,000 條記錄並且效果很好。 然而,在 10,000 條記錄之后,IMDB 鏈接從數字變為下一頁的隨機字符串,如下所示。

我希望能夠從此頁面導航: https://www.imdb.com/search/title/?title_type=tv_episode&num_votes=600,&sort=user_rating,desc&start=9951&ref_=adv_nxt

到下一頁:

https://www.imdb.com/search/title/?title_type=tv_episode&num_votes=600,&sort=user_rating,desc&after=WzguNSwidHQwOTQzNjU3IiwxMDAwMV0%3D&ref_=adv_nxt

然后通過單擊下一步按鈕從之后的頁面中抓取所有記錄。 我想使用 selenium,但無法正常使用。 任何幫助表示贊賞

代碼:

import time
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd
import numpy as np
import requests

url = "https://www.imdb.com/search/title/?title_type=tv_episode&num_votes=600,&sort=user_rating,desc"

driver = webdriver.Chrome("chromedriver.exe")
driver.get(url)

page = 1

series_name = []
episode_name = []

while page != 9951:
    url = f"https://www.imdb.com/search/title/?title_type=tv_episode&num_votes=600,&sort=user_rating,desc&start={page}&ref_=adv_nxt"
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    episode_data = soup.findAll('div', attrs={'class': 'lister-item mode-advanced'})
    for store in episode_data:
        h3=store.find('h3', attrs={'class': 'lister-item-header'})
        sName =h3.findAll('a')[0].text
        series_name.append(sName)
        eName = h3.findAll('a')[1].text
        episode_name.append(eName)

    time.sleep(2)

    page += 50

注意: Selenium 是一個選項,但它不是完成任務所必需的 - 也可以在較新的代碼中使用find_all()而不是舊語法findAll()

使用 requests 告別對頁數的關注——取而代之的是使用 next 元素的屬性href提供的 url。

if (a := soup.select_one('a[href].next-page')):
    url = 'https://www.imdb.com'+a['href']
else:
    break

例子

為了表明它正在工作,初始 url 設置為&start=9951如果您願意,您可以刪除它以從第一頁開始:

import time
from bs4 import BeautifulSoup
import requests

url = "https://www.imdb.com/search/title/?title_type=tv_episode&num_votes=600,&sort=user_rating,desc&start=9951"

series_name = []
episode_name = []

while True:
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    episode_data = soup.find_all('div', attrs={'class': 'lister-item mode-advanced'})
    for store in episode_data:
        h3=store.find('h3', attrs={'class': 'lister-item-header'})
        sName =h3.find_all('a')[0].text
        series_name.append(sName)
        eName = h3.find_all('a')[1].text
        episode_name.append(eName)

    time.sleep(2)

    if (a := soup.select_one('a[href].next-page')):
        url = 'https://www.imdb.com'+a['href']
    else:
        break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM