使用Selenium进行Python网络抓取:点击下一页

时间:2019-03-05 15:07:14

标签: python-3.x selenium web-scraping

我正在寻找一种使用Python 3和Selenium进行网络抓取的方法。在某些感兴趣的页面上,有一些箭头指向下一页。 Here是一个示例网站。

可以看出,有一些左右箭头指向上一页/下一页。这是我正在谈论的屏幕截图:

enter image description here

我尝试在Chrome浏览器上使用Inspect,但是找不到与箭头关联的元素,因此可以浏览其他页面。

我想知道与此操作相关的元素。

此外,除了使用Selenium之外,还有没有其他更简单的方式来刮取所有页面?

4 个答案:

答案 0 :(得分:1)

您可以在CSS选择器中使用类名

driver.find_element_by_css_selector('.pager-pagenextb').click()

HTML:

enter image description here

您可能还希望预期条件等待可点击

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".pager-pagenextb"))).click()

其他导入等待

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

答案 1 :(得分:0)

这是右(下一个)箭头的x路径。 Right next arrow

elephant

您现在可以使用

&

如果它不起作用,您可以尝试实施driverWait

//[@id="ctl07_ctl07_ctl00_MembersList_members_ctl01_ctl20_filterTopPager_lbNext"]

答案 2 :(得分:0)

您可以使用class属性单击该元素以获取下一页。让我知道是否可行。

element=WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH ,"//a[@class='next_page']")))
element.click()

如果WebDriver单击不起作用,则尝试JS执行器单击该元素。

element=WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH ,"//a[@class='next_page']")))      
driver.execute_script("arguments[0].click();", element)

您需要导入以下内容。

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

答案 3 :(得分:0)

要单击下一页按钮,可以使用css类:

driver.find_element_by_class_name("next_page")

要抓取,请使用BeautifulSouprequests

import requests
from bs4 import BeautifulSoup

headers = {
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'DNT': '1',
}

params = (
    ('id', '20412'),
    ('groupby', 'Election Year'),
    ('sortdir', 'descending'),
)

response = requests.post('https://www.nae.edu/default.aspx', headers=headers, params=params)
page = BeautifulSoup(response.text, "html.parser")

__VIEWSTATE = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
__VIEWSTATEGENERATOR = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
__EVENTVALIDATION = page.find(attrs={"id": "__EVENTVALIDATION"}).attrs["value"]
last_page = int(page.select_one(".pager-pageddl option:last-child").text)

for i in range(0, last_page - 1):
    if i > 0:
        __VIEWSTATE = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
        __VIEWSTATEGENERATOR = page.find(attrs={"id": "__VIEWSTATE"}).attrs["value"]
        __EVENTVALIDATION = page.find(attrs={"id": "__EVENTVALIDATION"}).attrs["value"]

        data = {
            '__EVENTTARGET': 'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl21$filterTopPager$lbNext',
            '__VIEWSTATE': __VIEWSTATE,
            '__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
            '__EVENTVALIDATION': __EVENTVALIDATION,
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl20$filterTopPager$ddlPageIndex': str(i),
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl20$filterTopPager$ddlPageSize': '20',
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl21$filterBottomPager$ddlPageIndex': str(i),
            'ctl07$ctl07$ctl00$MembersList$members$ctl01$ctl21$filterBottomPager$ddlPageSize': '20'
        }

        response = requests.post('https://www.nae.edu/default.aspx', headers=headers, params=params, data=data)
        page = BeautifulSoup(response.text, "html.parser")

    names = page.select(".flexible-list-item .initialState .name")
    for name in names:
        print(name.text)