Aquí podría ser tu PUBLICIDAD


YouTube Comment raspado de respuesta 400

votos
0

Estoy tratando de raspar los comentarios de un vídeo de YouTube, pero estoy recibiendo un error de código de respuesta 400. Funciona, pero dependiendo del video que no puede conseguir más allá del 3 al 5 de la página. Estoy aislar tanto la cadena de consulta y correctamente el formulario de datos que se utilizan cuando compruebo Chrome dev-herramientas, pero por alguna razón, puedo volver un 400 hacia mediados de los caminos. ¿Qué estoy haciendo mal? Sé que tiene una API de YouTube, pero las limitaciones me están dejando lugar para raspar. Tengo una escritura más antigua que funciona muy bien, así que sé que se puede hacer sin el selenio o el API de YouTube, pero ahora que estoy tratando de actualizar mi código para utilizar https://www.youtube.com/comment_service_ajax?action_get_comments=1en lugar de la más antigua 'https://www.youtube.com/comment_ajax'que estoy corriendo en problemas. introducir

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 el 02/09/2018 a las 05:25
fuente por usuario M4cJunk13
En otros idiomas...        العربية       


Aquí podría ser tu PUBLICIDAD