Поскольку fetch
принимает 3 аргумента (s, name, url), вам нужно передать 3 итераций в executor.map()
.
Когда вы сделаете это:
executor.map(fetch, *link_list)
link_list
распаковывает около 49 кортежей, каждый из которых содержит 3 элемента (объект Session, имя пользователя и URL). Это не то, что вам нужно.
Что вам нужно сделать, так это сначала преобразовать link_list
в 3 отдельных итераций (один для объектов Session, другой для имен пользователей и один для URL). Вместо того, чтобы делать это вручную, вы можете использовать zip()
и оператор распаковки дважды, например, так:
for result in executor.map(fetch, *zip(*link_list)):
Кроме того, когда я проверял ваш код, в get_links
:
возникло исключение
user_name = item.select_one(".user-details > a").get_text(strip=True)
AttributeError: 'NoneType' object has no attribute 'get_text'
item.select_one
вернул None
, который, очевидно, не имеет метода get_text()
, поэтому я просто обернул его в блок try / Кроме того, поймал AttributeError
и продолжил l oop.
Также обратите внимание, что класс Session в Requests не является поточно-ориентированным. К счастью , скрипт возвращал вменяемые ответы, когда я его запускал, но если вам нужен надежный скрипт, вам нужно решить эту проблему. Комментарий во 2-й ссылке показывает, как использовать один экземпляр Session для потока благодаря локальным данным потока. См .: