使用 selenium 并单击下一页从 IMDB 中抓取 Web 记录
Web scrape records from IMDB using selenium and clicking next page
我正在尝试通过网络从 IMDB 中抓取热门剧集,起初我使用 beautiful soup 实现它以获取前 10,000 条记录并且效果很好。但是,在 10,000 条记录之后,IMDB link 从数字变为下一页的随机字符串,如下所示。
我希望能够从此页面导航:
https://www.imdb.com/search/title/?title_type=tv_episode&num_votes=600,&sort=user_rating,desc&start=9951&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()
使用请求并告别对页数的关注 - 而是使用下一个元素的属性 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
我正在尝试通过网络从 IMDB 中抓取热门剧集,起初我使用 beautiful soup 实现它以获取前 10,000 条记录并且效果很好。但是,在 10,000 条记录之后,IMDB link 从数字变为下一页的随机字符串,如下所示。
我希望能够从此页面导航: https://www.imdb.com/search/title/?title_type=tv_episode&num_votes=600,&sort=user_rating,desc&start=9951&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()
使用请求并告别对页数的关注 - 而是使用下一个元素的属性 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