YouTube Kommentar Skraping 400 svar

stemmer
0

Jeg prøver å skrape kommentarene fra en YouTube-video, men jeg mottar en 400 svar kodefeil. Det fungerer, men avhengig av videoen jeg kan ikke komme forbi tredje til femte side. Jeg isolere både søkestrengen og skjemadata korrekt som brukes når jeg sjekker Chrome dev-verktøy, men for noen grunn, får jeg tilbake en 400 mot midten måter. Hva gjør jeg galt? Jeg vet at YouTube har en API, men begrensningene forlater meg å skrape i stedet. Jeg har en eldre script som fungerer veldig bra, så jeg vet det kan gjøres uten Selen eller YouTube API, men nå som jeg prøver å oppdatere min kode for å bruke https://www.youtube.com/comment_service_ajax?action_get_comments=1i stedet for den eldre 'https://www.youtube.com/comment_ajax'jeg kjører inn i problemer. skriv

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)
Publisert på 02/09/2018 klokken 05:25
kilden bruker
På andre språk...                            

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