Скребок для кассовых сборов Mojo с Python - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь очистить данные из BoxOfficeMojo для проекта Data Science.Я внес некоторые изменения в этот код, который нашел в уже существующем репозитории GitHub, в соответствии со своими потребностями.

https://github.com/OscarPrediction1/boxOfficeCrawler/blob/master/crawlMovies.py

Мне нужна помощь по поводу очистки определенной функции.Несмотря на то, что я могу нормально обработать фильм в целом, в Box Office Mojo есть функция, которая показывает вам брутто с поправкой на инфляцию (брутто фильма, если он выйдет в каком-либо конкретном году).Брутто с поправкой на инфляцию поставляется с дополнительным «& Adjust_YR = 2018» в конце ссылки обычного фильма.

Например -

Титаник Нормальная связь (http://www.boxofficemojo.com/movies/?id=titanic.htm)

Титаник 2018 Связь с поправкой на инфляцию (http://www.boxofficemojo.com/movies/?id=titanic.htm&adjust_yr=2018)

Вэтот конкретный код, который я связал ранее, таблица URL-адресов создается путем прохождения алфавитного списка (http://www.boxofficemojo.com/movies/alphabetical.htm), а затем посещается каждый из URL-адресов. Проблема в том, что в алфавитном списке есть обычные ссылки фильмов ине ссылки с поправкой на инфляцию. Что я могу изменить, чтобы получить отсюда значения с поправкой на инфляцию?

(Единственный способ сканировать все фильмы одновременно - это алфавитный список. Я проверял это ранее)

Пожалуйста, ответьте, если у вас есть какие-либо вопросы, или вы не поняли вопрос, а не проголосовали. Мне действительно нужен ответ на этот вопрос, и голосование вниз может отменить этот вопрос.

1 Ответ

0 голосов
/ 10 июня 2018

Одним из возможных способов было бы просто сгенерировать все необходимые URL-адреса, добавив список нормальных URL-адресов с "& Adjust_YR = 2018" и очистив каждый сайт.

Лично мне нравится использовать xpath (язык для навигацииhtml структуры, очень полезные для очистки!) и рекомендуют не использовать совпадения строк для фильтрации данных из HTML, так как когда-то мне было рекомендовано .Простой способ использования xpath - через библиотеку lxml.

from lxml import html
    <your setup>
    ....

for site in major_sites:

    page = 1
    while True:
        # fetch table
        url = "http://www.boxofficemojo.com/movies/alphabetical.htm?letter=" + site + "&p=.htm&page=" + str(page)
        print(url)
        element_tree = html.parse(url)
        rows = element_tree.xpath('//td/*/a[contains(@href, "movies/?id")]/@href')
        rows_adjusted = ['http://www.boxofficemojo.com' + row + '&adjust_yr=2018' for row in rows]

        # then loop over the rows_adjusted and grab the necessary info from the page

Если вам удобно использовать библиотеку pandas dataframe, я также хотел бы указать на функцию pd.read_html (), которая в моеммнение, предопределено для этой задачи.Это позволит вам очистить целую алфавитную страницу почти в одну строку.Кроме того, вы можете выполнять любые необходимые замены / аннотации впоследствии по столбцам.

Один из возможных путей может быть таким.

import pandas as pd
    <your setup>
    ....

for site in major_sites:

    page = 1
    while True:
        # fetch table
        url = "http://www.boxofficemojo.com/movies/alphabetical.htm?letter=" + site + "&p=.htm&page=" + str(page)
        print(url)

        req = requests.get(url=url)
        # pandas uses beautifulsoup to parse the html content
        content = pd.read_html(req.content)

        # chose the correct table from the result
        tabular_data = content[3]

        # drop the row with the title
        tabular_data = tabular_data.drop(0)

        # housekeeping renamer
        tabular_data.columns = ['title', 'studio', 'total_gross', 'total_theaters',
                                'opening_gross', 'opening_theaters', 'opening_date']

        # now you can use the pandas library to perform all necessary replacement and string operations

Дополнительные ресурсы: В Википедии есть хороший обзор синтаксиса xpath

...