gpt4 book ai didi

python-3.x - 如何单击 "Next"按钮直到它不再存在 - Python、Selenium、Requests

转载 作者:行者123 更新时间:2023-12-04 00:00:23 26 4
gpt4 key购买 nike

我正在从分页的网页中抓取数据,抓取完一页后,我需要单击下一步按钮并继续抓取下一页。然后,一旦我抓取了所有页面并且下一个按钮不再存在,我就需要停止。下面包含我需要单击的“下一步”按钮周围的 html。

<tr align="center"> 
<td colspan="8" bgcolor="#FFFFFF">
<br>
<span class="paging">
<b> -- Page 1 of 3 -- </b>
</span>
<p>
<span class="paging">
<a href="page=100155&amp;by=state&amp;state=AL&amp;pagenum=2"> .
<b>Next -&gt;</b>
</a>
&nbsp;&nbsp;
</span>
<span class="paging">
<a href=" page=100155&amp;by=state&amp;state=AL&amp;pagenum=3">Last -&gt;&gt;</a>
</span>
</p>
</td>
</tr>

我尝试过选择类和链接文本,但在我目前的尝试中两者都不适合我。

我的代码的 2 个示例:

while True:
try:
link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next ->"))).click()
except TimeoutException:
break

while True:
try:
link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "paging"))).click()
except TimeoutException:
break

我在网上找到的所有解决方案都没有奏效,主要以以下错误结束:

ElementClickInterceptedException: Message: element click 
intercepted: Element <a href="?
page=100155&amp;by=state&amp;state=AL&amp;pagenum=2">...</a> is not
clickable at point (119, 840). Other element would receive the
click: <body class="custom-background hfeed" style="position:
relative; min-height: 100%; top: 0px;">...</body>
(Session info: chrome=76.0.3809.132)

如果错误代码的其余部分有助于审查,请告诉我,我会用这个错误更新帖子。

我查看了以下资源,但都无济于事:

Python Selenium clicking next button until the end

python - How to click "next" in Selenium until it's no longer available?

Python Selenium Click Next Button

Python Selenium clicking next button until the end

Selenium clicking next button programmatically until the last page

How can I make Selenium click on the "Next" button until it is no longer possible?

任何人都可以提供有关如何选择“下一步”按钮(如果存在)并使用这组 HTML 转到下一页的建议吗?如果您需要对请求进行任何进一步说明,请告诉我。

最佳答案

我们可以通过使用两个主要库的解决方案来解决这个问题 - selenium 和 requests

方法 - 每次都抓取页码和下一页链接的页面

使用 Selenium(如果网站是动态的)

我们可以检查我们所在的页面是否是最后一页,如果不是最后一页,我们可以检查下一个按钮(假设网站在所有页面中都遵循相同的html结构进行分页)

stop = False
driver.get(url)
while not stop:
paging_elements = driver.find_elements_by_class_name("paging")
page_numbers = paging_elements[0].text.strip(" -- ").split("of")

## Getting the current page number and the final page number

final = int(page_numbers[1].strip())
current = int(page_numbers[0].split("Page")[-1].strip())

if current==final:
stop=True
else:
next_page_link = paging_elements[-2].find_element_by_name("a").get_attribute('href')
driver.get(next_page_link)
time.sleep(5) # This gap can be changed as per the load time of the page

使用 Requests 和 BS4(如果网站是静态的)

import requests

r = requests.get(url)
stop = False
while not stop:
soup = BeautifulSoup(r.text, 'html.parser')

paging_elements = soup.find_all('span', attrs={'class': "paging"})
page_numbers = paging_elements[0].text.strip(" -- ").split("of")

## Getting the current page number and the final page number

final = int(page_numbers[1].strip())
current = int(page_numbers[0].split("Page")[-1].strip())

if current==final:
stop=True
else:
next_page_link = paging_elements[-2].find("a").get('href')
r = request.get(next_page_link)

替代方法

一种方法是使用网站本身的 URL 而不是按钮单击过程,因为在这种情况下按钮单击会被拦截。

大多数网页都在其 URL 中添加了 page 属性(对于 >=2 的页面可见)。因此,分页网站可能具有如下 URL:

www.targetwebsite.com/category?page_num=1

www.targetwebsite.com/category?page_num=2

www.targetwebsite.com/category?page_num=3

等等。

在这种情况下,可以简单地迭代页码直到最终页码(如最初在建议的答案中所示)。这种方法消除了目标网站更改 CSS 布局/样式的破坏可能性。

此外,可能需要通过附加基本 URL 来创建 next_page_link,就像在另一个问题(第 40-41 行)中为 next_url 所做的那样:

next_url = next_link.find("a").get("href")

r = session.get("https://reverb.com/marketplace" + next_url)

希望对您有所帮助!

关于python-3.x - 如何单击 "Next"按钮直到它不再存在 - Python、Selenium、Requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57876752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com