Тайм-аут обработки с Selenium и Python - PullRequest
0 голосов
/ 07 ноября 2019

Кто-нибудь может мне помочь с этим? Я написал код для очистки статей с китайского новостного сайта, используя Selenium. Поскольку многие URL-адреса не загружаются, я попытался включить код для перехвата исключений тайм-аута, который работает, но затем браузер, похоже, остается на странице, для которой истек тайм-аут при загрузке, а не для перехода к следующему URL-адресу.

Я попытался добавить driver.quit () и driver.close () после обработки ошибки, но затем она не работает при переходе к следующему циклу.

with open('url_list_XB.txt', 'r') as f:
    url_list = f.readlines()

for idx, url in enumerate(url_list):
    status = str(idx)+" "+str(url)
    print(status)

    try:
        driver.get(url)
        try:
            tblnks = driver.find_elements_by_class_name("post_topshare_wrap")
            for a in tblnks:
                html = a.get_attribute('innerHTML')
                try:
                    link = re.findall('href="http://comment(.+?)" title', str(html))[0]
                    tb_link = 'http://comment' + link
                    print(tb_link)
                    ID = tb_link.replace("http://comment.tie.163.com/","").replace(".html","")
                    print(ID)
                    with open('tb_links.txt', 'a') as p:
                        p.write(tb_link + '\n')
                    try:
                        text = str(driver.find_element_by_class_name("post_text").text)
                        headline = driver.find_element_by_tag_name('h1').text
                        date = driver.find_elements_by_class_name("post_time_source")
                        for a in date:
                            date = str(a.text)
                            dt = date.split(" 来源")[0]
                            dt2 = dt.replace(":", "_").replace("-", "_").replace(" ", "_")

                        count = driver.find_element_by_class_name("post_tie_top").text

                        with open('SCS_DATA/' + dt2 + '_' + ID + '_INT_' + count + '_WY.txt', 'w') as d:
                            d.write(headline)
                            d.write(text + '\n')
                        path = 'SCS_DATA/' + ID
                        os.mkdir(path)

                    except NoSuchElementException as exception:
                        print("Element not found ")
                except IndexError as g:
                    print("Index Error")


            node = [url, tb_link]
            results.append(node)

        except NoSuchElementException as exception:
            print("TB link not found ")
        continue


    except TimeoutException as ex:
        print("Page load time out")

    except WebDriverException:
        print('WD Exception')

Я хочу, чтобы код перемещался по списку URL-адресов, вызывая их и получая текст статьи, а также ссылку на страницу обсуждения. Он работает до тех пор, пока время загрузки страницы не истечет, и программа не будет двигаться дальше.

1 Ответ

0 голосов
/ 07 ноября 2019

Я не могу точно понять, что делает ваш код, потому что у меня нет контекста для страницы, которую вы автоматизируете, но я могу предоставить общую структуру того, как вы могли бы выполнить что-то подобное. Вот упрощенная версия того, как я справлюсь с вашим сценарием:

# iterate URL list
for url in url_list:

    # navigate to a URL
    driver.get(url)

    # check something here to test if a link is 'broken' or not
    try: 
        driver.find_element(someLocator)

    # if link is broken, go back
    except TimeoutException:
        driver.back()
        # continue so we can return to beginning of loop
        continue

    # if you reach this point, the link is valid, and you can 'do stuff' on the page

Этот код переходит к URL-адресу и выполняет некоторую проверку (которую вы укажете), чтобы определить, является ли ссылка «битой» или нет. Мы проверяем наличие неработающей ссылки, перехватывая TimeoutException, которое было брошено. Если выдается исключение, мы переходим на предыдущую страницу, затем вызываем continue, чтобы вернуться к началу цикла, и начинаем заново со следующего URL.

Если мы сделаем это через try/ except блок, тогда URL действителен и мы на правильной странице. В этом месте вы можете написать свой код, чтобы почистить статьи или все, что вам нужно сделать.

Код, который появляется после try / except, будет срабатывать ТОЛЬКО, если TimeoutException НЕ встречается -- означает, что URL действителен.

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