Боевой краулер Python (4) | Имитация входа в торговый центр Jingdong Mall

Python внешний интерфейс WeChat рептилия

Добавить Автора

Публичный аккаунт WeChat:Наука Pythondata

Знаю почти:


В первых двух статьях мы рассказали вам о некоторых концепциях и методах использования http в краулерах, в основном мы представили основные статьи.http的请求头, в расширенной главе мы в основном представляемcookieа такжеsession(Для получения подробной информации нажмите на ссылку выше для обзора). Но на самом деле еще многое нужно знать о http в краулерах, например,token,oauthЖдать. Блогеры подробно расскажут об этих концепциях одну за другой в последующих статьях, а в этой статье мы поделимся с вами в основном одной из первых двух статей.模拟登录Собственно примеры.

Сначала я хотел взять Zhihu в качестве примера, но я видел слишком много руководств по моделированию входа в Zhihu в Интернете, поэтому я использовал Zhihu в качестве примера.“京东”Например.

Как мы все знаем, JD.com может получить доступ к содержимому домашней страницы без входа в систему. Таким образом, смысл имитации входа в систему заключается в просмотре личной информации, такой как получение информации о личной транзакции (элементы корзины покупок, записи истории покупок, информация о предметах для быть полученным и т. д.), или информацию о продажах товара продавца, отзывы и т. д.

Хорошо, теперь, когда у нас есть фон, давайте начнем симулировать вход в систему.

Готов к работе

post请求用户名和密码).对于浏览器而言,只输入用户名和密码就可以登陆了(偶尔有验证码),那是因为浏览器在背后都帮你处理好了。而爬虫的模拟登录过程需要我们自己解决,因此我们需要弄清楚浏览器的那些背后操作是如何进行的才能对症下药。

Трудности:

  • Доступ и использовать информацию о файле cookie
  • Обработка кодов подтверждения

Открываем браузер, блогер используетChromeбраузер. первое использованиеCtrl+Shift+NВойдите в чистый режим инкогнито, чтобы предотвратить вмешательство предыдущих данных cookie.

Введите URL-адрес для входа в JingdongPassport.jingdong.com/new/login Аааа…для входа в следующий интерфейс входа.

информация о поле формы

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

Нажмите, чтобы войти, затем мы видимFormData, которая представляет собой информацию о форме, которую браузер каждый раз отправляет на сервер.

На первый взгляд все казалось безнадежным. Но не волнуйтесь, эти поля на самом деле доступны везде. насCtrl+UОткройте исходный код страницы входа Jingdong, а затемCtrl+FПопробуйте поискать информацию об этих полях.

искать сначалаuuidПоле, найдите его в исходном коде, находится рядом с какой-то другой информацией о поле, оно должно жить вместе. Мы видим, что помимоloginname,nloginpwd,authcode,Все остальные поляhiddenТип, который является隐藏Поле.

Cookiejarсделанный на заказopenerrequestsмодуль для реализации.

Модули запросов было проще реализовать, так как внутри них есть хороший пакет автоматической обработки Cookie. Первый запрос на передачу может быть получен куки-файлом сервера, последующие запросы автоматически принимаются с переданной информацией куки-файла. Конечно, вы также можете вручную добавить Cookie, Cookie вручную добавляет высокий приоритет и переопределяет информацию по умолчанию.

Чтобы проиллюстрировать использование имитации входа в систему, этот блогер будет использовать модуль простых запросов для завершения обработки файлов cookie.

Обработка кодов подтверждения

Существует также множество способов обработки проверочного кода, которые можно разделить на自动识别сумма手动识别.

  • Чтобы обработать код подтверждения вручную, необходимо загрузить изображение кода подтверждения на локальный компьютер по ссылке кода подтверждения, а затем вручную ввести информацию для завершения ввода информации.
  • Автоматическая идентификация выполняется с использованием некоторых передовых алгоритмических методов, которые можно выполнить с помощьюOCRИнтеллектуальное распознавание изображений,机器学习Обучение распознаванию и др.

В этой статье будет выбран ручной ввод кода подтверждения, чтобы понять процесс имитации входа в систему.

Код

Начальная конфигурация

class JD_crawl:
    def __init__(self, username, password):
        self.headers = {
                        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
                                      ' (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36',
                        'Referer': 'https://www.jd.com/',
                        }
        self.login_url = "https://passport.jd.com/new/login.aspx"
        self.post_url = "https://passport.jd.com/uc/loginService"
        self.auth_url = "https://passport.jd.com/uc/showAuthCode"
        self.session = requests.session()
        self.username = username
        self.password = password
  • создалJD_crawlКласс, который устанавливает экземплярheadersа такжеsessionОбъект сеанса и тремя обратного запроса URL необходимо использовать.
  • Поскольку весь вход в систему представляет собой завершенный процесс, последующие запросы должны использовать один и тот же процесс.session会话对象.

Извлечь данные для входа в форму

    def get_login_info(self):
        html = self.session.get(self.login_url, headers=self.headers).content
        soup = BeautifulSoup(html, 'lxml')

        uuid = soup.select('#uuid')[0].get('value')
        eid = soup.select('#eid')[0].get('value')
        fp = soup.select('input[name="fp"]')[0].get('value')  # session id
        _t = soup.select('input[name="_t"]')[0].get('value')  # token
        login_type = soup.select('input[name="loginType"]')[0].get('value')
        pub_key = soup.select('input[name="pubKey"]')[0].get('value')
        sa_token = soup.select('input[name="sa_token"]')[0].get('value')

        auth_page = self.session.post(self.auth_url,
                                      data={'loginName': self.username, 'nloginpwd': self.password}).text
        print(auth_page)
        if 'true' in auth_page:
            auth_code_url = soup.select('#JD_Verification1')[0].get('src2')
            auth_code = str(self.get_auth_img(auth_code_url))
        else:
            auth_code = ''

        data = {
            'uuid': uuid,
            'eid': eid,
            'fp': fp,
            '_t': _t,
            'loginType': login_type,
            'loginname': self.username,
            'nloginpwd': self.password,
            'chkRememberMe': True,
            'pubKey': pub_key,
            'sa_token': sa_token,
            'authcode': auth_code
            }
        return data
  • первым войти в системуlogin_urlИнициируйте запрос, получите исходный код страницы входа и передайтеBeautifulSoupинструмент синтаксического анализаccs选择器для извлечения скрытой информации поля.
  • loginname,nloginpwd,authcodeТри не скрытых поля требуют ручного ввода пользователем.
  • На вопрос о том, вводить ли проверочный код, вы можете запроситьhttps://passport.jd.com/uc/showAuthCode(auth_url в коде) судить.

Результатом запроса является строка в следующем формате.

请求结果: ({"verifycode":xxx})
xxx:true 或者 false

Таким образом, вы можете просто проверить, имеет ли результатtrueчтобы определить, требуется ли код подтверждения.

  • еслиtrueauthcodeОтправьте, чтобы заполнить поля формы входа.
  • authcode

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

получить код подтверждения

    def get_auth_img(self, url):
        auth_code_url = 'http:{}&yys={}'.format(url, str(int(time.time()*1000)))
        auth_img = self.session.get(auth_code_url, headers=self.headers)
        with open('authcode.jpg', 'wb') as f:
            f.write(auth_img.content)
        code_typein = input('请根据下载图片输入验证码:')
        return code_typein
  • Ссылка на код аутентификации, полученная из исходного кода, является относительной ссылкой.src2
     src2="//authcode.jd.com/verify/image?a=1&acid=dcb4370b-2763-44e6-83ff-4b89bc01193d&uid=dcb4370b-2763-44e6-83ff-4b89bc01193d"

src2http:. Но когда мы попробуем этот URL найдут время, чтобы скачать фотографию, не удалось, а почему?

Поскольку вам также нужно добавить метку времени в конце, посмотрите на следующееonclick, который имеет и в строкеsrc2Точно такая же ссылка, но подробнее в конце&yys= ''.通过观察内容发现有dateа такжеtimeСлова, то это может быть основано на时间戳字符串.

onclick="this.src= document.location.protocol +'//authcode.jd.com/verify/image?a=1&acid=dcb4370b-2763-44e6-83ff-4b89bc01193d&uid=dcb4370b-2763-44e6-83ff-4b89bc01193d&yys='+new Date().getTime();$('#authcode').val('');"

намекать:

Отметка времени (цитата из энциклопедии Baidu):

Отметка времени относится к общему количеству секунд с 01 января 1970 г. 00:00:00 по среднему времени по Гринвичу (01 января 1970 г., 08:00:00 по пекинскому времени) до настоящего времени.

Временные метки доступны в Pythontime模块Что нужно сделать:

time.time()*1000
  • Сохраните изображение капчи какjpgформате, хранящемся в каталоге файлов проекта.

Вы видите, что картинка находится в каталоге, двойным щелчком открываем ее и вводим проверочный код согласно картинке.

    def login(self):
        data = self.get_login_info()
        headers = {
                    'Referer': self.post_url,
                    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
                                  ' (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36',
                    'X-Requested-With': 'XMLHttpRequest'
                  }
        try:
            login_page = self.session.post(self.post_url, data=data, headers=headers)
            print(login_page.text)
        except Exception as e:
            print(e)
  • Запрошенный URL-адресhttps://passport.jd.com/uc/loginService
  • "S"

({"success":"http://www.jd.com"})

Чтобы проверить логин действительно успешным, теперь блоггеры корзины, чтобы сделать эксперимент, если найдено во имя назначенных товаров, получите исходный код, так что успех.

Ну это все небрежно поставлено раньше, просто пользуйтесь牙线Для тестовой цели.

    def shopping(self):
        carshop = self.session.post('https://cart.jd.com/cart.action', headers=self.headers)
        print(carshop.text)

простой запрос购物车url.在下载的源码中搜索“牙”

Суммировать

В этой статье в основном представлен симулированный метод входа в торговый центр Jingdong.Конечно, есть некоторые веб-сайты с более сложными механизмами входа, такие какweiboЛогин нужно звонитьapi, нам нужно подробно прочитать описание API.

В будущем мы поделимся дополнительной информацией о симулированном входе в систему, пожалуйста, поправьте меня.

Ссылка на ссылку:https://github.com/xchaoinfo/fuck-login http://blog.csdn.net/weixin_38206454/article/details/78655209?locationNum=2&fps=1


Обратите внимание на публичный аккаунт WeChatPythonНаука о данных,Получать120GУчебные материалы по искусственному интеллекту.