爬虫学习日记(六)完成第一个爬虫任务

距离上一篇学习日记已经过去了两个星期,简单讲一下这两个星期都干了些什么吧。

任务回顾:

  1. 测试SUDU是否可以用selenium的方式来获取网页信息。
  2. 用selenium的方式实现SUDURoute的功能。
  3. 完成SITC Crawler。

因为capture SUDU 的爬虫出了问题,估计是频繁爬对面数据,被对面给block掉了,而Cindy就想让我试试用selenium+phantomJS的方式,看看行的通吗,之前用的是httpclient的方式。然后我就参照之前自己自学的方式,还有百度,用selenium获取了对面的首页,证明这种方式是可以的。所以我们Team决定改用selenium来实现SUDU,而且要我来写。刚开始我是一位不难的,但是真正写起来才发现真的很复杂,各种xpath获取element,而且有很多业务的知识,那些要记录,那些不用记录,有进行很多的判断,写了两天发现进度缓慢,而且Cindy也在催,感觉自己做不完了,就让东哥去做了。后面一个星期,被安排了另外一个task,也是要写一个crawler,用httpclient的方式,网站结构比SUDU简单很多,完成较快,已经初步写完,能实现功能,自己测试也没什么问题。

总结

  1. 用selenium来获取SUDU首页

因为只是获取首页,所以并没有什么难度。
首先在本地配置了一个driver。

//本地测试driver路径
    private static WebDriver getWebDriver() {
        ChromeOptions options = new ChromeOptions();
        Map contentSettings = new HashMap<>();
        contentSettings.put("images", 2);

        Map 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 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和ChromeDriver的路径,要注意版本号要对应。 配置好phantomjs的路径。

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方式可行 。

  1. 用selenium的方式实现SUDURoute的功能。

才发现自己之前写的没有保存,上传git被还原回去了。

就只能简单讲一下现在还记得的几个有印象的点。

首先因为是用的phantomjs,而且它设置成手机模式,在原先的crawler中,不能沿用他之前用的ChromeDriver的方式,因为两种打开方式,页面里面各种element的ID是有一些是不一样的。
如,当时我在debug的时候,发现按钮事件一直无效,回去页面里面看,发现按钮的ID已经变了。其实发现按钮ID变了这个也有点曲折,因为那时候我不知道浏览器已经被设置成了手机浏览的方式,所以我还是回去原先他的网站上看的,用的是pc端浏览器打开的页面里面的按钮的ID,但是就是一直跑不通,后来才想到应该去看我获取的html里面的,才发现按钮的ID换了的,把按钮的ID换回来就可以实现点击事件了。

实现点击事件后,他会执行一个判断,判断网页是否出现了某些元素,这里指的就是搜索结果,出现了搜索结果他就会停止等待。

停止等待以后,他会将获取的html用jsoup转换成document对象,就可以用DOM通过id或者其他东西来查找节点来转换成element,这里是找到routeList。

做到routeList都一直听顺利,后来要对routeList做解析的时候,就一直遇到问题。
首先我第一个问题是对业务的不理解,在代码里面有transhipment进行判断的,0或者1有不一样的解析方式,如果是0的话,是可以成功执行的,点开里面嵌套的内容都是可以获取到,但是在1的时候,就一直获取不到,就一直卡在这里。

对SUDU的开发就停留在这里了。

  1. 完成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。

                                                                        和狗子一起成为更好的人。
复制代码

你可能感兴趣的:(爬虫,python,测试)