2017-07-23 2 views
-1

Ich kratze die Twitter-Website. (API wird nicht zum Abrufen historischer Daten verwendet.). Kleinere Bereiche werden früher angezeigt, aber wenn Sie einen größeren Bereich erstellen, müssen Sie viel Zeit aufwenden.Gibt es eine Möglichkeit, Web-Scraping mit Selen zu beschleunigen?

Außerdem gibt es einen Fehler, dass die Verbindung nach einer langen Zeit gestoppt wird.

Also meine Frage ist, gibt es eine Möglichkeit, Web-Scraping mit Selenium zu beschleunigen? Oder muss ich meinen Code ändern?

#python3 
import requests 
import time 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from bs4 import BeautifulSoup 

browser = webdriver.PhantomJS('C:\phantomjs-2.1.1-windows/bin/phantomjs') 
url =u'https://twitter.com/search?f=tweets&vertical=default&q=%EC%84%B8%EC%9B%94%ED%98%B8%20since%3A2014-04-16%20until%3A2014-04-17&src=typd&lang=ko' 


browser.get(url) 
time.sleep(1) 

body = browser.find_element_by_tag_name('body') 


for _ in range(10000): 
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    time.sleep(0.1) 

tweets=browser.find_elements_by_class_name('tweet-text') 

wfile = open("140416.txt", mode='w', encoding='utf8') 
data={} 
i = 1 
for i, tweet in enumerate(tweets): 
    data['text'] = tweet.text 
    print(i, ":", data) 
    wfile.write(str(data) +'\n') 
    i += 1 
wfile.close() 
+4

Ihr Skript schläft für 100 ms x 10000 mal = 1000 s = ca. 17 min. Wenn Sie also Ihren Code so ändern: '# time.sleep (0.1)' wird Ihr Skript um 17 Minuten schneller machen. –

+0

Sie können auch die .findAll-Datei von BeautifulSoup verwenden, um die Tweets zu erfassen (z. B. driver.page_source). Bs4 ist nicht die Lichtgeschwindigkeit, aber immer noch viel schneller beim Analysieren von HTML als Selen. – jlaur

+0

@jlaur Mit BeautifulSoup, werden Sie nicht nur zwanzig Tweets bringen? Ich muss mehrere Tweets mitbringen, Wissen Sie, wie man mehrere Tweets mit BeautifulSoup importiert? Wenn es dir nichts ausmacht, kannst du mir beibringen? – jiji

Antwort

0


1. Es gibt eine Menge von Daten. Laut meinem Skript gibt es 8509 Tweets. Es erfordert also ca. 425 Scroll Downs. Jeder Bildlauf kann 0,8-5 Sekunden dauern. Das Scrollen dauert also ~ 14-20 Minuten.
2. Wiederholen Sie 10.000 Mal nach unten scrollen garantiert nicht, dass es alle Tweets lädt. Sie sollten Elemente nach dem Scrollen besser zählen, prüfen Sie, ob es erhöht wird oder nicht.

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
import time 

dcap = dict(DesiredCapabilities.PHANTOMJS) 
dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 " 
    "(KHTML, like Gecko) Chrome/15.0.87" 
) 
browser = webdriver.PhantomJS(desired_capabilities=dcap, executable_path='path') 
url =u'https://twitter.com/search?f=tweets&vertical=default&q=%EC%84%B8%EC%9B%94%ED%98%B8%20since%3A2014-04-16%20until%3A2014-04-17&src=typd&lang=ko' 
browser.get(url) 
time.sleep(3) 

ended = False 
try: 
    WebDriverWait(browser, 10).until(
     EC.presence_of_element_located((By.CSS_SELECTOR, ".tweet-text")) 
    ) 
except: 
    print("Can't find tweet text.") 

tweetCount = int(browser.execute_script("return document.querySelectorAll('.tweet-text').length")) 
retryCount = 0 
startTime = time.time() 
sleepTime=1 
while not ended: 
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    time.sleep(sleepTime) 
    timeX= time.time() 
    newCount = int(browser.execute_script("return document.querySelectorAll('.tweet-text').length")); 
    timeY=time.time() 
    if(newCount > tweetCount): 
     tweetCount = newCount 
     retryCount = 0 
     print("Count: " + str(tweetCount)) 
    else: 
     retryCount = retryCount + 1 
     if(retryCount>=5): 
      ended = True 
      retryCount = 0 


endScrollDownTime = time.time() 
tweets = browser.find_elements_by_css_selector('.tweet-text') 
wfile = open("140416.txt", mode='w', encoding='utf8') 
data={} 
i = 1 
for i, tweet in enumerate(tweets): 
    data['text'] = tweet.text 
    wfile.write(str(data) +'\n') 
    i += 1 


endGetTextTime = time.time() 
time1 = endScrollDownTime-startTime 
time2 = endGetTextTime - endScrollDownTime 
overAll = endGetTextTime - startTime 
print('\n\nLength: '+str(len(tweets))+ '\nScrolldown Time:' + str(time1) + '\nGetText Time: ' + str(time2) + '\nOverall: ' + str(overAll)) 
browser.quit() 
+0

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53" "(KHTML, wie Gecko) Chrome/15.0.87" was ist gemein? Ich benutze 64 Bit für Windows 10. Ist es verwendbar wie es ist? Wenn ich es reparieren muss, wie repariere ich es? – jiji

+0

@jiji ist es 'User-Agent' des Webbrowsers. Ich muss es einstellen. Andernfalls funktioniert Twitter nicht auf meinem Computer. Sie können andere Werte festlegen. Siehe Beispiel [hier] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent). – Buaban

+0

Ich drehe mich jetzt um. Ich habe auch Fragen. Wie repariere ich, wenn ich den Inhalt eines Tweet mit Anzahl sehen möchte? 1. apple (enter) 2.bus (enter) /// In Kommentaren gibt es keine Eingabefunktion. Mit anderen Worten, Sie möchten Tweets nach Zeilen speichern. – jiji

Verwandte Themen