Не работает парсер 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)