爬取首都之窗信件列表保存到TXT(下)
按照上一篇的操作,我們便可以得到之前列表頁整個一頁的操作了,當我們想要實現下一頁操作的時候我們發現網頁的地址並沒有發生變化,也就是說下一頁的按鈕只是調動了js方法,從服務器端獲取了數據,然后再重新對頁面進行了刷新。打開檢查,查看network可以看到傳輸的數據:
從而驗證了我的想法,但是如何獲取這些數據呢?最后選擇了selenium庫來實現瀏覽器自動化。首先添加依賴:

<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency>
注意點:這里選擇的瀏覽器的火狐,所以我們需要從github上面下載火狐瀏覽器的驅動:geckodriver,地址:https://github.com/mozilla/geckodriver/releases這里我們就下載最新版就可以了,注意自己的操作系統和位數,另外安裝的火狐瀏覽器版本不要過高,否則驅動器可能在打開之后無法輸入網址進行跳轉。
private void AddNewPage(Page page){ //定義gecko driver的獲取地址 String driverPath="E:/geckodriver/geckodriver.exe"; System.setProperty("webdriver.gecko.driver",driverPath); //如果火狐瀏覽器沒有默認安裝在C盤,需要自己確定其路徑 System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe"); //創建一個叫driver的對象,啟動火狐瀏覽器 WebDriver driver=new FirefoxDriver(); driver.get("http://www.beijing.gov.cn/hudong/hdjl/com.web.search.mailList.flow"); /** Selenium 執行JS*/ String js = "beforeTurning("+Utils.Page+")"; ((FirefoxDriver) driver).executeScript(js); String PageSourse=null; try { //線程暫停一段時間,防止網速過慢超時連接失敗 Thread.sleep(1000); System.out.println("Page數值為:"+Utils.Page); Utils.Page++; PageSourse=driver.getPageSource(); } catch (InterruptedException e) { e.printStackTrace(); } if(PageSourse!=null){ try { AddUrl(driver,page); }catch (Exception e){ System.out.println("Error!!"); }finally { driver.close(); } } } private void AddUrl(WebDriver driver,Page page){ List<WebElement> listType=driver.findElements(By.cssSelector("div#mailul a")); System.out.println("元素的個數為:"+listType.size()); for (WebElement e:listType ) { AddTargetRequest(e,page); } } private void AddTargetRequest(WebElement e,Page page){ String onClick=e.getAttribute("onclick"); String[] list=onClick.replace("letterdetail('","").replace("')","").split("','"); if(list[0].equals("建議")){ String NewUrl="http://www.beijing.gov.cn/hudong/hdjl/com.web.suggest.suggesDetail.flow?originalId="+list[1]; page.addTargetRequest(NewUrl); }else if(list[0].equals("咨詢")){ String NewUrl="http://www.beijing.gov.cn/hudong/hdjl/com.web.consult.consultDetail.flow?originalId="+list[1]; page.addTargetRequest(NewUrl); }else if(list[0].equals("投訴")){ String NewUrl="http://www.beijing.gov.cn/hudong/hdjl/com.web.complain.complainDetail.flow?originalId="+list[1]; page.addTargetRequest(NewUrl); } }
因為selenium驅動的是真正的瀏覽器,所以並不需要添加header。這樣就獲取了下一頁的信件中的網址,然后再依據前文對網址詳情頁的信件信息進行爬取即可。