Веб-скрапинг страниц и создание твитов с помощью Python 3: настройка базовой среды

Twitter-боты – это мощный способ управления вашими социальными сетями, а также извлечения информации из микроблогов. Используя разные Twitter API, бот может делать много вещей: публиковать твиты, делать ретвит, следить за людьми с определенными интересами, автоматически отвечать на комментарии и многое другое. Иногда люди могут злоупотреблять способностями ботов, что приводит к негативным последствиям для других пользователей. Несмотря на это, исследования показывают, что люди считают Twitter ботов надежным источником информации. Например, бот может поддерживать интерес ваших подписчиков к контенту, даже если вы не в сети. Некоторые боты даже предоставляют важную и полезную информацию, например, @EarthquakesSF. Сегодня для ботов существует несметное количество приложений. По предварительным оценкам, на 2019 год боты составляют около 24% всех твитов в Twitter.

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

Требования

Примечание: Прежде чем мы сможем получить доступ к ключам API, которые требуются для этого бота, мы создадим учетную запись разработчика в Twitter, которая включает в себя проверку приложений. Заполнение формы подробно описано в разделе 1.

1: Настройка учетной записи разработчика и доступ к ключам Twitter API

Прежде чем вы сможете начать работу над своим ботом, вам нужно получить ключи API, чтобы Twitter мог распознавать запросы вашего бота. На этом этапе мы настроим учетную запись разработчика Twitter и получим доступ к ключам API.

Чтобы получить ключи API, зайдите на сайт developer.twitter.com и зарегистрируйте приложение для бота в Twitter, нажав Apply в правом верхнем углу страницы.

Затем нажмите Apply for a developer account.

Нажмите Continue, чтобы связать свое имя пользователя Twitter с приложением бота, которое вы создадите в этом мануале.

На следующей странице для целей данного мануала нужно выбрать I am requesting access for my own personal use, поскольку вы будете создавать бота для своего личного пользования.

После выбора имени учетной записи и страны (Account Name и Country) перейдите к следующему разделу. В разделе What use case(s) are you interested in? выберите Publish and curate Tweets, а также Student project / Learning to code.

Затем предоставьте описание бота, которого вы хотите собрать. Twitter требует этого для предотвращения злоупотреблений ботами; они ввели такую ​​проверку в 2018 году. В этом мануале мы будем собирать материал, посвященный технологиям, из The New Stack и The Coursera Blog.

Поле описания для целей данного руководства нужно ввести такой ответ:

I’m following a tutorial to build a Twitter bot that will scrape content from websites like thenewstack.io (The New Stack) and blog.coursera.org (Coursera’s Blog) and tweet quotes from them. The scraped content will be aggregated and will be tweeted in a round-robin fashion via Python generator functions.

И, наконец, выберите no на вопрос «Will your product, service, or analysis make Twitter content or derived information available to a government entity?»

Затем примите условия Twitter, нажмите Submit application и подтвердите свой адрес электронной почты. Twitter пришлет вам письмо с подтверждением после отправки этой формы.

Подтвердив свою электронную почту, вы увидите страницу Application under review и форму обратной связи для вашей заявки.

Вы также получите еще одно электронное письмо от Twitter – о том, что заявка находится на рассмотрении.

Сроки рассмотрения заявки в Твиттере могут значительно различаться от случая к случаю, но чаще всего заявка подтверждается в течение нескольких минут. Однако иногда рассмотрение занимает больше времени – около дня или двух, это обычное дело. Как только заявка будет принята, Twitter разрешит вам создать ключи. Вы можете получить доступ к ним во вкладке Keys and tokens после нажатия кнопки details в developer.twitter.com/apps.

Перейдите во вкладку Permissions на странице вашего приложения и установите для параметра Access Permission значение Read and Write (поскольку вы тоже будете писать твиты). Обычно для исследовательских целей (таких как анализ тенденций, данных и так далее) используется режим только чтения. Последняя опция позволяет пользователям интегрировать чат-ботов в свои существующие приложения, поскольку чат-боты требуют доступа к директу.

Итак, теперь у вас есть доступ к API Twitter, который станет важной частью вашего бота. Теперь пора подготовить среду и начать сборку бота.

2: Настройка базовой среды

На этом этапе мы напишем код для аутентификации вашего бота с помощью ключей API и создадим первый программный твит в вашей учетной записи Twitter.

Сначала создайте папку и определенную среду разработки для своего проекта.

Создайте папку:

mkdir bird

Перейдите в нее:

cd bird

Затем создайте новую виртуальную среду Python для своего проекта:

python3 -m venv bird-env

Затем активируйте свою среду, используя следующую команду:

source bird-env/bin/activate

Это добавит префикс (bird-env) в командную строку вашего терминала.

Теперь перейдите в текстовый редактор и создайте файл credentials.py, в котором будут храниться ваши ключи Twitter API:

nano credentials.py

Добавьте следующий код, заменив условные данные вашими ключами из Twitter:

ACCESS_TOKEN='your-access-token'
ACCESS_SECRET='your-access-secret'
CONSUMER_KEY='your-consumer-key'
CONSUMER_SECRET='your-consumer-secret'

Теперь вы установите основную библиотеку API для отправки запросов в Twitter. Для этого проекта вам потребуются следующие библиотеки: nltk, requests, twitter, lxml, random и time. Библиотеки random и time являются частью стандартной библиотеки Python, поэтому вам не нужно отдельно устанавливать их. Чтобы установить остальные библиотеки, можно использовать pip, менеджер пакетов Python.

Откройте свой терминал, убедитесь, что вы находитесь в папке проекта и выполните следующую команду:

  • pip3 install lxml nltk requests twitter
  • lxml и requests: нужны для просмотра веб-страниц.
  • twitter: библиотека для выполнения вызовов API на серверах Twitter.
  • nltk: (natural language toolkit) позволяет разбить абзацы на предложения.
  • random: позволяет случайным образом выбрать часть из всего поста.
  • time: позволяет перевести бот в спящий режим после определенных действий.

После того, как вы установили библиотеки, можно начать разработку. Теперь мы импортируем учетные данные в основной скрипт, который будет запускать бот. С помощью вашего текстового редактора создайте файл в каталоге проекта bird и назовите его bot.py:

nano bot.py

На практике функциональность бота распределяется по нескольким файлам по мере его усложнения. Однако в этом мануале мы поместим весь свой код в одном скрипте bot.py.

Сначала протестируйте свои ключи API, авторизовав своего бота. Добавьте в файл bot.py следующий фрагмент:

import random
import time
from lxml.html import fromstring
import nltk
nltk.download('punkt')
import requests
from twitter import OAuth, Twitter
import credentials

Дальше вы импортируете необходимые библиотеки; в отдельных случаях нужно также импортировать дополнительные функции из библиотек. Позже мы используем в коде функцию fromstring, чтобы преобразовать исходный текст собранной веб-страницы в древовидную структуру, что облегчит извлечение соответствующей информации со страницы. OAuth поможет в создании объекта аутентификации из ваших ключей, а Twitter создаст основной объект API для всей дальнейшей связи с серверами Twitter.

Теперь добавьте в bot.py следующие строки:

...
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
oauth = OAuth(
credentials.ACCESS_TOKEN,
credentials.ACCESS_SECRET,
credentials.CONSUMER_KEY,
credentials.CONSUMER_SECRET
)
t = Twitter(auth=oauth)

nltk.download (‘punkt’) загружает набор данных, необходимый для разбора абзацев и разбиения их на более мелкие компоненты. tokenizer – это объект, который позже вы будете использовать в коде для разделения абзацев на английском языке.

oauth – это объект аутентификации, созданный путем подачи в импортированный класс OAuth ключей API. Вы аутентифицируете своего бота через строку t = Twitter(auth=oauth). Строки ACCESS_TOKEN  и ACCESS_SECRET помогают распознать ваше приложение. Наконец, CONSUMER_KEY и CONSUMER_SECRET помогают распознать учетную запись, с помощью которой приложение взаимодействует с Twitter. Объект t будет передавать запросы в Twitter.

Теперь сохраните этот файл и запустите его в терминале, используя следующую команду:

python3 bot.py

Вывод должен выглядеть примерно так, если авторизация прошла успешно:

[nltk_data] Downloading package punkt to /Users/binaryboy/nltk_data...
[nltk_data]   Package punkt is already up-to-date!

Если вы получили сообщение об ошибке, проверьте сохраненные ключи API и убедитесь, что ввели правильные ключи вашей учетной записи разработчика Twitter. Затем повторите попытку. Также убедитесь, что все необходимые библиотеки установлены правильно. Если это не так, используйте pip3, чтобы установить их.

Теперь вы можете попробовать создать твит. Введите в терминал ту же команду с флагом -i, чтобы открыть интерпретатор Python после выполнения вашего скрипта:

python3 -i bot.py

Затем введите следующее, чтобы отправить твит через свою учетную запись:

t.statuses.update(status="Just setting up my Twttr bot")

Теперь откройте ленту Twitter в браузере, и вы увидите свой тестовый твит, содержащий опубликованный вами контент.

Закройте интерпретатор, введя quit() или CTRL + D.

Теперь ваш бот умеет постить простые твиты. Чтобы научить своего бота твитить полезный контент, на следующем этапе мы настроим веб-скрапинг страниц.

3: Веб-скрапинг контента для Twitter

Чтобы добавить более интересный контент в вашу ленту, давайте попробуем извлечь контент с New Stack и Coursera Blog, а затем опубликовать его в виде твитов. Как правило, чтобы собрать нужные данные с целевых веб-сайтов, нужно поэкспериментировать с их HTML-структурой. Каждый твит от бота, который вы создадите в этом мануале, будет содержать ссылку на исходный пост с выбранных сайтов, а также случайную цитату из этого поста. Для этого можно создать специальную функцию для скрапинга контента из Coursera, назовем ее scrape_coursera().

Сначала откройте bot.py:

nano bot.py

Добавьте функцию scrape_coursera() в конец файла:

...
t = Twitter(auth=oauth)
def scrape_coursera():

Чтобы собрать информацию из блога, сначала нужно запросить соответствующую веб-страницу с серверов Coursera. Для этого нужно использовать функцию get() из библиотеки requests. Функция get() берет URL и извлекает соответствующую веб-страницу. Вам нужно передать blog.coursera.org в качестве аргумента get().Также необходимо указать заголовок в запросе GET, который позволит серверам Coursera распознать вас как подлинного клиента. Добавьте следующие строки в функцию scrape_coursera(), чтобы указать заголовок:

def scrape_coursera():
HEADERS = {

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'


' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'


}

Этот заголовок будет содержать информацию по определенному веб-браузеру, работающему в конкретной операционной системе. Пока эта информация (обычно это User-Agent) соответствует реальному веб-браузеру и операционной системе, не имеет значения, совпадает ли информация заголовка с конкретным браузером и операционной системой на вашем компьютере. Поэтому этот заголовок будет хорошо работать для всех систем.

После того как вы определили заголовки, добавьте следующие выделенные строки, чтобы сделать GET-запрос к Coursera, указав URL-адрес страницы блога:

...
def scrape_coursera():
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'
}
r = requests.get('https://blog.coursera.org', headers=HEADERS)

tree = fromstring(r.content)

Эта строка загрузит веб-страницу на ваш компьютер и сохранит информацию со всей веб-страницы в переменной r. Вы можете оценить исходный HTML код страницы, используя атрибут content  переменной r. Следовательно, значение r.content совпадает с тем, что вы видите, когда просматриваете веб-страницу в своем браузере, кликнув правой кнопкой мыши и выбрав параметр Inspect Element.

Здесь мы также добавили функцию fromstring. Вы можете передать исходный код веб-страницы в функцию fromstring, импортированную из библиотеки lxml, чтобы построить древовидную tree структуру веб-страницы. Эта структура предоставляет простой доступ к различным частям веб-страницы. Исходный HTML код имеет особую древовидную структуру; каждый элемент заключен в тег <html> и вложен после него.

Теперь откройте https://blog.coursera.org в браузере и проверьте HTML-исходник с помощью инструментов разработчика. Щелкните правой кнопкой мыши по странице и выберите Inspect Element. В нижней части браузера появится окно, отображающее часть исходного HTML-кода страницы.

Затем кликните правой кнопкой мыши по миниатюре любого видимого сообщения в блоге и просмотрите его. В исходном коде HTML будут подсвечены соответствующие строки, которые определяют ту или иную миниатюру. Вы заметите, что все сообщения в блоге на этой странице определены в теге <div> с классом «recent».

Таким образом, в вашем коде вы будете использовать все элементы div через их XPath, что является удобным способом адресации элементов веб-страницы.

Для этого расширите свою функцию в bot.py следующим образом:

...
def scrape_coursera():
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'
}
r = requests.get('https://blog.coursera.org', headers=HEADERS)
tree = fromstring(r.content)
links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')

print(links)


scrape_coursera()

Здесь XPath (строка, переданная в tree.xpath()) сообщает, что вам нужны элементы div из всего исходного кода веб-страницы класса «recent». Символы // выполняют поиск по всей странице, div задает в функции поиск и извлечение только элементов div, а [@class=»recent»] просит ее извлечь только те элементы div, которые имеют значения атрибута класса «recent».

Однако сами эти элементы нам не нужны, нам нужны только ссылки, на которые они указывают, чтобы получить доступ к отдельным постам в блоге и просмотреть их содержимое. Таким образом, вы извлекаете все ссылки, используя значения тегов href, которые находятся в предыдущих тегах div.

Для проверки программы вызовите функцию scrape_coursera() в конце bot.py.

Сохраните и закройте файл bot.py.

Теперь запустите bot.py с помощью следующей команды:

python3 bot.py

В выходных данных вы увидите список URL-адресов:

['https://blog.coursera.org/career-stories-from-inside-coursera/', 'https://blog.coursera.org/unlock-the-power-of-data-with-python-university-of-michigan-offers-new-programming-specializations-on-coursera/', ...]

После проверки вы можете удалить последние две выделенные строки из скрипта bot.py:

...
def scrape_coursera():
...
tree = fromstring(r.content)
links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')
~~print(links)~~

~~scrape_coursera()~~

Теперь расширьте функцию bot.py, добавив следующую строку, чтобы извлечь содержимое из поста в блоге:

...
def scrape_coursera():
...
links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')
for link in links:

r = requests.get(link, headers=HEADERS)


blog_tree = fromstring(r.content)

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

  1. Захват всех абзацев поста в виде списка.
  2. Выбор одно абзаца из списка в произвольном порядке.
  3. Случайный выбор предложения из этого абзаца.

Скрипт выполнит эти этапы для каждого поста в блоге. Для извлечения одного поста нужно сделать запрос GET по его ссылке.

Теперь, когда у вас есть доступ к контенту блога, пора добавить код, который выполняет эти три этапа, чтобы извлечь нужный вам контент. Добавьте следующие строки в функцию скрапинга:

...
def scrape_coursera():
...
for link in links:
r = requests.get(link, headers=HEADERS)
blog_tree = fromstring(r.content)
paras = blog_tree.xpath('//div[@class="entry-content"]/p')

paras_text = [para.text_content() for para in paras if para.text_content()]


para = random.choice(paras_text)


para_tokenized = tokenizer.tokenize(para)


for _ in range(10):


text = random.choice(para_tokenized)


if text and 60 < len(text) < 210:


break

Если вы изучите сообщение в блоге, открыв первую ссылку, вы заметите, что все абзацы принадлежат тегу div класса entry-content. Поэтому бот извлекает все абзацы в виде списка с помощью paras = blog_tree.xpath(‘//div[@class=»entry-content»]/p’).

Элементы списка не являются буквальными абзацами; они являются объектами Element. Чтобы извлечь текст из этих объектов, используется метод text_content(). Эта строка следует шаблону списка Python, что определяет коллекцию с помощью цикла, который обычно записывается в одну строку. Файл bot.py извлекает текст объекта каждого абзаца и сохраняет его в списке. Чтобы случайным образом выбрать абзац из этого списка, включается модуль random.

Читайте также: Генераторы списков в Python 3

В конце бот должен выбрать из абзаца случайное предложение, которое хранится в переменной para. Для этого нужно сначала разбить абзац на предложения. Одним из вариантов достижения этой цели является метод Python split(). Однако это может быть сложно, поскольку предложение может состоять из нескольких частей. Поэтому, чтобы упростить задачу разделения абзаца, используйте обработку естественного языка через библиотеку nltk. Здесь пригодится объект tokenizer, который вы определили ранее в коде бота.

Теперь, когда у вас есть список предложений, вызовите random.choice(), чтобы извлечь случайное предложение. Это предложение должно быть цитатой для твита, поэтому его длина не может превышать 280 символов. Но по эстетическим соображениям лучше выбрать не слишком большое и не слишком маленькое предложение. Для этого укажите, что предложение должно иметь длину от 60 до 210 символов. Предложение, выбранное random.choice(), может не соответствовать этому критерию. Чтобы найти подходящее предложение, ваш скрипт сделает десять попыток, каждый раз проверяя критерий. Как только случайно выбранное предложение будет отвечать вашему требованию, цикл будет остановлен.

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

Теперь, когда у вас есть цитата из поста, вы можете опубликовать его с соответствующей ссылкой. Для этого нужно извлечь строку, которая содержит случайно выбранное предложение, а также соответствующую ссылку в блоге. Код, который вызывает функцию scrape_coursera(), затем отправит полученную строку в Twitter через API Twitter.

Расширьте свою функцию:

...
def scrape_coursera():
...
for link in links:
...
para_tokenized = tokenizer.tokenize(para)
for _ in range(10):
text = random.choice(para)
if text and 60 < len(text) < 210:
break
else:

yield None


yield '"%s" %s' % (text, link)

Сценарий выполняет оператор else только тогда, когда предыдущий цикл for не прерывается. Таким образом, это происходит только в том случае, если цикл не может найти предложение, которое соответствует заданной вами длине. Тогда цикл просто выдает None, чтобы код, вызывающий эту функцию, мог определить, что твитнуть здесь нечего. Затем он повторно вызовет функцию и получит контент по следующей ссылке в блоге. Но если цикл прерывается, значит, функция нашла подходящее предложение; скрипт пропустит выражение else, а функция выдаст найденное предложение и ссылку на блог через пробел.

Функция scrape_coursera() практически завершена. Если вы хотите создать подобную функцию для срапинга другого сайта, вам нужно повторить часть кода, который вы написали для скрапинга блога Coursera. Чтобы избежать переписывания и дублирования фрагментов кода, чтобы скрипт бота следовал принципу DRY (Don’t Repeat Yourself), вы должны определить и абстрагировать части кода, которые можно повторно использовать для новой функции скрапинга.

Независимо от того, для какого веб-сайта предназначена функция скрапинга, она должна случайным образом выбрать абзац, а затем предложение из этого выбранного абзаца – значит, вы можете выделить эти задачи в отдельные функции. Затем вы можете просто вызвать эти функции в своей новой функции скрапинга и достичь желаемого результата. Вы также можете определить HEADERS вне функции scrape_coursera(), чтобы его могли использовать другие функции скрапинга. Поэтому в следующем коде определение HEADERS предшествует определению функции:

...
HEADERS = {

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'


' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'


}

def scrape_coursera():
r = requests.get('https://blog.coursera.org', headers=HEADERS)
...

Теперь вы можете определить функцию extract_paratext() для извлечения случайного абзаца из списка объектов. Случайный абзац передается функции в качестве аргумента paras и возвращает разобранную форму выбранного абзаца, которую позже бот сможет использовать для извлечения предложения:

...
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'
}
def extract_paratext(paras):

"""Extracts text from <p> elements and returns a clean, tokenized random


paragraph."""


paras = [para.text_content() for para in paras if para.text_content()]


para = random.choice(paras)


return tokenizer.tokenize(para)

def scrape_coursera():
r = requests.get('https://blog.coursera.org', headers=HEADERS)
...

Затем нужно определить функцию, которая будет извлекать случайное предложение подходящей длины (от 60 до 210 символов) из выбранного абзаца, который она получает в качестве аргумента; здесь мы назовем этот аргумент para. Если такое предложение не найдено после десяти попыток, функция возвращает None. Добавьте следующий выделенный код для определения функции extract_text():

...
def extract_paratext(paras):
...
return tokenizer.tokenize(para)
def extract_text(para):

"""Returns a sufficiently-large random text from a tokenized paragraph,


if such text exists. Otherwise, returns None."""


for _ in range(10):


text = random.choice(para)


if text and 60 < len(text) < 210:


return text


return None

def scrape_coursera():
r = requests.get('https://blog.coursera.org', headers=HEADERS)
...

Определив вспомогательную функцию, вы можете переопределить функцию scrape_coursera() следующим образом:

...
def extract_paratext():
for _ in range(10):<^>
text = random.choice(para)
...
def scrape_coursera():
"""Scrapes content from the Coursera blog."""

url = 'https://blog.coursera.org'

r = requests.get(url, headers=HEADERS)
tree = fromstring(r.content)
links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')
for link in links:
r = requests.get(link, headers=HEADERS)
blog_tree = fromstring(r.content)
paras = blog_tree.xpath('//div[@class="entry-content"]/p')
para = extract_paratext(paras)

text = extract_text(para)


if not text:


continue

yield '"%s" %s' % (text, link)

Сохраните и закройте bot.py.

Здесь используется yield вместо return, потому что для итерации по ссылкам функция scraper будет выводить твиты последовательно. Это значит, что когда вы делаете первый вызов скрапера sc, который определен как sc = scrape_coursera(), вы получаете строку твита, соответствующую первой ссылке в списке, созданном функцией scraper. Если вы запустите следующий код в интерпретаторе, вы получите string_1 и string_2, как показано ниже, если переменная links в scrape_coursera () содержит список, который выглядит так:

["https://thenewstack.io/cloud-native-live-twistlocks-virtual-conference/", "https://blog.coursera.org/unlock-the-power-of-data-with-python-university-of-michigan-offers-new-programming-specializations-on-coursera/", ...].
python3 -i bot.py

Инициируйте скрапер и назовите его sc:

>>> sc = scrape_coursera()

Теперь у вас есть генератор, который создает или удаляет соответствующий контент из Coursera, по одному посту за раз. Вы можете получить доступ к собранному контенту, последовательно вызывая next() через sc:

>>> string_1 = next(sc)
>>> string_2 = next(sc)

Теперь вы можете отобразить на экране строки, которые определили для отображения собранного контента:

>>> print(string_1)
"Other speakers include Priyanka Sharma, director of cloud native alliances at GitLab and Dan Kohn, executive director of the Cloud Native Computing Foundation." https://thenewstack.io/cloud-native-live-twistlocks-virtual-conference/
>>>
>>> print(string_2)
"You can learn how to use the power of Python for data analysis with a series of courses covering fundamental theory and project-based learning." https://blog.coursera.org/unlock-the-power-of-data-with-python-university-of-michigan-offers-new-programming-specializations-on-coursera/
>>>

Если вместо этого вы используете return, вы не сможете получать строки по очереди и в правильной последовательности. Если вы просто замените yield на return в функции scrape_coursera(), бот всегда будет выдавать строку, соответствующую первому сообщению в блоге (вместо того, чтобы выдавать первый пост при первом вызове, второй – при втором вызове и т. д). Вы можете изменить функцию так, чтобы она просто возвращала список всех строк по соответствующим ссылкам, но это требует больше памяти. Кроме того, такого рода программы могут потенциально сделать слишком много запросов к серверам Coursera в течение короткого промежутка времени, чтобы быстро составить список. Это может привести к тому, что вашему боту будет временно запрещен доступ к веб-сайту. Таким образом, yield больше всего подходит для широкого круга подобных задач по скрапингу.

Заключение

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

Читайте также: Веб-скрапинг страниц и создание твитов с помощью Python 3

Tags: ,