第1部份關于爬蟲的配置,包括編碼、抓取間隔、超時時間、重試次數等,也包括1些摹擬的參數,例如User Agent、cookie,和代理的設置,我們會在第5章-“爬蟲的配置”里進行介紹。在這里我們先簡單設置1下:重試次數為3次,抓取間隔為1秒。
第2部份是爬蟲的核心部份:對下載到的Html頁面,你如何從中抽取到你想要的信息?WebMagic里主要使用了3種抽取技術:XPath、正則表達式和CSS選擇器。另外,對JSON格式的內容,可以使用JsonPath進行解析。
XPath
XPath本來是用于XML中獲得元素的1種查詢語言,但是用于Html也是比較方便的。例如:
page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()")
這段代碼使用了XPath,它的意思是“查找所有class屬性為'entry-title public'的h1元素,并找到他的strong子節點的a子節點,并提取a節點的文本信息”。對應的Html是這模樣的:
CSS選擇器
CSS選擇器是與XPath類似的語言。如果大家做過前端開發,肯定知道$('h1.entry-title')這類寫法的含義。客觀的說,它比XPath寫起來要簡單1些,但是如果寫復雜1點的抽取規則,就相對要麻煩1點。
正則表達式
正則表達式則是1種通用的文本抽取語言。
page.addTargetRequests(page.getHtml().links().regex("(https://github.com/w+/w+)").all());
這段代碼就用到了正則表達式,它表示匹配所有"https://github.com/code4craft/webmagic"這樣的鏈接。
JsonPath
JsonPath是于XPath很類似的1個語言,它用于從Json中快速定位1條內容。WebMagic中使用的JsonPath格式可以參考這里:https://code.google.com/p/json-path/
有了處理頁面的邏輯,我們的爬蟲就接近完工了!
但是現在還有1個問題:1個站點的頁面是很多的,1開始我們不可能全部羅列出來,因而如何發現后續的鏈接,是1個爬蟲不可缺少的1部份。
page.addTargetRequests(page.getHtml().links().regex("(https://github.com/w+/w+)").all());
這段代碼的分為兩部份,page.getHtml().links().regex("(https://github.com/w+/w+)").all()
用于獲得所有滿足"(https:/ /github.com/w+/w+)"這個正則表達式的鏈接,page.addTargetRequests()
則將這些鏈接加入到待抓取的隊列中去。