Получение Twiiter Likes - PullRequest
       23

Получение Twiiter Likes

0 голосов
/ 16 апреля 2019

Я пытаюсь извлечь информацию из каждого лайка, но он возвращает только неправильное количество лайков или ни одного. Я уверен, что мой код правильный. Я полагаю, что это может быть связано с тем, что Twitter пытается помешать людям соскребать информацию со своего сайта. Есть ли способ это исправить? Также есть ли способ увидеть всех, кому понравился определенный твит?

import re
import requests
import urllib
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from bs4 import BeautifulSoup
import sys
import unittest, time
import openpyxl
url = ["https://twitter.com/CocaCola?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor"]
for x in url:
   d = webdriver.Chrome()
   actions = ActionChains(d)
   d.get(x)
   res = requests.get(x)
   page = urllib.urlopen(x)
   numb = 0;
   SCROLL_PAUSE_TIME = 0.5
# Get scroll height
   last_height = d.execute_script("return document.body.scrollHeight")
   while True:
    # Scroll down to bottom
      d.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # Wait to load page
      time.sleep(SCROLL_PAUSE_TIME)
    # Calculate new scroll height and compare with last scroll height
      new_height = d.execute_script("return document.body.scrollHeight")
      soup = BeautifulSoup(page, "html.parser")
      for posts in soup.findAll('div',{"class":"content"}):
         if(posts.find('p').text.encode('utf-8').find("Retweeted") == -1):
            print(posts.find('span',{"class": "_timestamp js-short-timestamp"}).text)
            print(posts.find('p').text.encode('utf-8'))
            retweet = posts.find('button',{"class": "ProfileTweet-actionButton js-actionButton js-actionFavorite"})
            #print(retweet.find('span',{"class":"ProfileTweet-actionCount"})["data-tweet-stat-count"])
            print(retweet)
            likes = posts.find('div',{"class":"ProfileTweet-action ProfileTweet-action--favorite js-toggleState"})
            print(likes.find('span',{"class": "ProfileTweet-actionCountForPresentation"}))
            numb = numb+1
            if new_height == last_height:
               break
            if numb > 1:
               break
      if numb > 1:
         break
      last_height = new_height
   d.close()

1 Ответ

0 голосов
/ 16 апреля 2019

В этой строке здесь:

soup = BeautifulSoup(page, "html.parser")

, вы передаете BeautifulSoup источник, как видно по запросу urllib, а не по селену. А поскольку urllib не анализирует и не выполняет никакой javascript и css, определенные в / связанные с html, его содержимое отличается от того, с чем работают браузер / пользователи.

Измените это так, чтобы bs работал с визуализированным html:

soup = BeautifulSoup(d.page_source, "html.parser")
...