Crawler + Automatisierungstool --- Selenium ausführliche Erklärung und praktische Projekte


Vorwort

    1. Was ist Selen
      Selenium ist ein Tool zum Testen von Webanwendungen.
      Solange das erwartete Benutzerverhalten und die erwarteten Ergebnisse im Testfall beschrieben werden, erhalten wir eine funktionale Testsuite, die automatisch ausgeführt werden kann.
      Die Selenium-Testsuite läuft direkt im Browser, genau wie ein echter Benutzer, der den Browser bedient.
      Selenium ist ebenfalls ein Open-Source-Framework, das unter der Apache License 2.0-Vereinbarung veröffentlicht wird.
      Zu den Hauptfunktionen der Selenium-Tools gehören:
      Testen Sie die Kompatibilität zwischen dem Programm und dem Browser und testen Sie, ob Ihre Anwendung in verschiedenen Browsern und darüber hinaus gut funktionieren kann des Betriebssystems.
      Testen Sie die Systemfunktionalität und erstellen Sie Regressionstests, um die Softwarefunktionalität und Benutzeranforderungen zu überprüfen.
    1. Was sind die Eigenschaften von Selen?
      Open Source, kostenlos
      Multi-Browser-Unterstützung: FireFox, Chrome, IE, Opera, Safari
      Multi-Plattform-Unterstützung: Linux, Windows, MAC
      Mehrsprachige Unterstützung: Java, Python, Ruby, PHP, C#, JavaScript usw.
      Gute Unterstützung für Webseiten Unterstützt die verteilte Testfallausführung
      Einfach (einfache API), flexibel (gesteuert durch die Entwicklungssprache)
    1. Warum Selenium-Technologie lernen
      Selenium ist ein automatisiertes Testtool, das den Browser dazu bringen kann, bestimmte Aktionen auszuführen, wie das Öffnen von Webseiten, das Crawlen von Daten usw., und das kann es auch Rufen Sie den Quellcode der aktuell vom Browser gerenderten Seite ab und crawlen Sie ihn, wenn er sichtbar ist. Für einige dynamisch gerenderte JavaScript-Seiten ist diese Crawling-Methode sehr effektiv.
      Viele Website-Daten stammen von Schnittstellen, und die Schnittstellen sind verschlüsselt. Wir können Selenium verwenden, um den Browser zu öffnen und auf Webseiten zuzugreifen dynamische Daten statisch, wodurch Anti-Crawler-Maßnahmen umgangen werden.

1. Vorbereitung

In diesem Abschnitt wird Chrome als Beispiel verwendet, um die Verwendung von Selenium zu erläutern. Bevor Sie beginnen, stellen Sie sicher, dass Sie den Chrome-Browser korrekt installiert und ChromeDriver konfiguriert haben. Darüber hinaus müssen Sie auch die Selenium-Bibliothek von Python korrekt installieren

  • Selenium-Dokumentation: https://selenium-python-zh.readthedocs.io/en/latest/

1.1 Umgebungsinstallation

Google-Download: https://www.google.cn/chrome/

pip install selenium

1.2 Treiber installieren

Offizielle Website: http://chromedriver.storage.googleapis.com/index.html

Beachten:

  • Der Treiber muss der Browserversion entsprechen, sonst kann er nicht gestartet werden.
  • Browser-Updates deaktivieren. Öffnen Sie cmd und geben Sie „services.msc“ ein, um den Hintergrunddienst zu öffnen und automatische Browser-Updates zu deaktivieren.

Prinzip: Selenium öffnet den Browser entsprechend dem Treiber, um funktionale Vorgänge auszuführen

2. Deklarieren Sie das Browserobjekt

  • Selenium unterstützt viele Browser wie Chrome, Firefox, Edge usw. sowie mobile Browser wie Android und BlackBerry. Darüber hinaus wird auch der schnittstellenlose Browser PhantomJS unterstützt.

Initialisierung

from selenium import webdriver


browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

Damit ist die Initialisierung des Browserobjekts abgeschlossen und dem Browserobjekt zugewiesen. Als nächstes müssen wir nur noch das Browserobjekt aufrufen und es verschiedene Aktionen ausführen lassen, um Browservorgänge zu simulieren.

3. Grundlegende Verwendung

3.1 Laden Sie die angegebene Seite und schließen Sie sie

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 打开指定(chrome)浏览器
browser = webdriver.Chrome()
# 指定加载页面
browser.get("http://www.baidu.com/")
# 通过name属性选择文本框元素,并设置内容
browser.find_element(By.NAME,'wd').send_keys("selenium")
# 通过通过ID属性获取“百度一下”按钮,并执行点击操作
browser.find_element(By.ID,"su").click()
# 提取页面
print(browser.page_source.encode('utf-8'))
# 提取cookie
print(browser.get_cookies())
# 获取当前页面截屏
print(browser.get_screenshot_as_file('123.png'))
# 提取当前请求地址
print(browser.current_url)
# 设置五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()

4. Initialisierungskonfiguration

from selenium import webdriver
options = webdriver.ChromeOptions()

# 禁止图片
prefs = {
    
    "profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs", prefs)

# 无头模式 在后台运行
# options.add_argument("-headless")

# 通过设置user-agent
user_ag='MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22;CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
options.add_argument('user-agent=%s'% user_ag)


#隐藏"Chrome正在受到自动软件的控制"
options.add_experimental_option('useAutomationExtension', False) # 去掉开发者警告
options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 拓展使用
extension_path = r'E:\BaiduNetdiskDownload\Chrome插件\iguge_2011\igg_2.0.11.crx'
options.add_extension(extension_path)

#设置代理
# options.add_argument("--proxy-server=http://58.20.184.187:9091")

# 初始化配置
browser = webdriver.Chrome(chrome_options=options)

#将浏览器最大化显示
browser.maximize_window()
# 设置宽高
browser.set_window_size(480, 800)

# 通过js新打开一个窗口
browser.execute_script('window.open("http://httpbin.org/ip");')

5. Knoten finden

  • Selenium kann den Browser dazu bringen, verschiedene Vorgänge auszuführen, z. B. Formulare auszufüllen, Klicks zu simulieren usw. Wir möchten beispielsweise den Vorgang der Texteingabe in ein Eingabefeld abschließen oder Daten erfassen, und Selenium bietet eine Reihe von Methoden zum Suchen von Knoten. Mit diesen Methoden können wir die gewünschten Knoten abrufen, damit wir einige Aktionen ausführen oder OK ausführen können .

  • Die neue Version von Selen bietet zwei Methoden

    • find_element()-Serie: Wird zum Auffinden einzelner Seitenelemente verwendet.
    • find_elements()-Serie: Wird verwendet, um eine Reihe von Seitenelementen zu finden und eine Reihe von Listen abzurufen.

5.1 Einzelner Knoten

Code

from selenium import webdriver
from selenium.webdriver.common.keys import Keys  # 模拟键盘操作
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
# 通过name属性选择文本框元素,并设置内容
s = browser.find_element(By.NAME,'wd')
s.send_keys('衣服')
s.send_keys(Keys.ENTER)   # 回车 确定的意思

Verschiedene Demonstrationen zur Knotenextraktion

browser.get("http://www.baidu.com")
# ID选择器定位
input_text = browser.find_element(By.ID, "kw")
input_text.send_keys("selenium")
# CSS 选择器定位
s =browser.find_element(By.CSS_SELECTOR,'input.s_ipt')
s.send_keys('衣服')
# xpath 选择器定位
s = browser.find_element(By.XPATH,'//input[@id="kw"]')
s.send_keys('衣服')

5.2 Mehrere Knoten

  • Wenn Sie alle Knoten finden möchten, die die Bedingungen erfüllen, müssen Sie eine Methode wie find_elements() verwenden. Beachten Sie, dass im Namen dieser Methode das Element ein zusätzliches s enthält. Achten Sie daher auf die Unterscheidung.

Code

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.icswb.com/channel-list-channel-161.html')
lis = browser.find_elements(By.CSS_SELECTOR,'#NewsListContainer li')
print(lis)

Zusätzliche Erklärung:
Wie Sie sehen können, wird der erhaltene Inhalt zu einem Listentyp und jeder Knoten in der Liste ist vom Typ WebElement.

6. Knoteninteraktion

  • Selenium kann den Browser dazu bringen, einige Vorgänge auszuführen, was bedeutet, dass es dem Browser ermöglichen kann, die Ausführung einiger Aktionen zu simulieren. Die häufigeren Verwendungen sind: Verwenden Sie die send_keys-Methode zum Eingeben von Text, die Clear-Methode zum Löschen von Text und die Click-Methode zum Klicken auf eine Schaltfläche.

Code

from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element(By.ID,'kw')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element(By.ID,'su')
button.click()

Mit der oben genannten Methode haben wir einige gängige Knotenaktionsvorgänge abgeschlossen. Weitere Vorgänge finden Sie in der interaktiven Aktionseinführung im offiziellen Dokument: http://selenium-python.readthedocs.io/api.html#module-selenium. webdriver .remote.webelement.

7. IFrame wechseln

  • Auf der Webseite gibt es einen Knoten namens iframe, bei dem es sich um einen Unterrahmen handelt, der einer Unterseite der Seite entspricht. Seine Struktur ist genau die gleiche wie die der externen Webseite. Nachdem Selenium die Seite geöffnet hat, arbeitet es standardmäßig im übergeordneten Frame. Wenn die Seite einen untergeordneten Frame enthält, kann es die Knoten im untergeordneten Frame nicht abrufen. Zu diesem Zeitpunkt müssen Sie die Methode switch_to.frame () verwenden, um Frame zu wechseln.
    Code-Implementierung
browser.get('https://www.douban.com/')
login_iframe = browser.find_element(By.XPATH,'//div[@class="login"]/iframe')
browser.switch_to.frame(login_iframe)
browser.find_element(By.CLASS_NAME,'account-tab-account').click()
browser.find_element(By.ID,'username').send_keys('123123123')

Hinweis: Bei Iframe-Webseiten müssen Sie zu diesen wechseln, um sie finden zu können

8. Aktionskette

  • Methode „drag_and_drop()“.

  • Im obigen Beispiel werden einige interaktive Aktionen auf einem bestimmten Knoten ausgeführt. Beispielsweise rufen wir für das Eingabefeld die Methoden „Eingabetext“ und „Klartext“ auf; für die Schaltfläche rufen wir die Methode „Klick“ auf. Tatsächlich gibt es andere Vorgänge, für die es keine spezifischen Ausführungsobjekte gibt, z. B. das Ziehen mit der Maus, Tastenanschläge auf der Tastatur usw. Diese Vorgänge werden auf andere Weise ausgeführt, nämlich in der Aktionskette.

  • Implementieren Sie nun beispielsweise die Ziehoperation eines Knotens und ziehen Sie einen Knoten von einem Ort an einen anderen

Code

from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
log = browser.find_element(By.XPATH, '//div[@id="iframewrapper"]/iframe')
browser.switch_to.frame(log)
source = browser.find_element(By.CSS_SELECTOR,'#draggable')
target = browser.find_element(By.CSS_SELECTOR,'#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
  • Die Methode „drag_and_drop()“ umfasst die Übergabe von Parametern. Einer ist der Startpunkt des zu ziehenden Elements und der andere ist der Endpunkt des zu ziehenden Elements.

  • Öffnen Sie zunächst eine Drag-Instanz auf der Webseite, wählen Sie dann den zu ziehenden Knoten und den zu ziehenden Zielknoten aus, deklarieren Sie dann das ActionChains-Objekt und weisen Sie es der Aktionsvariablen zu. Rufen Sie dann die Methode „drag_and_drop()“ der Aktionsvariablen auf Anschließend führt der Aufruf der Methode perform () die Aktion aus und der Ziehvorgang ist zu diesem Zeitpunkt abgeschlossen

9. Scrollen der Seite

Code

# 浏览器滚动到底部 10000位置
document.documentElement.scrollTop=10000
# 滚动到顶部
document.documentElement.scrollTop=0

# 移动到页面最底部  
browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
 
# 移动到指定的坐标(相对当前的坐标移动)
driver.execute_script("window.scrollBy(0, 700)")
# 结合上面的scrollBy语句,相当于移动到700+800=1600像素位置  
driver.execute_script("window.scrollBy(0, 800)")
 
# 移动到窗口绝对位置坐标,如下移动到纵坐标1600像素位置  
driver.execute_script("window.scrollTo(0, 1600)")
# 结合上面的scrollTo语句,仍然移动到纵坐标1200像素位置  
driver.execute_script("window.scrollTo(0, 1200)")

9.1 Fall zum Scrollen von Seiten

  • Für einige Vorgänge stellt die Selenium-API diese nicht bereit. Wenn Sie beispielsweise den Fortschrittsbalken herunterziehen, kann die Ausführung von JavaScript direkt simuliert werden. In diesem Fall können Sie die Methodeexecute_script() verwenden.

Code

# document.body.scrollHeight 获取页面高度

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://36kr.com/')
# scrollTo  不叠加 200 200    scrollBy 叠加  200 300  500操作
# 慢慢的下拉
for i in range(1,9):
    time.sleep(random.randint(100, 300) / 1000)
    browser.execute_script('window.scrollTo(0,{})'.format(i * 700)) # scrollTo 不叠加 700 1400 2100
  • Hier verwenden wir die Methode „execute_script()“, um den Fortschrittsbalken nach unten zu ziehen
    Mit dieser Methode können also grundsätzlich alle Funktionen, die nicht von der API bereitgestellt werden, von JavaScript ausgeführt werden WAHR.

10. Knoteninformationen abrufen

Labelattribute abrufen

  • Wir können die Methode get_attribute() verwenden, um die Attribute eines Knotens abzurufen, aber die Voraussetzung ist, dass der Knoten zuerst ausgewählt werden muss

Code

from selenium import webdriver
url = 'https://pic.netbian.com/4kmeinv/index.html'
browser.get(url)
src = browser.find_elements(By.XPATH,'//ul[@class="clearfix"]/li/a/img')
for i in src:
    url = i.get_attribute('src')
    print(url)

Durch die Methode get_attribute() und die anschließende Übergabe des Namens des Attributs, das Sie abrufen möchten, können Sie dessen Wert ermitteln

11. Verzögertes Warten

  • In Selenium beendet die get()-Methode die Ausführung, nachdem der Webseiten-Frame geladen wurde. Wenn die page_source zu diesem Zeitpunkt abgerufen wird, handelt es sich möglicherweise nicht um die Seite, die vom Browser vollständig geladen wurde. Wenn einige Seiten zusätzliche Ajax-Anfragen haben , wir werden es möglicherweise nicht erfolgreich erhalten. Daher müssen Sie eine bestimmte Zeit verzögern und warten, um sicherzustellen, dass der Knoten geladen wurde.

Verwendung
Geben Sie den zu findenden Knoten und dann eine maximale Wartezeit an. Wenn der Knoten innerhalb der angegebenen Zeit geladen wird, wird der gesuchte Knoten zurückgegeben. Wenn der Knoten immer noch nicht innerhalb der angegebenen Zeit geladen wird, wird eine Timeout-Ausnahme ausgelöst.

Code

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
button = wait.until(EC.element_to_be_clickable((By.ID, 'su')))
print(input, button)

Ergänzende Erklärung
Dies hat zur Folge, dass, wenn der Knoten mit der ID q (d. h. das Suchfeld) innerhalb von 10 Sekunden erfolgreich geladen wird, der Knoten zurückgegeben wird; wenn ja überschreitet Wenn es 10 Sekunden lang nicht geladen wird, wird eine Ausnahme ausgelöst.

Für Schaltflächen können Sie die Wartebedingung beispielsweise auf element_to_be_clickable ändern, was anklickbar bedeutet. Wenn Sie also nach Schaltflächen suchen, suchen Sie mit dem CSS-Selektor .btn-search nach Schaltflächen. Wenn sie innerhalb von 10 Sekunden anklickbar sind, bedeutet dies, dass sie es ist erfolgreich geladen. Wenn der Schaltflächenknoten länger als 10 Sekunden nicht anklickbar ist, also nicht geladen wurde, wird eine Ausnahme ausgelöst.

  • Wartebedingungen und ihre Bedeutung
Wartezustand Bedeutung
title_is Der Titel ist etwas
title_contains Der Titel enthält etwas
present_of_element_located Der Knoten wird geladen und das Positionierungstupel wird übergeben, z. B. (By.ID, ‚p‘)
Sichtbarkeit_des_Elements_located Der Knoten ist sichtbar und übergibt das Positionierungstupel
Sichtbarkeit_von Es ist ersichtlich, dass das Knotenobjekt übergeben wird
present_of_all_elements_located Alle Knoten werden geladen
text_to_be_present_in_element Ein bestimmter Knotentext enthält einen bestimmten Text
text_to_be_present_in_element_value Ein Knotenwert enthält einen bestimmten Text
Frame_to_be_available_and_switch_to_it Frame laden und schalten
invisibility_of_element_located Knoten ist nicht sichtbar
element_to_be_clickable Knoten ist anklickbar
abgestandenheit_von Stellen Sie fest, ob sich ein Knoten noch im DOM befindet und ob die Seite aktualisiert wurde
element_to_be_selected Knoten kann ausgewählt werden, Knotenobjekt übergeben
element_located_to_be_selected Der Knoten kann ausgewählt und das Positionierungstupel übergeben werden.
element_selection_state_to_be Übergeben Sie das Knotenobjekt und den Status und geben Sie bei Gleichheit „True“ zurück, andernfalls „False“.
element_located_selection_state_to_be Übergeben Sie das Positionierungstupel und den Status und geben Sie bei Gleichheit „True“ zurück, andernfalls „False“.
alarm_is_present Ob eine Warnung angezeigt wird

12. Tab-Verwaltung

  • Beim Besuch einer Webseite werden Tabs geöffnet. In Selenium können wir auch mit Tabs arbeiten

Code

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1])

browser.get('https://www.baidu.com')
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])
browser.get('https://pic.netbian.com')

Ergänzende Erklärung
Die Konsolenausgabe lautet wie folgt:

['CDwindow-4f58e3a7-7167-4587-bedf-9cd8c867f435', 'CDwindow-6e05f076-6d77-453a-a36c-32baacc447df']
  • Zuerst habe ich Baidu besucht und dann die Methodeexecute_script() aufgerufen. Hier habe ich die JavaScript-Anweisung window.open() übergeben, um einen neuen Tab zu öffnen. Als nächstes wollen wir zu diesem Reiter wechseln. Hier wird das Attribut window_handles aufgerufen, um alle aktuell geöffneten Tabs abzurufen, und eine Liste der Tab-Codes wird zurückgegeben. Um die Registerkarten zu wechseln, rufen Sie einfach die Methode switch_to_window() auf, wobei der Parameter der Codename der Registerkarte ist. Hier übergeben wir den zweiten Tab-Code, das heißt, wir springen zum zweiten Tab, öffnen dann eine neue Seite unter dem zweiten Tab, wechseln dann zurück zum ersten Tab, rufen die Methode switch_to_window() erneut auf und führen dann andere Vorgänge aus .

13. Ausnahmebehandlung

  • Bei der Verwendung von Selenium treten zwangsläufig einige Ausnahmen auf, z. B. Zeitüberschreitungen, nicht gefundene Knoten usw. Wenn solche Fehler auftreten, wird das Programm nicht weiter ausgeführt. Hier können wir die try-except-Anweisung verwenden, um verschiedene Ausnahmen abzufangen.

Code

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out')
try:
    browser.find_element(By.ID,'hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()

Ergänzende Erklärung
Hier verwenden wir try außer, um verschiedene Ausnahmen abzufangen. Beispielsweise erfassen wir die Ausnahme „NoSuchElementException“ für die Methode „find_element_by_id()“ zum Suchen von Knoten, sodass die Ausnahme behandelt wird und das Programm nicht unterbrochen wird, sobald ein solcher Fehler auftritt.

Die Konsolenausgabe lautet wie folgt:

No Element

14. Umgehungserkennung

# 无处理
browser.get('https://bot.sannysoft.com/')

# 设置屏蔽
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
browsers = webdriver.Chrome(chrome_options=options)
browsers.get('https://bot.sannysoft.com/')

15. Selen-Beispiele

  • Sammeln Sie Produkte von einer bestimmten Produktmesse
from selenium import webdriver
import time
import random
from pymongo import MongoClient
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class WeiPin():

    def __init__(self):
        self.client = MongoClient(host='127.0.0.1', port=27017)
        self.col = self.client['spiders']['weipinhui']
        options = webdriver.ChromeOptions()
        options.add_experimental_option('useAutomationExtension', False)  # 去掉开发者警告
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 不加载图片
        prefs = {
    
    "profile.managed_default_content_settings.images": 2}
        options.add_experimental_option("prefs", prefs)
        self.browser = webdriver.Chrome(options=options)
        self.browser.maximize_window()

    def base(self):
        self.browser.get('https://www.vip.com/')
        wait = WebDriverWait(self.browser, 10)
        input = wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@class="c-search-input  J-search-input"]')))
        button = wait.until(
            EC.element_to_be_clickable((By.XPATH, '//a[@class="c-search-button  J-search-button  J_fake_a"]')))
        input.send_keys('口红')
        time.sleep(random.randint(3000, 3400) / 1000)
        button.click()
        time.sleep(random.randint(1000, 1400) / 1000)

    def spider(self):
        self.drop_down()
        # print(self.browser.page_source)
        node_list = self.browser.find_elements(By.XPATH,
                                               '//section[@id="J_searchCatList"]/div[@class="c-goods-item  J-goods-item c-goods-item--auto-width"]')
        # print(node_list)
        for node in node_list:
            price = node.find_element(By.XPATH,
                                      './/div[@class="c-goods-item__sale-price J-goods-item__sale-price"]').text
            title = node.find_element(By.XPATH, './/div[2]/div[2]').text
            try:
                discount = node.find_element(By.XPATH,
                                             './/div[@class="c-goods-item__main-price     J-goods-item__main-price"]/div[@class="c-goods-item__discount  J-goods-item__discount"]').text
            except Exception as e:
                print('数据为空')
                discount = '空'
            try:
                market_price = node.find_element(By.XPATH,
                                                 './/div[@class="c-goods-item__market-price  J-goods-item__market-price"]').text
            except Exception as e:
                print('数据为空')
                market_price = '空'

            item = {
    
    
                'title': title,
                'price': price,
                'discount': discount,
                'market_price': market_price
            }
            print(item)
            self.save_mongo(item)
        self.page_next()

    def save_mongo(self, item):
        if isinstance(item, dict):
            self.col.insert_one(item)

    def page_next(self):
        try:
            next_button = self.browser.find_element(By.XPATH, '//*[@id="J_nextPage_link"]')
            if next_button:
                next_button.click()
                self.spider()
            else:
                self.browser.close()

        except Exception as e:
            self.browser.close()

    def drop_down(self):
        for x in range(1, 10):
            js = f"document.documentElement.scrollTop = {
      
      x * 1000}"
            self.browser.execute_script(js)
            time.sleep(random.randint(500, 800) / 1000)


if __name__ == '__main__':
    weipin = WeiPin()
    weipin.base()
    weipin.spider()

Erklärung
Der gesamte Inhalt dieses Artikels dient nur dem Lernen und der Kommunikation und wird nicht für andere Zwecke verwendet. Der vollständige Code wird nicht bereitgestellt. Der Paketerfassungsinhalt und vertrauliche URLs , Datenschnittstellen usw. wurden verarbeitet. Desensibilisierung, kommerzielle und illegale Nutzung sind strengstens untersagt, ansonsten hat der Autor keinerlei Einfluss auf die Konsequenzen.

Schreiben Sie am Ende:
Mein Schreibniveau ist begrenzt. Wenn es Erklärungen gibt, die nicht stimmen oder falsch sind, geben Sie mir bitte im Kommentarbereich einige Ratschläge und wir können es tun Machen Sie gemeinsam Fortschritte. Wenn Sie Code- und Erklärungskommunikation benötigen, können Sie sich an WeChat 18847868809 wenden

Guess you like

Origin blog.csdn.net/m0_52336378/article/details/131470901