YouTube Commentaire Grattage 400 réponse

voix
0

Je suis en train de gratter les commentaires d'une vidéo YouTube, mais je reçois une erreur de code 400 de réponse. Il fonctionne, mais en fonction de la vidéo je ne peux pas aller au- delà du 3 au 5 page. Je l' isolement à la fois la chaîne de requête et le formulaire de données correctement qui sont utilisés lorsque je vérifie les outils de dev-Chrome, mais pour une raison quelconque, je retourner 400 vers la mi-moyens. Qu'est-ce que je fais mal? Je sais que YouTube a une API, mais les limites me laissant gratter la place. J'ai un ancien script qui fonctionne très bien et je sais que cela peut se faire sans Sélénium ou API YouTube, mais maintenant que je suis en train de mettre à jour mon code à utiliser au https://www.youtube.com/comment_service_ajax?action_get_comments=1lieu de plus 'https://www.youtube.com/comment_ajax'je suis en cours d' exécution des problèmes. entrez

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)
Créé 02/09/2018 à 05:25
source utilisateur
Dans d'autres langues...                            

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