我正在寻找一种使用Python 3和Selenium进行网络抓取的方法。在某些感兴趣的页面上,有一些箭头指向下一页。 Here是一个示例网站。
可以看出,有一些左右箭头指向上一页/下一页。这是我正在谈论的屏幕截图:
我尝试在Chrome浏览器上使用Inspect
,但是找不到与箭头关联的元素,因此可以浏览其他页面。
我想知道与此操作相关的元素。
此外,除了使用Selenium之外,还有没有其他更简单的方式来刮取所有页面?
答案 0 :(得分:1)
您可以在CSS选择器中使用类名
driver.find_element_by_css_selector('.pager-pagenextb').click()
HTML:
您可能还希望预期条件等待可点击
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)
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")
要抓取,请使用BeautifulSoup
和requests
:
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)