目標網站為http://www.ccgp-hubei.gov.cn,經檢查HTML代碼發現這個網頁有一個iframe,iframe裡面的內容才是網站的真正有用的內容,所以第一步是要先找到真正的URL。
以http://www.ccgp-hubei.gov.cn/fnoticeAction!listFNotice.action為例,這個網址的主要結構是一個分頁的列表,有上頁、下頁等等。查看這兩個按鈕的HTML Element可以看到這是一個js的函數:
一開始的時候我一直在想,既然這是js函數,那我就用ScrapyJS + Splash的組合來解決,但是經過實驗發現出現了一個問題。就是在Splash指令碼中,可以修改document.title = "hello"之類的東西,但是調用了js函數轉到另一個連結之後,返回的仍然是最開始時候的HTML代碼,無論是用splash:html()還是document.body.innetHTML都不行。不知道到底是沒有運行js函數成功,還是Splash本身的問題,在網上尋找了一下,發現遇到這種問題的人很多,但是沒有一個可行的方案,最後GitHub上某大神告訴我Splash在開發splash:mouse_click()函數,讓我靜靜等待。
無奈之下,我換了種思路,開啟F12,點擊“下頁”按鈕,看看瀏覽器倒底做了什麼,如圖所示:
這就量瀏覽器POST的資料,這下嘗試一下直接向伺服器發送這些資料:
# -*- coding: utf-8 -*-from scrapy.spiders import Spiderfrom scrapy.http import FormRequestfrom scrapy.shell import inspect_responseclass ThirdSpider(Spider): name = 'ThirdSpider' download_delay = 0 start_urls = [ 'http://www.ccgp-hubei.gov.cn/fnoticeAction!listFNotice.action' ] def parse(self, response): formdata = {"queryInfo.BEGINTIME1": "", "queryInfo.BEGINTIME2": "", "queryInfo.CGFS": "", "queryInfo.CGLX": "", "queryInfo.ENDTIME1": "", "queryInfo.ENDTIME2": "", "queryInfo.FBRMC": "", "queryInfo.GGLX": "", "queryInfo.QYBM": "", "queryInfo.TITLE": "", "queryInfo.curPage": "2", "queryInfo.pageSize": "15", "rank": ""} yield FormRequest.from_response(response, formdata=formdata, callback=self.parse_item) def parse_item(self, response): inspect_response(response, self)
結果如下所示,可以看到頁碼果然已經轉到了第二頁,至此問題結束。