YouTube Комментарий Зачистка 400 ответа

голоса
0

Я пытаюсь скрести комментарии из видео YouTube, но я получаю сообщение об ошибке код ответа 400. Он работает, но в зависимости от видео , которое я не могу пройти 3 - го по 5 - й странице. Я изолируя как строки запроса и данных формы правильно, которые используются при проверке Chrome Dev-инструменты, но по какой - то причине, я вернусь 400 по направлению к середине путей. Что я делаю неправильно? Я знаю , что YouTube имеет API, но ограничения покидают меня царапать вместо этого. У меня есть старший скрипт , который работает очень хорошо , так что я знаю , что это может быть сделано без селена или YouTube API, но теперь, когда я пытаюсь обновить свой код , чтобы использовать https://www.youtube.com/comment_service_ajax?action_get_comments=1вместо старшя 'https://www.youtube.com/comment_ajax'я бег в проблемы. введите

import os
import sys
import requests
import time
import json
from bs4 import BeautifulSoup
from unidecode import unidecode
from pprint import pprint
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'

def find_token(html, key, num_chars=2):
    pos_begin = html.find(key) + len(key) + num_chars
    pos_end = html.find('', pos_begin)
    return html[pos_begin: pos_end]


def request_session(video_url):
    session = requests.Session()
    session.headers['User-Agent'] = USER_AGENT
    retry = Retry(connect=3, backoff_factor=0.5)
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    s = requests.Session()
    s.headers['User-Agent'] = USER_AGENT
    r = s.get(video_url)
    html = r.text
    return html, s

def create_params(ctoken, itct):
    params = {'action_get_comments':1,'pbj':1,'ctoken':ctoken,'continuation':ctoken, 'itct':itct}
    return params

def ajax_request(session, url, params, data, retries=1, sleep=1):
    for _ in range(retries):
        response = session.post(url, params=params, data=data)
        print(response.status_code)
        print(response.url)
        if response.status_code == 200:
            response_dict = json.loads(response.text)
            return response_dict['load_more_widget_html'], response_dict['content_html']
        else:
            time.sleep(sleep)

def intial_html_page(video_url):
    intial_html, session = request_session(video_url)
    session_token = find_token(intial_html, 'XSRF_TOKEN', 4)
    ctoken = find_token(intial_html, 'COMMENTS_TOKEN', 4)
    itct = find_token(intial_html, 'itct', 4)
    return session, session_token, ctoken, itct

video_url_0 = 'https://www.youtube.com/watch?v=plv1CgaGm9Q'


url = 'https://www.youtube.com/comment_service_ajax?'
html_list = []

session, session_token, ctoken, itct = intial_html_page(video_url_0)
data = {'session_token': session_token}
params = create_params(ctoken, itct)

continue_loading = True

while continue_loading:
    widget, ajax_html = ajax_request(session, url, params, data)
    html_list.append(widget)

    load_more_href = find_token(widget, 'data-uix-load-more-href=', 1)
    itct = find_token(widget, 'data-sessionlink=itct=', 0)
    ctoken = find_token(widget, 'page_token', 1)
    load_more_TF = find_token(widget, 'data-uix-load-more-post', 2)
    params = create_params(ctoken, itct)
Задан 02/09/2018 в 05:25
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more