Привет, ребята,
Добро пожаловать в серию WebScraping, надеясь, что вы уже прошли часть 1 в этой серии.
Статья больше не доступна
В моем предыдущем учебнике/посте некоторые из них спросили В чем необходимо соскрести данные? Ответ очень прост, для поиска данных для ML, AI или Data Science Projects, вы часто полагаетесь на базы данных, API или готовые наборы данных CSV. Но что, если вы не можете найти набор данных, который хотите использовать и проанализировать? Вот где а Веб -скребок приходит в.
И некоторые веб -сайты ограничивают ботов, получающих доступ на его веб -сайт, проверяя пользовательского агента HTTP -сообщения, в нашем предыдущем посте мы не использовали никаких заголовков, чтобы соответствующий сервер знал, что мы получаем его с помощью сценария Python.
Таким образом, в этом уроке мы притворяемся как пользователь Firefox, чтобы предотвратить ограничения.
headers[ "User-Agent" ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
В нашем предыдущем учебном пособии мы соскребили только одну страницу, но в этом уроке мы собираемся соскрести несколько страниц и возьмем все 1000 списков фильмов и будем контролировать скорость цикла, чтобы избежать затопления сервера запросами.
Давайте погрузимся в …
Анализ URL
https://www.imdb.com/search/title/?groups=top_1000
Теперь давайте нажмите на следующую страницу и посмотрим, как выглядит URL -адрес страницы 2: https://www.imdb.com/search/title/?groups=top_1000&start=51
А затем URL страницы 3: https://www.imdb.com/search/title/?groups=top_1000&start=101
Мы заметили, что это добавляется в URL, когда мы переходим на страницу 2, а число 51 обращается к номеру 101 на странице 3. Это имеет смысл, потому что на каждой странице есть 50 фильмов. Page1-1-50, стр. 2-51-100, стр. 3-101-150, и так далее. Почему это важно? Эта информация поможет нам рассказать нашему циклу, как перейти на следующую страницу, чтобы скрепить
Таким образом, мы создаем функцию для итерации более 1–1000 списков фильмов, NP.Arange (Start, Stop, Step) является функцией в библиотеке Numpy Python, и это требует Начало , Стоп и шаг аргументы. Шаг – это число, которое определяет расстояние между каждым. Так что начните с 1, остановитесь на 1001 и шагните на 50.
- Страницы – это функция, которую мы создали np.arrange (11001,50)
- страница – это переменная, которая итерации на страницах
pages = np.arange(1, 1001, 50) for page in pages: url = + str(page) results = requests.get(url, headers=headers)
Контроль скорости ползания
Управление скоростью ползания полезно для скребка и для веб -сайта, который мы царапаем. Если мы избегаем забивания сервера с множеством запросов одновременно, то у нас гораздо меньше шансов получить наш IP -адрес – и мы также избегаем нарушения деятельности веб -сайта, который мы соскребят, позволяя серверу ответить на другого пользователя запросы также. Мы добавим этот код в наш новый для Loop:
Разрушение скорости ползания вниз
Функция Sleep () будет контролировать скорость цикла, приостановив выполнение цикла в течение определенного количества времени, которое функция Randint (2,10) будет изменять количество времени ожидания между запросами на номер между 2-10 секунд. Вы можете изменить эти параметры на любое, что вам нравится.
from time import sleep from random import randint
Код окончательного скребки:
import requests from bs4 import BeautifulSoup import pandas as pd import csv from time import sleep from random import randint import numpy as np headers = dict() headers[ "User-Agent" ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" titles = [] years = [] time = [] imdb_ratings = [] genre = [] votes = [] pages = np.arange(1, 1001, 50) for page in pages: url = + str(page) results = requests.get(url, headers=headers) soup = BeautifulSoup(results.text, "html.parser") movie_div = soup.find_all("div", class_="lister-item mode-advanced") sleep(randint(2, 10)) print(page) for movieSection in movie_div: name = movieSection.h3.a.text titles.append(name) year = movieSection.h3.find("span", class_="lister-item-year").text years.append(year) ratings = movieSection.strong.text imdb_ratings.append(ratings) category = movieSection.find("span", class_="genre").text.strip() genre.append(category) runTime = movieSection.find("span", class_="runtime").text time.append(runTime) nv = movieSection.find_all("span", attrs={"name": "nv"}) vote = nv[0].text votes.append(vote) movies = pd.DataFrame( { "Movie": titles, "Year": years, "RunTime": time, "imdb": imdb_ratings, "Genre": genre, "votes": votes, } ) # cleaning movies["Year"] = movies["Year"].str.extract("(\\d+)").astype(int) movies["RunTime"] = movies["RunTime"].str.replace("min", "minutes") movies["votes"] = movies["votes"].str.replace(",", "").astype(int) print(movies) movies.to_csv(r"C:\Users\Aleti Sunil\Downloads\movies.csv", index=False, header=True)
Как всегда, мы можем сохранить данные Scraper в файле CSV
movies.to_csv(r"C:\Users\Aleti Sunil\Downloads\movies.csv", index=False, header=True)
Вывод
Там у тебя это есть! Мы успешно извлекли данные из 1000 лучших фильмов всех времен на IMDB, которые включали несколько страниц и сохранили их в файл CSV. Дайте мне знать, если какие -либо вопросы.
Надеюсь, это полезно ❤ было здорово 😊
Счастливого кодирования!
Оригинал: “https://dev.to/sunilaleti/webscraping-part-2-445”