Назову себя Гантенбайном...

В заметке Заголовки запроса мы говорили о том, как параметром HTTP-заголовка User-Agent "переодеть" робота в человека. Далее, мы создавали сессию. Что делать, если разным сессиям нужны разные имена агента?

Зачем это нужно?

Но позвольте,-- спросит читатель,-- сессию придумали, чтобы установки не менялись. Зачем теперь делать обратное?

...Такое понадобится, как минимум, в двух ситуациях.

  1. При работе с отдельными страницами сайта может потребоваться его мобильная версия. Бывает, такие страницы лучше структурированы, содержат меньше украшений, а потому HTML-парсер с ними лучше справляется. Для получения мобильной версии в заголовке User-Agent нужно указать имя того или иного мобильного браузера.

  2. Когда объем данных исчисляется десятками миллионов собирать их эффективнее не одним краулером, а распределенно, с нескольких хостов 1. IP-адреса на разных машинах различаются, так что по этому признаку сервер не догадается, что данные стекаются в одну базу. Но если при этом строки 'User-Agent' в непрерывном потоке запросов совпадают, налицо схема! На "той стороне" могут заподозрить неладное.

Код

Итак, наша цель — добиться того, чтобы при инициализации очередного "паука" случайным образом выбирался тот или иной 'User-Agent'. При этом должна быть возможность указывать, нужен ли нам мобильный браузер или обычный.

Для начала объявим в конфигурации или внутри скрипта два глобальных массива: с названиями мобильных клиентов и для обычной версии.

WWW_USER_AGENTS = [
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:28.0) Gecko/20100101 Firefox/28.0',
    'Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0',
    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0',
    'Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0',
    # ... other names here        
]

MOB_USER_AGENTS = [
    'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16',
    'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B350 Safari/8536.25',
    'Mozilla/5.0 (Linux; U; Android 2.3.3; zh-tw; HTC_Pyramid Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari',
    # ... other names  here
]
```

Оба списка можно расширять сколько угодно. Строки несложно найти в Интернете.

Функция pick_user_agent вернет случайно выбранную строку. Если вызвать ее с параметром mobile=True, будет использован список мобильных клиентов.

import random

def pick_user_agent(mobile=False):
    ua_strings = MOB_USER_AGENTS if mobile else WWW_USER_AGENTS
    return random.choice(ua_strings)

...Теперь функцию create_session можно вызвать так:

# обычный браузер
www_session = create_session(req_headers={'user-agent': pick_user_agent()})

# мобильный браузер
www_session = create_session(req_headers={'user-agent': pick_user_agent(mobile=True)})

  1. Таким способом я собирал информацию об отелях и отзывы с сайта http://tripadvisor.com для одного проекта. В моем распоряжении было как минимум 5 хостов, на каждом из которых параллельно работали до 30 краулеров. 

social

Яндекс.Метрика