Скрипт сравнивает title двух страниц в каждой строке. Сначала исправьте перенос состояния titles между строками, разбор URL и обработку ошибок, затем добавляйте ограниченную конкурентность.
Повышение эффективности скрипта
Скрипт сравнивает title двух страниц в каждой строке. Сначала исправьте перенос состояния titles между строками, разбор URL и обработку ошибок, затем добавляйте ограниченную конкурентность.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо понять, что делает представленный фрагмент и предложить пути его ускорения.
import requests as req
from bs4 import BeautifulSoup
input_file = open('links.txt', 'r')
titles = []
line_idx = 0
for line in input_file:
line_idx += 1
urls_list = line.split(" ")
urls_list[1] = urls_list[1].replace('\n', '')
for link in urls_list:
response = req.get(link)
if response.status_code != 200:
print("error status code get request on ", link, " is ", response.status_code)
continue
html = response.text
parser = BeautifulSoup(html, 'lxml')
page_title = parser.title.string
titles.append(page_title)
if len(titles) == 2:
if titles[0] != titles[1]:
print("In the line under the number ", line_idx, " two mismatched titles")
else:
print("In the line under the number ", line_idx, " OK")
titles.clear()
else:
print("In the line under the number ", line_idx, " one or both links are not working")
input_file.close()
Ответ
Скрипт сравнивает title двух страниц в каждой строке. Сначала исправьте перенос состояния titles между строками, разбор URL и обработку ошибок, затем добавляйте ограниченную конкурентность.
titles очищается только при двух успешных результатах. Если одна загрузка не удалась, её соседний title попадёт в сравнение следующей строки. Создавайте список заново для каждой пары.
Используйте line.split() и проверяйте ровно два URL; urls_list[1] иначе может вызвать IndexError. У страницы может не быть title, а .string может быть None. Добавьте timeout, обработку сетевых ошибок и with для файлов.
Повторяющиеся URL можно кешировать в пределах ограниченного запуска. Для ускорения I/O загружайте несколько пар конкурентно с лимитом запросов и сохранением привязки к номеру строки. Не запускайте неограниченное число соединений; сначала измерьте сетевое время и стоимость парсинга.