Вы заставили меня задуматься о нескольких вещах, которые я считаю действительно полезными при парсинге. Я думаю, когда вы хотите очистить более сложные сайты.
Использовать сеанс запросов
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 для получения необходимых данных.