Webmagic(爬蟲(chóng))抓取新浪博客案例
優(yōu)采云 發(fā)布時(shí)間: 2020-05-19 08:00Webmagic框架更側重實(shí)際的內容抓取。今天為你們分享Webmagic 爬蟲(chóng)框架抓取新浪博客的案例。
我們以作者的新浪博客 作為反例。在這個(gè)事例里,我們要從最終的博客文章頁(yè)面,抓取博客的標題、內容、日期等信息,也要從列表頁(yè)抓取博客的鏈接等信息,從而獲取這個(gè)博客的所有文章。
列表頁(yè)的格式是““, 其中“0_1”中的“1”是可變的頁(yè)數。
文章頁(yè)的格式是“”,其中“95b4e3010102xsua”是可變的字符。
通過(guò)前面的剖析新浪博客超級爬蟲(chóng)(網(wǎng)站推廣工具) v14綠色版,我先要找到文章的 url,再愈發(fā) url 獲取文章。所以怎么發(fā)覺(jué)這個(gè)博客中所有的文章地址,是爬蟲(chóng)的第一步。
我們可以使用正則表達式 +//.html 對 URL 進(jìn)行一次簡(jiǎn)略過(guò)濾。這里比較復雜的是,這個(gè) URL 過(guò)于空泛,可能會(huì )抓取到其他博客的信息,所以我們必須從列表頁(yè)中指定的區域獲取 URL。
在這里,我們使用 xpath//div[@class=//”articleList//”]選中所有區域,再使用 links()或者 xpath//a/@href 獲取所有鏈接,最后再使用正則表達式 +//.html,對 URL 進(jìn)行過(guò)濾,去掉一些“編輯”或者“更多”之類(lèi)的鏈接。于是,我們可以這樣寫(xiě):
page.addTargetRequests(
page.getHtml().xpath("//div[@class=/"articleList/"]"
).links().regex("http://blog//.sina//.com//.cn/s/blog_//w+//.html").all());
同時(shí),我們須要把所有找到的列表頁(yè)也加到待下載的 URL 中去:
page.addTargetRequests(
page.getHtml().links().regex(
"http://blog//.sina//.com//.cn/s/articlelist_1487828712_0_//d+//.html").all());
文章頁(yè)面信息的抽取是比較簡(jiǎn)單的,寫(xiě)好對應的 xpath 抽取表達式就可以了。
page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2"));
page.putField("content", page.getHtml().xpath(
"//div[@id='articlebody']//div[@class='articalContent']"));
page.putField("date",page.getHtml().xpath(
"//div[@id='articlebody']//span[@class='time SG_txtc']").regex("//((.*)//)"));
現在,我們早已定義了對列表和目標頁(yè)進(jìn)行處理的方法,現在我們須要在處理時(shí)對她們進(jìn)行分辨。在這個(gè)反例中,區分方法很簡(jiǎn)單,因為列表頁(yè)和目標頁(yè)在 URL 格式上是不同的,所以直接用 URL 區分就可以了!
這個(gè)反例完整的代碼如下:
package us.codecraft.webmagic.samples;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
public class SinaBlogProcessor implements PageProcessor {
public static final String URL_LIST = "http://blog//.sina//.com//.cn/s/articlelist_1487828712_0_//d+//.html";
public static final String URL_POST = "http://blog//.sina//.com//.cn/s/blog_//w+//.html";
private Site site = Site.me().setDomain("blog.sina.com.cn").setSleepTime(3000).setUserAgent(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
@Override public void process(Page page) {
//列表頁(yè)
if (page.getUrl().regex(URL_LIST).match()) {
page.addTargetRequests(page.getHtml().xpath("//div[@class=/"articleList/"]").links().regex(URL_POST).all());
page.addTargetRequests(page.getHtml().links().regex(URL_LIST).all());
//文章頁(yè)} else {
page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2"));
page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']"));
page.putField("date",page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("//((.*)//)"));}}
@Override public Site getSite() {
return site;}
public static void main(String[] args) {
Spider.create(new SinaBlogProcessor()).addUrl("http://blog.sina.com.cn/s/articlelist_1487828712_0_1.html").run();
} }
通過(guò)這個(gè)反例我們可以發(fā)覺(jué)主要使用幾個(gè)方式:
如果你認為用 if-else 來(lái)分辨不同處理有些不方便新浪博客超級爬蟲(chóng)(網(wǎng)站推廣工具) v14綠色版,那么可以使用 SubPageProcessor 來(lái)解決這個(gè)問(wèn)題。