在python中使用硒导航

时间:2018-08-23 14:06:26

标签: python selenium selenium-webdriver

我正在使用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

3 个答案:

答案 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中计算您上一个问题的总页数的想法。在上一种情况下,由于我们可以直接使用最后一个页码,因此它可以工作,但是这里不是这种情况。

解决方案:

虽然页数不是直接可用的,但是条目总数为-

Image displaying the total number of entries

现在,如上图所示,对于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按钮。