簡體   English   中英

在python中通過selenium的分頁導航

[英]navigating through pagination with selenium in python

我正在使用Python和Selenium來抓取這個網站。 我有代碼工作,但它目前只刮擦第一頁,我想迭代所有頁面並刮掉所有頁面,但他們以奇怪的方式處理分頁我將如何通過頁面並逐個刮擦它們?

分頁HTML:

<div class="pagination">
    <a href="/PlanningGIS/LLPG/WeeklyList/41826123,1" title="Go to first page">First</a>
    <a href="/PlanningGIS/LLPG/WeeklyList/41826123,1" title="Go to previous page">Prev</a>
    <a href="/PlanningGIS/LLPG/WeeklyList/41826123,1" title="Go to page 1">1</a>
    <span class="current">2</span>
    <a href="/PlanningGIS/LLPG/WeeklyList/41826123,3" title="Go to page 3">3</a>
    <a href="/PlanningGIS/LLPG/WeeklyList/41826123,4" title="Go to page 4">4</a>
    <a href="/PlanningGIS/LLPG/WeeklyList/41826123,3" title="Go to next page">Next</a>
    <a href="/PlanningGIS/LLPG/WeeklyList/41826123,4" title="Go to last page">Last</a>
</div>

刮刀:

import re
import json
import requests
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options

options = Options()
# options.add_argument('--headless')
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, 
executable_path=r'/Users/weaabduljamac/Downloads/chromedriver')

url = 'https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList'
driver.get(url)

def getData():
  data = []
  rows = driver.find_element_by_xpath('//*[@id="form1"]/table/tbody').find_elements_by_tag_name('tr')
 for row in rows:
    app_number = row.find_elements_by_tag_name('td')[1].text
    address =  row.find_elements_by_tag_name('td')[2].text
    proposals =  row.find_elements_by_tag_name('td')[3].text
    status =  row.find_elements_by_tag_name('td')[4].text
    data.append({"CaseRef": app_number, "address": address, "proposals": proposals, "status": status})
print(data)
return data


def main():
 all_data = []
 select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
 list_options = select.options

 for item in range(len(list_options)):
    select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
    select.select_by_index(str(item))
    driver.find_element_by_css_selector("input.formbutton#csbtnSearch").click()
    all_data.extend( getData() )
    driver.find_element_by_xpath('//*[@id="form1"]/div[3]/a[4]').click()
    driver.get(url)

 with open( 'wiltshire.json', 'w+' ) as f:
    json.dump( all_data, f )
 driver.quit()


if __name__ == "__main__":
    main()

在繼續自動化任何方案之前,請始終記下執行方案時要執行的手動步驟。 您想要的手動步驟(我從問題中理解)是 -

1)轉到網站 - https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList

2)選擇第一周選項

3)單擊搜索

4)從每個頁面獲取數據

5)再次加載URL

6)選擇第二周選項

7)單擊搜索

8)從每個頁面獲取數據

.. 等等。

你有一個循環選擇不同的周,但在每周循環迭代周期選項中,你還需要包含一個循環迭代所有頁面。 由於您沒有這樣做,您的代碼只返回第一頁的數據。

另一個問題是如何找到“下一步”按鈕 -

driver.find_element_by_xpath('//*[@id="form1"]/div[3]/a[4]').click()

您正在選擇第四個<a>元素,這個元素當然不健壯,因為在不同的頁面中,“下一步”按鈕的索引會有所不同。 相反,使用這個更好的定位器 -

driver.find_element_by_xpath("//a[contains(text(),'Next')]").click()

用於創建將遍歷頁面的循環的邏輯 -

首先,您需要頁數。 我通過在“下一步”按鈕之前找到<a>做到這一點。 根據下面的截圖,很明顯這個元素的文本將等於頁面數 -

截圖 -

我使用以下代碼做到了 -

number_of_pages = int(driver.find_element_by_xpath("//a[contains(text(),'Next')]/preceding-sibling::a[1]").text)

現在,一旦你有多個頁面作為number_of_pages ,你只需要點擊“下一步”按鈕number_of_pages - 1次!

main功能的最終代碼 -

def main():
 all_data = []
 select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
 list_options = select.options

 for item in range(len(list_options)):
    select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
    select.select_by_index(str(item))
    driver.find_element_by_css_selector("input.formbutton#csbtnSearch").click()
    number_of_pages = int(driver.find_element_by_xpath("//a[contains(text(),'Next')]/preceding-sibling::a[1]").text)
    for j in range(number_of_pages - 1):
      all_data.extend(getData())
      driver.find_element_by_xpath("//a[contains(text(),'Next')]").click()
      time.sleep(1)
    driver.get(url)

 with open( 'wiltshire.json', 'w+' ) as f:
    json.dump( all_data, f )
 driver.quit()

首先使用分頁獲取分頁中的總頁數

ins.get('https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList/10702380,1')
ins.find_element_by_class_name("pagination")
source = BeautifulSoup(ins.page_source)
div = source.find_all('div', {'class':'pagination'})
all_as = div[0].find_all('a')
total = 0

for i in range(len(all_as)):
    if 'Next' in all_as[i].text:
        total = all_as[i-1].text
        break

現在只需循環遍歷范圍

for i in range(total):
 ins.get('https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList/10702380,{}'.format(count))

繼續遞增計數並獲取頁面的源代碼,然后獲取它的數據。 注意:點擊一頁到另一頁時,不要忘記睡眠

以下方法對我來說很簡單。

driver.find_element_by_link_text("3").click()
driver.find_element_by_link_text("4").click()
....
driver.find_element_by_link_text("Next").click()    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM