Не работает парсер Selenium на хосинге Pythonanywere

У меня есть парсер selenium + django rest расположенные на хостинге pythonanywere. Проблема в том что парсер работает неккоректно только на хостинге, при локальном запуске все работает корректно. Как работает, пользователь отправляет patch запрос с данными в поле social_network, парсер переходит по нему и парсит данные с linkedin о нынешней работе и заполняет поле work_status спаршенными даннными. Вот как выглядит код. При парсинге у меня меняются данные о social_network но не о work_status и выходит мой обработчик ошибки "Информация о месте работы не найдена на странице для профиля"

class StudentProfileView(APIView):
permission_classes = [permissions.AllowAny]

def get(self, request, id):
    student = StudentProfile.objects.get(id=id)
    serializer = StudentProfileSerializer(student)
    return Response(serializer.data, status=status.HTTP_200_OK)


@classmethod
def linkedin_login_and_work_parsing(cls, profile):
    with open("licreds.txt") as f:
        lines = f.readlines()
        LINKEDIN_LOGIN, LINKEDIN_PASSWORD = lines[0].strip(), lines[1].strip()

    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')
    driver = webdriver.Chrome(options=chrome_options)


    url_login = 'https://www.linkedin.com/login/ru?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin'
    driver.get(url_login)
    time.sleep(2)
    login_field = driver.find_element("id", "username")
    login_field.send_keys(LINKEDIN_LOGIN)
    password_field = driver.find_element("id", "password")
    password_field.send_keys(LINKEDIN_PASSWORD)
    login_field.submit()
    time.sleep(5)

    profiles = StudentProfile.objects.all()

    for profile in profiles:
        if not profile.social_network:
            continue

        driver.get(profile.social_network)
        time.sleep(5)

        try:
            work_field = driver.find_element(By.CSS_SELECTOR, '.display-flex.align-items-center.mr1.t-bold > span')
            work_info = work_field.text.strip()
            print("Место работы для профиля {}: {}".format(profile.id, work_info))

            profile.work_status = work_info
            profile.save()
        except NoSuchElementException:
            print("Информация о месте работы не найдена на странице для профиля", profile.id)

    driver.quit()

@swagger_auto_schema(
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        required=['quote', 'contact', 'social_network', 'work_status', 'achievement', 'instes_radius'],
        properties={
            'quote': openapi.Schema(type=openapi.TYPE_STRING),
            'contact': openapi.Schema(type=openapi.TYPE_STRING),
            'social_network': openapi.Schema(type=openapi.TYPE_STRING),
            'work_status': openapi.Schema(type=openapi.TYPE_STRING),
            'achievement': openapi.Schema(type=openapi.TYPE_STRING),
            'instes_radius': openapi.Schema(type=openapi.TYPE_STRING),
        },
    ),
    responses={200: 'OK', 400: 'Invalid Data'},
    operation_description="Update student profile"
)

def patch(self, request, id):
    try:
        profile = StudentProfile.objects.get(id=id)
    except StudentProfile.DoesNotExist:
        return Response({"error": "Студент с указанным ID не найден"}, status=status.HTTP_404_NOT_FOUND)

    old_social_network = profile.social_network

    serializer = StudentProfileSerializer(profile, data=request.data, partial=True)
    if serializer.is_valid():
        serializer.save()

        new_social_network = serializer.validated_data.get('social_network', None)

        if old_social_network != new_social_network and new_social_network:
            self.__class__.linkedin_login_and_work_parsing(profile)

        return Response(serializer.data, status=status.HTTP_200_OK)
    return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN)
Вернуться на верх