您的位置:首页 > 其它

WebMagic学习-对Page类的一个疑问

2016-10-10 00:00 120 查看
us.codecraft.webmagic.Page类中有个字段:

private Selectable url;

很多地方都是用过page.getUrl();可是大家注意到url的类型没有?Selectable是个选择器。

其实我的理解page.getUrl();返回的时当前正在处理的页面的url,也就是这个url必然只有一个。

但是url其实是个List。那就来看一下:

PageProcessor.process(Page)方法中的page对象到底是怎么来的:

eclipse用户:选中这个方法 -> ctrl+shift+g快捷键 -> 会弹出一个Search窗口:

双击这个方法,就是这个方法调用了PageProcessor.process(Page)方法(也就是这个方法把page对象传过来的)双击进去后看到:

protected void processRequest(Request request) {
Page page = downloader.download(request, this); //这里,page对象是download下来的
if (page == null) {
sleep(site.getRetrySleepTime());
onError(request);
return;
}
// for cycle retry
if (page.isNeedCycleRetry()) {
extractAndAddRequests(page, true);
sleep(site.getRetrySleepTime());
return;
}
pageProcessor.process(page);
....

看HttpClientDownloader.download(Request, Task)方法中:

Page page = handleResponse(request, charset, httpResponse, task);

找到了page对象是handleResponse()方法返回值

最后看到方法中:

page.setUrl(new PlainText(request.getUrl()));

request.getUrl()返回值是String,那PlainText的构造方法是:

public PlainText(String text) {
this.sourceTexts = new ArrayList<String>();
sourceTexts.add(text);
}

也就是,把这个String类型的url放到了一个List中。而PlainText instanceof Selectable,所以返回最开始的问题,Page类中的url的类型是Selectable。

在最开始我说了:【其实我的理解page.getUrl();返回的时当前正在处理的页面的url,也就是这个url必然只有一个。】

就在我上一段写完的时候,发现不对:表示当前正在处理的页面的url是:Page类中有个字段:

private Request request;

Request类中有个字段:

private String url; //page中的request中的url才是当前处理的url地址。虽然现在还没有搞懂Page.url到底是啥


看page对象中的request到底是怎么来的:us.codecraft.webmagic.downloader.HttpClientDownloader.handleResponse(Request, String, HttpResponse, Task)方法中:

page.setRequest(request);//这个request是scheduler.poll(this);返回值,也就是当前在处理的request

所以证实了Page.request.url就是当前处理页面的url
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WebMagic
相关文章推荐