簡體   English   中英

Selenium/Safari 的下一頁

[英]Next page on Selenium/Safari

我試圖在網站上進行一些網絡抓取,但我無法訪問 safari 的下一頁。

該網站是: https : //www.emol.com/todas/

代碼只是給了我兩次第一頁的相同結果,我需要第 3 頁

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common import exceptions
from bs4 import BeautifulSoup
import re
import pandas as pd
import os

browser = webdriver.Safari()
browser.get("https://www.emol.com/todas/")

noticias = []
i = 0
while i < 2:
    try:
        nav = browser.find_elements_by_class_name("cont_bus_txt_detall_2")

        for value in nav:
            noticias.append(value.text)

        browser.find_element_by_css_selector("a[href*='javascript:Next();']").click()
        i += 1

    except exceptions.StaleElementReferenceException:
         pass

下面的代碼是我在 safari 上檢查下一頁的按鈕時:

<a class="next current-page-next-prev" href="javascript:Next();"><span class="txt_siguiente">Siguiente</span> <i class="fa fa-chevron-right"></i></a>
<span class="txt_siguiente">Siguiente</span>
<i class="fa fa-chevron-right"></I>

在此處輸入圖片說明

你在這里做的事情是你引用了 CSS Selector,但是對於多個元素,選擇器可以是相同的,這會導致錯誤,或者如你所說,它會跳轉到同一個網站,因為它選擇器在所有網站上都是靜態的(相同)

試試這個(改變 N,你想要的數字(第二頁 == 2): browser.find_element_by_xpath("/html/body/div[4]/div/div/div/div[3]/div/nav[1]/ul/li[ N ]/a").click()

最簡單的方法是獲取分頁元素的文本。 以下是上述情況的示例:

>>> from selenium import webdriver
>>> driver=webdriver.Chrome()
>>> driver.get('https://www.emol.com/todas/')
>>> pagination_elements = [browser.find_element_by_xpath('//ul[@id="listPages"]/li/a[text()=%s]' % n) for n in range(1,4)]
>>> len(pagination_elements)
# 3
>>> pagination_elements[2].click() # to view page 3

注意這是多么干凈:

//ul[@id="listPages"]/li/a[text()=%s]

您可以使 xpath 越“干凈”,您的抓取對 html 中的更改就越有彈性。 相信我,一個實時站點的 html 一直在變化……請注意,我們也可以通過一行代碼輕松獲得您想要的所有分頁元素。

最后,抓取頁面的更好方法是檢查網絡選項卡並獲取在該 ajax 調用中發出的實際數據。 例如,在 Chrome 開發工具中,它會給你這樣的東西:

https://cache-elastic-pandora.ecn.cl/emol/noticia/​​_search?q=publicada:true+AND+ultimoMinuto:true+AND+seccion : +AND+temas.id: &sort=fechaModificacion:desc&size=15&from =45(<== 注意,StackOverflow 不會標記整個鏈接,因此您需要復制粘貼它)。

這將從第 45 個結果開始為您提供大小為 15 的 json。 您可以使用那里的參數來更輕松地獲取數據。 例如,嘗試將大小更改為“1000”,看看會發生什么。 祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM