Хобрук: Ваш путь к мастерству в программировании

Очистка URL-адресов с помощью Python и Selenium

Я пытаюсь заставить работать сценарий python selenium, который должен делать следующее:

  1. Возьмем текстовый файл BookTitle.txt, который представляет собой список названий книг.

  2. Затем с помощью Python / Selenium выполняется поиск этого заголовка на сайте GoodReads.com.

  3. Принимает URL-адрес результата и создает новый файл .CSV со столбцом 1 = название книги и столбцом 2 = URL-адрес сайта.

  4. Я надеюсь, что мы сможем заставить это работать, а затем, пожалуйста, помогите мне шаг за шагом запустить его.

from selenium import webdriver
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.common.exceptions import TimeoutException
from selenium.webdriver.firefox.options import Options
from pyvirtualdisplay import Display
#from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common import keys
import csv
import time
import json

class Book:
    def __init__(self, title, url):
        self.title = title
        self.url = url
    def __iter__(self):
        return iter([self.title, self.url])

url = 'https://www.goodreads.com/'

def create_csv_file():
    header = ['Title', 'URL']
    with open('/home/l/gDrive/AudioBookReviews/WebScraping/GoodReadsBooksNew.csv', 'w+', encoding='utf-8') as csv_file:
        wr = csv.writer(csv_file, delimiter=',')
        wr.writerow(header)

def read_from_txt_file():
    lines = [line.rstrip('\n') for line in open('/home/l/gDrive/AudioBookReviews/WebScraping/BookTitles.txt', encoding='utf-8')]
    return lines

def init_selenium():
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage') 
    options = Options()
    options.add_argument('--headless')
    global driver
    driver = webdriver.Chrome("/home/l/gDrive/AudioBookReviews/WebScraping/chromedriver",  chrome_options=chrome_options)
    driver.get(url)
    time.sleep(30)
    driver.get('https://www.goodreads.com/search?q=')

def search_for_title(title):
    search_field = driver.find_element_by_xpath('//*[@id="search_query_main"]')
    search_field.clear()
    search_field.send_keys(title)
    search_button = driver.find_element_by_xpath('/html/body/div[2]/div[3]/div[1]/div[1]/div[2]/form/div[1]/input[3]')
    search_button.click()

def scrape_url():
    try:
        url = driver.find_element_by_css_selector('a.bookTitle').get_attribute('href')
    except:
        url = "N/A"

    return url

def write_into_csv_file(vendor):
   with open('/home/l/gDrive/AudioBookReviews/WebScraping/GoodReadsBooksNew.csv', 'a', encoding='utf-8') as csv_file:
        wr = csv.writer(csv_file, delimiter=',')
        wr.writerow(list(vendor))

create_csv_file()
titles = read_from_txt_file()    
init_selenium()

for title in titles:
    search_for_title(title)
    url = scrape_url()
    book = Book(title, url)
    write_into_csv_file(book)

Выполняя вышеуказанное, я получаю следующие ошибки:

Отслеживание (последний вызов последним): файл "/home/l/gDrive/AudioBookReviews/WebScraping/GoodreadsScraper.py", строка 68, в файле init_selenium () "/home/l/gDrive/AudioBookReviews/WebScraping/GoodreadsScraper.py" , строка 41, в init_selenium driver = webdriver.Chrome ("/ home / l / gDrive / AudioBookReviews / WebScraping / chromedriver", chrome_options = chrome_options) File "/usr/local/lib/python3.6/dist-packages/selenium/ webdriver / chrome / webdriver.py ", строка 81, в файле init desire_capabilities = желаемый_capabilities)" /usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver. py ", строка 157, в файле init self.start_session (возможности, browser_profile)" /usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py " , строка 252, в start_session response = self.execute (Command.NEW_SESSION, parameters) Файл "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", строка 321, в файле execute self.error_handler.check_response (response) "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", строка 242, в check_response вызывает exception_class (сообщение , экран, stacktrace) selenium.common.exceptions.WebDriverException: сообщение: неизвестная ошибка: не удалось запустить Chrome: аварийный выход (неизвестная ошибка: файл DevToolsActivePort не существует) (процесс запущен из местоположения Chrome / usr / bin / google- chrome больше не работает, поэтому ChromeDriver предполагает, что Chrome разбился.) (Информация о драйвере: chromedriver = 2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634), platform = Linux 4.15.0-60-generic x86_64)


  • Пожалуйста, проверьте свой код и скопируйте / вставьте его снова, есть дублированный контент. 09.09.2019
  • Спасибо, да, наклеил дважды, исправил. 09.09.2019

Ответы:


1

Сейчас я вижу пару ошибок:

1) вам нужно раскомментировать параметры Chrome и прокомментировать firefox ', когда вы передаете хромированный драйвер позже в коде

# from selenium.webdriver.firefox.options import Options
from selenium.webdriver.chrome.options import Options

Кстати, этот pyvirtualdisplay является альтернативой headless chrome, вам не нужно его импортировать.

2) у вас есть два экземпляра Options, и вы используете только первый. Измените свой код на:

def init_selenium():
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage') 
    chrome_options.add_argument('--headless')

Я полагаю, что это только для начала, отредактируйте свой вопрос, когда столкнетесь со следующей проблемой, которую не можете решить.

08.09.2019

2

Вы используете драйвер Chrome, но закомментировали его при импорте.

from selenium.webdriver.chrome.options import Options

В функции поиска процесс следующий: получить страницу -> найти поле поиска -> ввести значение -> ввести ключи -> получить результаты.

Что-то вроде этого:

def search_for_title(title):
    driver.get('https://www.goodreads.com/search?q=')
    search_field = driver.find_element_by_name('q')
    search_field.clear()
    search_field.send_keys(title)
    search_field.send_keys(keys.Keys.RETURN) # you missed this part
    url = driver.find_element_by_xpath(
        '/html/body/div[2]/div[3]/div[1]/div[2]/div[2]/table/tbody/tr[1]/td[2]/a')
    print(url.get_attribute('href'))
08.09.2019
  • Большой! Спасибо, теперь это работает для первого элемента в моем списке, но перестает работать после этого, какие-нибудь идеи? 09.09.2019
  • @ThelmarGeraldashk может быть сон (30) в init_selenium ()? 09.09.2019
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..