CoderCastrov logo
CoderCastrov
Питон

Парсинг спортивных статей с использованием Twitter в Python

Парсинг спортивных статей с использованием Twitter в Python
просмотров
7 мин чтение
#Питон
Table Of Content

    Привет всем! В этом руководстве мы собираемся извлечь информацию о спортивных статьях из Интернета, используя Twitter API.

    Необходимые условия

    • Учетная запись разработчика Twitter
    • Некоторые базовые знания Python
    • Среда Python или Google Colab.

    Введение

    Итак, в этом руководстве мы узнаем, как собирать информацию о спортивных статьях из Интернета с помощью Twitter и Python.

    Сначала наша основная цель - собрать информацию о веб-статьях и получить текст статьи в текстовый файл или файл документа. Если нам нужно только 1 или 2 статьи, мы можем просто искать в Google и копировать содержимое. Но что, если нам нужно 100 или 1000 статей. Теперь копирование и вставка веб-статей - это трудоемкий процесс. Вот где вам поможет это руководство. Пристегните свои питоны и приступим к кодированию.

    Методология или шаги


    Учетная запись разработчика Twitter

    Сначала вам нужно создать учетную запись разработчика Twitter, чтобы использовать Twitter API. Для этого перейдите по следующей ссылке и следуйте инструкциям. (Это может занять от нескольких часов до нескольких дней.)Поддержка учетной записи разработчика | Twitter Developer Platform

    Теперь после создания учетной записи перейдите в панель разработчика. Затем создайте новое приложение с соответствующими настройками.

    Теперь перейдите на вкладку "Keys and tokens" в вашем новом проекте. Там вы увидите некоторые ключевые значения, которые вам нужно сохранить. Обратите внимание, что это приватные ключи и не должны быть переданы кому-либо.

    Twitter account keys

    Теперь сохраните учетные данные в файле Python следующим образом,

    Saving the keys and secret codes

    И вот все, что вам нужно сделать в части Twitter нашего проекта.


    Шаг 0 - Настройка Python для наших нужд

    Как и для любой другой сессии кодирования на Python, сначала нам нужно установить наши библиотеки. В этой сессии будут использоваться некоторые библиотеки/пакеты, и мы обсудим их, когда дойдем до этого момента. А пока мы установим и импортируем их в сеанс Python.

    Давайте установим пакеты сейчас. Вы можете скопировать следующую ячейку в одну из ячеек в Google Colab, чтобы установить пакеты.

    !python -m pip install twitter
    !python -m pip install requests
    !python -m pip install pandas
    !python -m pip install numpy
    !python -m pip install bs4
    !python -m pip install lxml
    !python -m pip install langdetect

    Вы можете импортировать их с помощью следующего кода.

    import twitter
    from urllib.parse import unquote
    import json
    import pandas as pd
    import re
    import urllib.request
    import requests
    from bs4 import BeautifulSoup as bs
    from bs4 import UnicodeDammit
    from lxml.html import fromstring
    from langdetect import detect
    import numpy as np
    import time

    И, наконец, если вы используете Google Colab, мы можем использовать наш Google Drive для сохранения результатов. Для этого давайте примонтируем диск. (Вам может потребоваться войти в свою учетную запись Google и предоставить Google Colab необходимые разрешения.)

    from google.colab import drive
    drive.mount('/content/drive/')

    Это завершает начальный этап нашего проекта. Теперь перейдем к основным частям нашего проекта.

    Шаг 1 - Поиск списка статей или просто URL-адресов.

    Это первый шаг нашего путешествия по парсингу веб-страниц. Сначала нам нужно войти в Twitter API. Для этого мы будем использовать сохраненные ключи Twitter.

    CONSUMER_KEY = ''
    CONSUMER_SECRET =''
    OAUTH_TOKEN = ''
    OAUTH_TOKEN_SECRET = ''auth = twitter.oauth.OAuth(OAUTH_TOKEN, OAUTH_TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET)
    twitter_api = twitter.Twitter(auth=auth)

    Теперь давайте рассмотрим наш метод поиска ссылок на спортивные статьи в Twitter.

    Как вы знаете, Twitter - это бесплатный сайт социальной сети, где пользователи обмениваются идеями или сообщениями с помощью твитов. Из-за этого в Twitter есть много разных типов контента. Наша цель здесь - найти твиты, связанные со спортом, которые также содержат внешние ссылки, ведущие на эти самые спортивные статьи.

    Чтобы найти эти статьи, мы можем использовать функцию поиска в Twitter API. Сначала давайте возьмем один твит и получим внешние URL-адреса из этого конкретного твита.

    q = "спортивная статья"
    search_results = twitter_api.search.tweets(q=q,count=100)

    Здесь мы ищем запрос "спортивная статья" в Twitter. Теперь обратите внимание, что в извлеченном твите есть ретвиты. Нам они не нужны. Затем мы можем использовать следующий запрос, чтобы удалить твиты с токеном "RT".

    q = "спортивная статья -RT"
    search_results = twitter_api.search.tweets(q=q,count=100)

    Теперь после выполнения этого блока кода мы получим JSON-вывод. В этом выводе нас интересуют только встроенные URL-адреса. Теперь мы можем написать небольшой код, чтобы получить только соответствующие URL-адреса.

    for status in search_results['statuses']:
        if(status['entities']['urls']!= []):
            print(status['entities']['urls'][0]['expanded_url'])

    Это даст вам хороший набор URL-адресов для парсинга.

    Теперь это наш окончательный код. Следующий код содержит контрольные точки для сохранения набора данных в нужные моменты. Он также настроен на работу с интервалами в 15 минут из-за ограничений Twitter API.

    count = 100
    Urls = []checkpoint = 100
    Loops = 500try:
        q = "спортивная статья -RT"
        search_results = twitter_api.search.tweets(q=q, count=count)
    except Exception as e:
        print(e)for status in search_results['statuses']:
        if (status['entities']['urls'] != []):
            Urls.append(status['entities']['urls'][0]['expanded_url'])
            if(len(Urls) % checkpoint == 0):
                pd.DataFrame({"Urls":Urls}).to_csv("Urls.csv")with tqdm(total=Loops) as pbar:
        for _ in range(Loops):
            pbar.set_description('URLs: %d' % (len(Urls)))
            pbar.update(1)        try:
                next_results = search_results['search_metadata']['next_results']
            except KeyError:
                breakkwargs = dict([kv.split('=') for kv in unquote(next_results[1:]).split("&")])
            
            try:
                search_results = twitter_api.search.tweets(**kwargs)
                statuses = search_results['statuses']
                for status in statuses:
                    if (status['entities']['urls'] != []):
                        Urls.append(status['entities']['urls'][0]['expanded_url'])
                        if(len(Urls) % checkpoint == 0):
                            pd.DataFrame({"Urls":Urls}).to_csv("Urls.csv")
            except Exception as e:
                print(e)
                for i in tqdm_notebook(range(15*60+20)):
                    time.sleep(1)
    pd.DataFrame({"Urls":Urls}).to_csv("Urls.csv")

    Не беспокойтесь, если прогресс остановился до достижения 100%. Это происходит потому, что количество твитов меньше нашего максимального лимита.

    Теперь у нас есть файл Urls.csv, который содержит все URL-адреса, которые нам нужны. Теперь давайте выполним некоторую предобработку, чтобы получить лучший список URL-адресов.

    Предобработка

    Теперь в этом разделе мы собираемся удалить дубликаты, удалить URL-адреса, которые не являются спортивными статьями (здесь мы удаляем веб-сайты, которые не являются новостными сайтами, например YouTube, Instagram, Amazon, Apple и т. д.).

    Для этого шага мы используем функцию pandas drop_duplicates().

    Urls = pd.read_csv("Urls.csv")
    Urls.shapeUrls = Urls.drop_duplicates()
    1. Удаление URL-адресов с ненужных сайтов

    Для этого шага нам понадобится использовать список ненужных сайтов и их форматы URL-адресов. Например, в ссылках YouTube содержатся фразы youtube или youtu.be. Теперь мы можем отфильтровать URL-адреса, содержащие эти слова или фразы.

    sites = ['youtube','instagram','twitter','youtu','shorts','apple','inst','twit','amazo','t.co']wrongsiteID = [index for index,url in enumerate(Urls.Urls) if any(str(url).lower().__contains__(k) for k in sites)]Urls= Urls.drop(wrongsiteID, axis=0)
    Urls.shape

    Теперь первая часть предобработки завершена. Мы завершим финальную часть предобработки после парсинга веб-страниц.

    Шаг 2 - Парсинг статей

    В этом разделе мы рассмотрим, как извлечь тексты статей. Как уже объяснялось ранее, мы берем все тексты из веб-статей.

    articles = {"URL": [],"URL2": [],"Title": [],"Content": []}
    counter = 0
    checkPoints = 100for i in tqdm(range(len(Urls.Urls))):
        url = Urls.Urls.iloc[counter]
        try:
            html = requests.get(url, timeout=(20,20))
            if(html.status_code!=200):
                print("skip",html.status_code,url)
                counter += 1
                continue
            url2 = html.url
            html = html.text
            soup = bs(html, 'html.parser').get_text()
            result = re.sub(r'[\t\r\n]', '', soup)
            tree = fromstring(html)        title = tree.findtext('.//title')
            articles["URL"].append(url)
            articles["URL2"].append(url2)
            articles['Content'].append(result)
            articles['Title'].append(title)        counter += 1
            print(counter,url2,title)
            if (counter % checkPoints == 0):
                pd.DataFrame(articles).to_csv("Articles.csv")    except Exception as e:
            print(url, e)
            counter += 1
            continuepd.DataFrame(articles).to_csv("Articles.csv")

    Теперь у нас есть CSV-файл со всеми статьями, их URL-адресами и заголовками. Теперь перейдем к следующему шагу.

    Шаг 3 - Предобработка

    Это финальный шаг предобработки в нашем проекте. Здесь мы сначала удаляем статьи с одного и того же URL-адреса. Несмотря на то, что мы сделали это на первом этапе предобработки, они также могут быть здесь из-за сокращения ссылок. Затем мы удаляем статьи, полученные с ошибочных страниц (ошибки 404, статьи не найдены и т. д.). И, наконец, мы фильтруем, чтобы выбрать только "английские" статьи.

    Articles = pd.read_csv("Articles.csv")
    print(Articles.shape)Articles = Articles.drop_duplicates(subset='URL2',keep='first')
    print(Articles.shape)Articles.reset_index(drop=True, inplace=True)
    Articles.drop(["Unnamed: 0"],axis=1, inplace=True)
    1. Удаление ненужных страниц

    Как и раньше, здесь мы используем список ключевых слов.

    keywords = ["error",'forbidden','403','404','gateway', 'went wrong','410','access denied','none','sorry','youtube','ip','503']indexes = []
    for i in range(Articles.shape[0]):
        if(any(key in str(Articles.Title[i]).lower() for key in keywords)):
            indexes.append(i)Articles = Articles.drop(indexes, axis = 0).reset_index(drop=True)
    Articles.shape
    1. Фильтрация английских статей
    English = pd.DataFrame()
    for i in range(Articles.shape[0]):
        type = detect(str(Articles.Content[i]))
        if (type == 'en'):
            English = English.append(pd.DataFrame(Articles.loc[[i]]))
        print(i, type, Articles.Title[i])

    Теперь сохраните фрейм данных в формате CSV или Excel.

    English.to_csv("EnglishSportsArticles.csv")

    Итак, теперь у вас есть файл CSV со всеми английскими спортивными статьями. Если вы дочитали эту статью до этого момента, спасибо, и пожалуйста, будьте любезны оставить свое мнение в разделе комментариев.

    Спасибо! Хорошего дня!