Можно ли использовать Selenium и Threading в Python? Или какие-нибудь альтернативы? - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужно очистить более 1000 различных URL-адресов, и для таких задач я обычно использую запросы + BeautifulSoup. Также легко создавать несколько потоков и открывать несколько URL одновременно, чтобы значительно ускорить процесс. Но я столкнулся с тем, что некоторые URL-адреса загружаются через JS, и я не могу их по-настоящему очистить.

После нескольких часов поиска в Google я обнаружил, что селен позволяет отображать JS страниц и получает HTML , Но, похоже, я не могу найти никакой информации по ускорению сценария на основе селена с помощью Threading. Может ли кто-нибудь предоставить базовый пример использования селена и нитей? Или в основном то, что ускоряет код на основе селена.

Если нет, есть ли альтернативы тому, как я могу сделать JS? Слышал о запросах - html, но, к сожалению, не может установить его по некоторым причинам. Я получаю следующую ошибку:

Не удалось найти функцию xmlCheckVersion в библиотеке libxml2. Установлен ли libxml2?

1 Ответ

1 голос
/ 22 апреля 2020

Вот пример. Это далеко не завершено, но даст вам представление. Чтобы этот пример работал, мне нужно было установить geckodriver (драйвер Firefox), поместить двоичный файл (geckodriver) в мой путь, пакет селен установки pip.

https://selenium-python.readthedocs.io/installation.html#downloading - python -привязки для селена

#!/usr/bin/python3

import threading
import time
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options


RESPONSE = {}
lock = threading.Lock()

class Scraper(threading.Thread):
   def __init__(self, id, urls=[]):
      threading.Thread.__init__(self)
      self.id = id
      self.urls = urls

      # Setup a headless browser
      opts = Options()
      opts.set_headless()
      opts.headless
      self.browser = Firefox(options=opts)

   def run(self):
      print("Starting Thread {}".format(self.id))
      for url in self.urls:
          print("Thread {} Processing URL {}".format(self.id, url))
          self.browser.get(url)
          # Get lock to synchronize threads
          lock.acquire()
          RESPONSE[url] = self.browser.page_source
          lock.release()
      print("Thread-{} done".format(self.id))


urls = ["https://google.com", "https://stackoverflow.com", "http://yahoo.com", "http://msn.com"]
threads = []

# Create threads and give them piece of work each
t1 = Scraper(1, urls[:2])
t2 = Scraper(2, urls[2:])

# Start new Threads
t1.start()
t2.start()

# Add threads to thread list
threads.append(t1)
threads.append(t2)

# Wait for all threads to complete
for t in threads:
    t.join()

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