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