Рубрики
Без рубрики

Соскабливание нескольких страниц

Эй, ребята, добро пожаловать в серию WebScraping, надеясь, что вы уже прошли часть 1 в этом SE … С тегом WebDev, Python, WebScraping, Tuperial.

Привет, ребята,

Добро пожаловать в серию 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”