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

Использовать сеанс запросов

s = requests.Session ()
page_response = s.get (URL)

Это сохраняет файлы cookie, а также поддерживает соединение. Если вы извлечете 2 URL-адреса с одного и того же веб-сайта, как правило, быстрее.

Вы также можете установить общие заголовки в сеансе.

Установите заголовки Referer

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

url_a - вероятно, домашняя страница сайта, url_b - страница, которую вы хотите.

s = requests.Session ()
headers = {'User-Agent': generate_user_agent (device_type = "desktop", os = ('mac', 'linux'))}
s.update_headers (заголовки )

page_response_a = s.get (url_a, timeout = 5, allow_redirects = True)
page_response_b = s.get (url_b, timeout = 5, allow_redirects = True, headers = {‘Referer’: page_response_a.url})

Использование значений формы LXML

Итак, на многих сайтах вы в конечном итоге следуете форме, чтобы сформировать множество скрытых значений.

lxml - это обертка вокруг красивого супа для синтаксического анализа HTML, и у него есть изящный способ извлечения значений из формы.

doc = lxml.html.fromstring (html)
form = doc.get_element_by_id (‘Form1’)
form_values ​​= dict (form.form_values ​​())

Просматривайте сайт без javascript

Javascript может помочь или помешать.

Некоторые веб-сайты кажутся действительно сложными с включенным javascript - формы обрабатываются на стороне клиента. Волшебные коды отслеживания, которые ломаются. Если вы отключите javascript в своем браузере и выполните веб-инспектор. Иногда вас кормят более простым сайтом.

С другой стороны, некоторые сайты настолько сфокусированы на javascript, что используют внутренние API для взаимодействия с сервером. Вы можете пропустить парсинг полностью (за исключением иногда окна входа в систему, которое дает идентификатор сеанса) и использовать API-интерфейсы json для получения необходимых данных.