Как заставить механизированные запросы выглядеть так, как будто они исходят из реального браузера - PullRequest
9 голосов
/ 07 января 2011

ОК, вот информация заголовка (только пример), которую я получил от Live HTTP Header при входе в учетную запись:

http://example.com/login.html

POST /login.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://example.com
Cookie: blahblahblah; blah = blahblah
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
username=shane&password=123456&do=login

HTTP/1.1 200 OK
Date: Sat, 18 Dec 2010 15:41:02 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.2.14
Set-Cookie: blah = blahblah_blah; expires=Sun, 18-Dec-2011 15:41:02 GMT; path=/; domain=.example.com; HttpOnly
Set-Cookie: blah = blahblah; expires=Sun, 18-Dec-2011 15:41:02 GMT; path=/; domain=.example.com; HttpOnly
Set-Cookie: blah = blahblah; expires=Sun, 18-Dec-2011 15:41:02 GMT; path=/; domain=.example.com; HttpOnly
Cache-Control: private, no-cache="set-cookie"
Expires: 0
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 4135
Keep-Alive: timeout=10, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Обычно я бы написал так:

import mechanize
import urllib2

MechBrowser = mechanize.Browser()
LoginUrl = "http://example.com/login.html"
LoginData = "username=shane&password=123456&do=login"
LoginHeader = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729)", "Referer": "http://example.com"}

LoginRequest = urllib2.Request(LoginUrl, LoginData, LoginHeader)
LoginResponse = MechBrowser.open(LoginRequest)

Над кодом работает нормально. Мой вопрос заключается в том, нужно ли мне также добавить следующие строки (и больше в предыдущей информации заголовка) в LoginHeader, чтобы это действительно выглядело как серфинг Firefox, а не как механизация?

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Какие части / сколько информации заголовка необходимо подделать, чтобы она выглядела "реальной"?

Ответы [ 3 ]

6 голосов
/ 07 января 2011

Это зависит от того, что вы пытаетесь «обмануть». Вы можете попробовать некоторые онлайн-сервисы, которые делают простой анализ пользовательского агента, чтобы оценить ваш успех:

http://browserspy.dk/browser.php

http://www.browserscope.org (ищите «Мы думаем, что вы используете ...»)

http://www.browserscope.org/ua

http://panopticlick.eff.org/ -> поможет вам выбрать некоторые «слишком общие для отслеживания» параметры

http://networking.ringofsaturn.com/Tools/browser.php

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

Одна вещь, которую вы должны учитывать, это то, что отсутствие JS может поднять красные флаги, поэтому захват отправленных заголовков также с отключенным JS.

5 голосов
/ 03 апреля 2011

Вот как вы устанавливаете пользовательский агент для всех запросов, сделанных mechanize.Browser

br = mechanize.Browser()
br.addheaders = [('User-agent', 'your user agent string here')]

Механизатор может также заполнять формы

br.open('http://yoursite.com/login')
br.select_form(nr=1) # select second form in page (0 indexed)
br['username'] = 'yourUserName' # inserts into form field with name 'username'
br['password'] = 'yourPassword'
response = br.submit()
if 'Welcome yourUserName' in response.get_data():
    # login was successful
else:
    # something went wrong
    print response.get_data()

См. Примеры механизации. для получения дополнительной информации

0 голосов
/ 03 июня 2011

Если вы недовольны отсутствием ботов / скриптов / ненастоящих браузеров, вам нужно искать такие вещи, как порядок HTTP-запросов, разрешить добавление одного ресурса с помощью JavaScript.Если этот ресурс не запрашивается или запрашивается раньше JavaScript - тогда вы знаете, что это «фальшивый» браузер.Вы также можете посмотреть количество запросов на соединение (keep-alive) или просто проверить, загружены ли все CSS-файлы первой страницы (учитывая, что они находятся вверху HTML).

YMMVно это может стать довольно громоздким, чтобы симулировать достаточно, чтобы заставить некоторый «фальшивый» браузер проходить как «настоящий» (используемый людьми).

...