Заставить Selenium получить список URL из файла .txt - PullRequest
0 голосов
/ 30 марта 2019

У меня есть код, который возвращает заголовок списка URL-адресов.Я хотел бы конкретизировать это несколькими способами.

Это код:

from pyvirtualdisplay import Display
from time import sleep
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.options import Options
display = Display(visible=0, size(800,600))
display.start()
urls = ["https://google.com", "https://youtube.com"]
driver = webdriver.Firefox(executable_path='/usr/local/lib/geckodriver/geckodriver')
driver.set_page_load_timeout(60)
for url in urls:
        try:
           driver.get(url)
           print(driver.title)
        except TimeoutException as e:
           print("Timeout")
driver.quit()

С этим я хотел бы сделать следующее.Во-первых, вместо того, чтобы брать список таких URL, я бы хотел, чтобы их взяли из .txt.Затем я также хочу, чтобы при проверке отдельного URL-адреса он ожидал перехода своего заголовка из раздела «Загрузка ...» во что-то другое и затем печатал то, во что он изменился.Чтобы сделать это, я попробовал это:

while driver.title == 'Loading...':  
     pass
print(driver.title)

Проблема здесь в том, что иногда заголовок никогда не изменится с «Загрузка ...», поэтому программа застрянет там навсегда.Я хочу, чтобы, если через 10 секунд он еще не изменился, он переходит на следующий URL из списка после печати «Заголовок не загружен».

Есть еще одна вещьЯ хотел бы добавить, что я не уверен, как.Он печатает заголовок с помощью «print (driver.title)».Я хотел бы добавить число после заголовка («print (driver.title),« number »). Причина этого числа состоит в том, чтобы узнать, сколько URL-адресов он прошел до сих пор, но он не запускаетсяв 1. Это будет начинаться с большего числа, например, 50. Это означает, что на 5-м URL-адресе должно быть «название URL-адреса, 55.» Как я могу это сделать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 марта 2019

Вот обновленный скрипт с вашими требованиями.

from pyvirtualdisplay import Display
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.options import Options
from datetime import datetime

# this method will check the driver title after the specified interval seconds for a given max time in seconds
def wait_until_browser_loaded(interval, maxTime):
    start_time = datetime.now()
    elements = []
    while (datetime.now() - start_time).seconds < maxTime:
        time.sleep(interval)
        if driver.title != 'Loading...':
            return

display = Display(visible=0, size(800,600))
display.start()
# open and readlines from external input file
urlsFile = open("urls_file_path_goes_here", "r")
urls = urlsFile.readlines() # use this if you want to enter urls in different lines
#urls = urlsFile.read().split(",") # use this if you want to enter comma separated urls.

driver = webdriver.Firefox(executable_path='/usr/local/lib/geckodriver/geckodriver')
driver.set_page_load_timeout(60)
titleAppendNumber = 50
for url in urls:
        try:
            driver.get(url)

            title = driver.title
            if title == "Loading...":
                wait_until_browser_loaded(5, 10)
            if title == "Loading...":
                print ("Title Load" + " - " + str(titleAppendNumber))
            else:
                print (title + " - "+ str(titleAppendNumber))
            titleAppendNumber +=1
        except TimeoutException as e:
           print("Timeout")
driver.quit()
1 голос
/ 30 марта 2019

Что касается возможности тайм-аута через 10 секунд, если заголовок не изменился, я могу предложить вам то, что я использую с Java.Я знаю, что вы используете Python, но это то, что я должен показать.Вы должны иметь возможность отключить соответствующий синтаксис Python

def timeExpired = false

def timeoutPeriod = new TimeDuration(0, 0, 10, 0)

def timeStart = new Date()

def titleFound = false

def title

while(!titleFound && !timeExpired){ //While title is not found AND time has not expired run loop

    try{

        title = driver.title

        titleFound = title != "Loading..."

        if(!titleFound){  //No need to check if time expired if title has been found, so only checking if it hasn't

            timeExpired = TimeCategory.minus(new Date(), timeStart) > timeoutPeriod

            if(timeExpired){

                title = "Title didn't load"
            }
        }                   
    }
    catch(Exception e){

        //Handle the exception
    }
}

print(title)

Чтобы подать URL-адреса из текстового файла, отдельные URL-адреса запятыми и прочитать содержимое:

text_file = open("filename.txt", "r")
lines = text_file.read().split(',')

Я неPython запущен и работает, чтобы подтвердить, что это точно, но затем вы можете перебрать строки и передать URL таким образом и перемещаться по драйверу, как вы уже делаете.

Наконец, чтобы добавить счетчикчтобы распечатать, вам просто нужно установить переменную счетчика, прежде чем вы начнете циклически перебирать свои URL, чтобы начать с любого числа, которое вы хотите.

counter = 50

Затем внутри цикла вы будете увеличивать каждый раз на 1:

counter += 1

Чтобы добавить это к распечатке, вы можете сделать следующее:

print(title + " " + str(counter))

Синтаксис может быть не идеальным, но он должен быть близким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...