距离上一篇学习日记已通过去了两个星期,简单讲一下这两个星期都干了些什么吧。html
由于capture SUDU 的爬虫出了问题,估计是频繁爬对面数据,被对面给block掉了,而Cindy就想让我试试用selenium+phantomJS的方式,看看行的通吗,以前用的是httpclient的方式。而后我就参照以前本身自学的方式,还有百度,用selenium获取了对面的首页,证实这种方式是能够的。因此咱们Team决定改用selenium来实现SUDU,并且要我来写。刚开始我是一位不难的,可是真正写起来才发现真的很复杂,各类xpath获取element,并且有不少业务的知识,那些要记录,那些不用记录,有进行不少的判断,写了两天发现进度缓慢,并且Cindy也在催,感受本身作不完了,就让东哥去作了。后面一个星期,被安排了另一个task,也是要写一个crawler,用httpclient的方式,网站结构比SUDU简单不少,完成较快,已经初步写完,能实现功能,本身测试也没什么问题。git
- 用selenium来获取SUDU首页
由于只是获取首页,因此并无什么难度。
首先在本地配置了一个driver。web
//本地测试driver路径
private static WebDriver getWebDriver() {
ChromeOptions options = new ChromeOptions();
Map<String, Object> contentSettings = new HashMap<>();
contentSettings.put("images", 2);
Map<String, Object> preferences = new HashMap<>();
preferences.put("profile.default_content_settings", contentSettings);
DesiredCapabilities caps = DesiredCapabilities.chrome();
caps.setCapability("chrome.prefs", preferences);
caps.setCapability(ChromeOptions.CAPABILITY, options);
// options.addArguments("headless");// headless mode
// options.addArguments("disable-gpu");
options.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\phantomjs-2.0.0-windows\\chromedriver.exe");
// ChromeDriver driver = new ChromeDriver(caps);
System.setProperty("phantomjs.binary.path", "D:\\phantomjs-2.0.0-windows\\bin\\phantomjs.exe");
ArrayList<String> args = new ArrayList<>();
args.add("--ignore-ssl-errors=true");
args.add("--ssl-protocol=any");
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, args);
PhantomJSDriver driver = new PhantomJSDriver(capabilities);
return driver;
}
复制代码
caps.setCapability(ChromeOptions.CAPABILITY, options);
复制代码
这一句配置是用模拟手机登陆,我以前也有点不明白为何要设置成这样,后来在别人的blog中发现这样子设置不容易被对面反爬虫。chrome
配置好Chrome和ChromeDriver的路径,要注意版本号要对应。 配置好phantomjs的路径。json
String url = "https://www.hamburgsud-line.com/linerportal/pages/hsdg/p2p.xhtml?lang=en";
driver.get(url);
String html = driver.getPageSource();
复制代码
调用driver的get方法,他就回去打开这个url,用getPageSource就能获取这个网页的源码,输出这个html,发现里面是有内容的,用selenium方式可行 。windows
- 用selenium的方式实现SUDURoute的功能。
才发现本身以前写的没有保存,上传git被还原回去了。浏览器
就只能简单讲一下如今还记得的几个有印象的点。bash
首先由于是用的phantomjs,并且它设置成手机模式,在原先的crawler中,不能沿用他以前用的ChromeDriver的方式,由于两种打开方式,页面里面各类element的ID是有一些是不同的。
如,当时我在debug的时候,发现按钮事件一直无效,回去页面里面看,发现按钮的ID已经变了。其实发现按钮ID变了这个也有点曲折,由于那时候我不知道浏览器已经被设置成了手机浏览的方式,因此我仍是回去原先他的网站上看的,用的是pc端浏览器打开的页面里面的按钮的ID,可是就是一直跑不通,后来才想到应该去看我获取的html里面的,才发现按钮的ID换了的,把按钮的ID换回来就能够实现点击事件了。less
实现点击事件后,他会执行一个判断,判断网页是否出现了某些元素,这里指的就是搜索结果,出现了搜索结果他就会中止等待。post
中止等待之后,他会将获取的html用jsoup转换成document对象,就能够用DOM经过id或者其余东西来查找节点来转换成element,这里是找到routeList。
作到routeList都一直听顺利,后来要对routeList作解析的时候,就一直遇到问题。
首先我第一个问题是对业务的不理解,在代码里面有transhipment进行判断的,0或者1有不同的解析方式,若是是0的话,是能够成功执行的,点开里面嵌套的内容都是能够获取到,可是在1的时候,就一直获取不到,就一直卡在这里。
对SUDU的开发就停留在这里了。
- 完成SITC Crawler。
先讲讲需求,获取route而后记录。
由于用的是httpclient,因此并不像以前用selenium同样担忧ID的问题。
经过这个爬虫的开发,也逐渐了解到用selenium和用httpclient的区别:
1.selenium其实就是模仿用户操做,来实现各类点击操做,而后获取执行后的页面,对页面进行解析获取,经过jsoup转成ducument,用DOM获取各个element中我想要的元素。
2.httpclient则是模拟放松post和get请求,无论执行什么操做,归根结底都是往requestURL发送请求去后台。经过httpclient就能够拼接发送请求的头部还有body,而后解析它返回来的response。
二者各有各的好处,selenium对于一些获取动态页面的比较适合,httpclient则比较适合获取静态页面的。
如今来说讲我作SITC的一些心得:
首先以为要作一个爬虫,就要先从了解他的各个请求开始。
以前我一直用的是selenium的思惟去作httpclient,想要说实现点击查找这个方法,而后获取整个页面,然而显示信息那里都是动态生成的,用httpclient是获取不到显示的信息的,返回回来的都是空的。
这里我用的是Chrome调试界面里面的network,发现当我点击查找的时候,会有一个请求发送到后台:
而这个请求返回来的是一个json:
这就是最主要的一个request了,我只要模拟这个POST请求,把我想搜索的参数设置进去,就能返回我所要的信息,而后对这些信息进行解析就好了。
成功获取到我想要的信息之后,剩下的就是解析。
由于返回来的是一个String,我要把它转成能操做的list,就必须先把String转成list。
个人作法是:
把string转成jsonobject
JSONObject Json = JSONObject.fromObject(response);
复制代码
在Json里面经过get到list:
JSONArray routeArray = (JSONArray) Json.get("list");
复制代码
这样就能对list进行操做了。
SITC大体的心得就是这样,第一次作考虑的状况还不是不少,估计后续会有一些bug。
和狗子一块儿成为更好的人。
复制代码