Comentário YouTube raspagem 400 resposta

votos
0

Estou tentando raspar os comentários de um vídeo do YouTube, mas eu estou recebendo um erro de código 400 resposta. Ele funciona, mas dependendo do vídeo que não pode passar o terceiro ao quinto página. Estou isolar tanto a string de consulta e dados de formulário corretamente que são usados quando eu verificar Chrome dev-ferramentas, mas por alguma razão, eu voltar a 400 em meados de maneiras. O que estou fazendo de errado? Eu sei que o YouTube tem uma API, mas as limitações estão me deixando para raspar em seu lugar. Eu tenho um script mais velho que funciona muito bem, então eu sei que isso pode ser feito sem selênio ou API YouTube, mas agora que eu estou tentando atualizar meu código para usar https://www.youtube.com/comment_service_ajax?action_get_comments=1em vez do mais velho 'https://www.youtube.com/comment_ajax'eu estou correndo em problemas. digite

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)
Publicado 02/09/2018 em 05:25
fonte usuário
Em outras línguas...                            

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