我正在使用Python和Selenium抓取此网站。但目前它只刮取7月份的前10页,将下一个按钮的上一个同级的页码转换为int,然后单击下一个number_of_pages-1,但是在到达第10页后将停止。
URL-https://planning.adur-worthing.gov.uk/online-applications/search.do?action=monthlyList
有人可以帮我刮掉所有页面吗?
def pagination( driver ):
data = []
last_element = driver.find_element_by_xpath('//a[ contains( concat( " ", normalize-space( @class ), " "), " next ") ]/preceding-sibling::a[1]')
if last_element is None:
number_of_pages = 1
else:
number_of_pages = int( last_element.text )
# data = [ getData( driver ) ]
data.extend(getData(driver))
for i in range(number_of_pages - 1):
driver.find_element_by_xpath('//a[ contains( concat( " ", normalize-space( @class ), " "), " next ") ]').click()
data.extend( getData( driver ) )
time.sleep(1)
return data
答案 0 :(得分:1)
number_of_pages的值为10。
找到另一种方法来找出有多少页。
您可以使用while循环来检查“下一页”按钮是否可用,如果可用,请继续前进,否则-这是最后一页。
像这样:
while next_button_element.is_displayed():
// Do the action that is currently in the for loop
答案 1 :(得分:1)
您可以使用的代码:
while True:
data.extend(getData(driver))
try:
driver.find_element_by_css_selector('a.next').click()
except:
break
答案 2 :(得分:0)
您好,我了解您采用了从您的answer中计算您上一个问题的总页数的想法。在上一种情况下,由于我们可以直接使用最后一个页码,因此它可以工作,但是这里不是这种情况。
解决方案:
虽然页数不是直接可用的,但是条目总数为-
现在,如上图所示,对于7月的情况,此数字为174。假设将分页长度(单页中的条目数)设置为默认值10,则页数应为18 (17页,每页10个条目,另外一页则剩余4个条目)。
因此,计算页数的逻辑应该很简单。如果您以某种方式在total_entries
变量中获得了总条目数,则页面数应该是(取自this:
number_of_pages = (total_entries/10) + 1
Python默认情况下按除法运算符返回下界整数,因此174/10
将返回17
,而加+1
将返回18
。这样就可以了-页数为18。
现在,提取条目总数。您可以使用下面的定位器找到保存该元素的<span>
元素。
driver.find_element_by_xpath('//span[@class='showing']')
但是此元素包含这样的文本-Showing 1-10 of 174
。您只需要整个字符串中的174
部分。为此,首先提取“ of”之后的字符串,然后将其转换为int。
从文本中提取条目总数作为int的算法:
showing_text = driver.find_element_by_xpath("//span[@class='showing']").text #Showing 1-10 of 174
number_of_entries_text = showing_text.split("of",1)[1] # 174 as text
number_of_entries = int( re.findall(r'\d+',number_of_entries_text)[0]) #174 as int
number_of_pages = (number_of_entries/10) + 1 #18
最终代码:
def pagination( driver ):
data = []
last_element = driver.find_element_by_xpath("//span[@class='showing']")
if last_element is None:
number_of_pages = 1
else:
showing_text = driver.find_element_by_xpath("//span[@class='showing']").text number_of_entries_text = showing_text.split("of",1)[1]
number_of_entries = int( re.findall(r'\d+',number_of_entries_text)[0])
number_of_pages = (number_of_entries/10) +1
for i in range(number_of_pages - 1):
driver.find_element_by_xpath('//a[ contains( concat( " ", normalize-space( @class ), " "), " next ") ]').click()
time.sleep(1)
注意:
我认为我的解决方案更好,因为您不必反复检查任何元素是否可用或捕获任何异常。您只需直接获得页面数,然后单击多次next按钮。