Como usar o Selenium para automatizar o navegador Firefox para rastreamento distribuído e multithread de conteúdo Javascript

Exibir 11.jpg

visão geral

Web crawler é uma tecnologia para obter automaticamente dados da web, que podem ser usados ​​para análise de dados, recuperação de informações, inteligência competitiva, etc. Enfrentando muitos desafios, como conteúdo Javascript carregado dinamicamente, mecanismo anti-crawler, atraso de rede, limitações de recursos, etc. Técnicas avançadas de rastreamento para resolver esses problemas incluem navegador automatizado Selenium, rastreamento multithread e distribuído.
Selenium é uma ferramenta de teste automatizado de código aberto que pode simular operações do usuário em um navegador, como abrir páginas da web, clicar em links e inserir texto. Suporta vários navegadores, como Firefox, Chrome, IE, etc. O Selenium retorna ao código-fonte da página da web após aguardar a execução do Javascript, manipula facilmente o conteúdo carregado dinamicamente e ignora mecanismos simples anti-rastreador, como códigos de verificação e cookies.
Multithreading é uma técnica de programação que permite aos programas executar múltiplas tarefas simultaneamente, melhorando a eficiência e o desempenho. Os rastreadores multithread podem rastrear várias páginas da web ao mesmo tempo, reduzindo o atraso da rede e o tempo de espera. O design e o gerenciamento razoáveis ​​de pools de threads, filas e bloqueios são necessários para evitar problemas como segurança de threads, competição de recursos e consumo de memória.
Distribuído é uma arquitetura de sistema que divide uma tarefa grande em várias subtarefas pequenas e as executa em paralelo em computadores diferentes. Os rastreadores distribuídos aproveitam ao máximo os vários recursos do computador, aumentando a escala e a velocidade. Precisa usar frameworks e ferramentas profissionais, como Scrapy, Celery, Redis, etc., para resolver problemas de complexidade e sobrecarga.

texto

Neste artigo, apresentaremos como usar o Selenium para automatizar o rastreamento multithread e distribuído de conteúdo Javascript no navegador Firefox. Tomaremos um exemplo simples para obter os títulos e links na página de resultados de pesquisa do Baidu e salvar os resultados em um arquivo local. Codificaremos em Python e usaremos um servidor proxy rastreador para ocultar nosso endereço IP real.
Primeiro, precisamos instalar a biblioteca Selenium e o navegador Firefox, baixar a versão correspondente do driver geckodriver e colocá-lo na variável de ambiente Python. Então, precisamos importar os seguintes módulos:

# 导入模块
import requests
import threading
import queue
import time
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.proxy import Proxy, ProxyType

Em seguida, precisamos definir uma função para criar um objeto de navegador Firefox automatizado Selenium e definir o servidor proxy do rastreador e outros parâmetros:

# 创建浏览器对象并设置爬虫代理服务器
def create_browser():
    # 亿牛云 爬虫代理加强版 代理服务器
    proxyHost = "www.16yun.cn"
    proxyPort = "31111"

    # 代理验证信息
    proxyUser = "16YUN"
    proxyPass = "16IP"

    # 设置代理服务器
    proxy = Proxy()
    proxy.proxy_type = ProxyType.MANUAL
    proxy.http_proxy = proxyHost + ":" + proxyPort
    proxy.ssl_proxy = proxyHost + ":" + proxyPort

    # 设置代理验证信息
    proxy.add_to_capabilities(DesiredCapabilities.FIREFOX)

    # 创建浏览器对象
    browser = webdriver.Firefox()

    # 设置浏览器窗口大小
    browser.set_window_size(800, 600)

    # 设置浏览器超时时间
    browser.set_page_load_timeout(10)

    # 设置浏览器代理验证信息
    browser.get("http://t.16yun.cn:31111")
    browser.find_element_by_id("username").send_keys(proxyUser)
    browser.find_element_by_id("password").send_keys(proxyPass)
    browser.find_element_by_id("submit").click()

    # 返回浏览器对象
    return browser

Então, precisamos definir uma função para pegar o título e o link de uma página web e salvar o resultado em um arquivo local:

# 抓取一个网页的标题和链接,并将结果保存到本地文件中
def crawl_page(browser, url, file):
    # 打开网页
    browser.get(url)

    # 获取网页标题和链接
    titles = browser.find_elements_by_xpath("//h3[@class='t']/a")
    links = [title.get_attribute("href") for title in titles]

    # 将结果写入文件中
    with open(file, "a", encoding="utf-8") as f:
        for title, link in zip(titles, links):
            f.write(title.text + "\t" + link + "\n")

A seguir, precisamos definir uma função para gerar a lista de URLs da página de resultados de pesquisa do Baidu. Usaremos "Selenium" como palavra-chave para obter os resultados das primeiras 10 páginas:

# 生成百度搜索结果页面的URL列表
def generate_urls(keyword, pages):
    # 定义URL列表
    urls = []

    # 定义百度搜索结果页面的基本URL
    base_url = "https://www.baidu.com/s?wd=" + keyword

    # 循环生成URL列表
    for page in range(1, pages + 1):
        # 定义每一页的URL参数
        params = "&pn=" + str((page - 1) * 10)

        # 拼接完整的URL并添加到列表中
        url = base_url + params
        urls.append(url)

    # 返回URL列表
    return urls

A seguir, precisamos definir uma função para executar a lógica principal do rastreador multithread. Usaremos um pool de threads para gerenciar vários objetos do navegador e usaremos uma fila para armazenar a lista de URLs a serem rastreados:

# 执行多线程爬虫的主要逻辑
def run_crawler(keyword, pages, threads, file):
    # 生成百度搜索结果页面的URL列表
    urls = generate_urls(keyword, pages)

    # 创建一个队列来存储待抓取的URL列表,并将URL添加到队列中
    q = queue.Queue()
    for url in urls:
        q.put(url)

    # 创建一个线程池来管理多个浏览器对象,并创建对应数量的浏览器对象并添加到线程池中
    pool = []
    for i in range(threads):
        browser = create_browser()
        pool.append(browser)

    # 定义一个函数来执行每个线程的任务,即从队列中获取一个URL,并使用一个浏览器对象来抓取该网页,并将结果保存到本地文件中,然后释放该浏览器对象,并重复该过程,直到队列为空或出现异常
    def worker():
        while True:
            try:
                # 从队列中获取一个URL,如果队列为空,则退出循环
                url = q.get(block=False)
            except queue.Empty:
                break

            try:
                # 从线程池中获取一个浏览器对象,如果线程池为空,则退出循环
                browser = pool.pop()
            except IndexError:
                break

            try:
                # 使用浏览器对象来抓取该网页,并将结果保存到本地文件中
                crawl_page(browser, url, file)
            except Exception as e:
                # 打印异常信息
                print(e)

            finally:
                # 将浏览器对象放回线程池中
                pool.append(browser)

# 创建一个空列表来存储多个线程对象,并创建对应数量的线程对象并添加到列表中,并启动每个线程
threads = []
for i in range(threads):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

# 等待所有线程结束
for t in threads:
    t.join()

# 关闭所有浏览器对象
for browser in pool:
    browser.quit()

Finalmente, precisamos definir uma função principal para chamar a função definida acima e definir alguns parâmetros, como palavras-chave, número da página, número do thread, nome do arquivo, etc.:

# 主函数
def main():
    # 设置关键词
    keyword = "Selenium"

    # 设置页数
    pages = 10

    # 设置线程数
    threads = 5

    # 设置文件名
    file = "results.txt"

    # 执行多线程爬虫的主要逻辑
    run_crawler(keyword, pages, threads, file)

# 调用主函数
if __name__ == "__main__":
    main()

O caso

Executando o código acima, podemos ver os seguintes resultados no arquivo local:
Selenium - Web Browser Automation Selenium - Web Browser Automation (https://www.selenium.dev/)
Selenium Tutorial_w3cschool Selenium Tutorial_w3cschool (https: //www.w3cschool .cn/selenium/)
Selenium_ Baidu Encyclopedia Selenium_ Baidu Encyclopedia (https://baike.baidu.com/item/Selenium/1096491)
Selenium Tutorial - Tutorial para novatos Tutorial de selênio - Tutorial para novatos (https://www.runoob.com/ selenium/selenium-tutorial.html)
Selenium Chinese Community_Selenium Automation Testing_Selenium Tutorial_Selenium … Selenium Chinese Community_Selenium Automation Testing_Selenium Tutorial_Selenium … (http://www.selenium.org.cn/)
Selenium - Wikipedia Selenium - Wikipedia (https://en.wikipedia) .org/wiki/Selenium)

epílogo

Este artigo descreve como usar o Selenium para automatizar os navegadores Firefox para rastreamento distribuído e multithread de conteúdo Javascript. Através de um exemplo simples, mostramos como escrever código na linguagem Python e usar um servidor proxy crawler para ocultar nosso endereço IP real. Também apresentamos algumas vantagens, desvantagens e precauções da tecnologia crawler.Espero que este artigo seja útil para você.

Acho que você gosta

Origin blog.csdn.net/ip16yun/article/details/131917712
Recomendado
Clasificación