通过selenium抓取新浪微博

2023-07-19 14:21:27 浏览数 (2)

由于新浪微博的手机网页的访问加入了验证码,所以抓取新浪微博的后门行不通了,经过一系列的研究,最终使用selenium工具模仿浏览器行为访问新浪微博公众号,因为浏览器访问网页时是以访客的形式访问 ,所以避免了用户登录这一过程,可以顺利的进行指定微博的内容抓取,selenium的缺点是无法确定页面加载完毕的时间也js执行完毕的时间,所以在抓取效率方面会有所牺牲。

首先我们先来了解一下selenium这个工具。selenium是一个模拟浏览器,进行自动化测试的工具,它提供一组API可以与真实的浏览器内核交互。Selenium是跨语言的,有Java、C#、python等版本,并且支持多种浏览器,chrome、firefox以及IE都支持。在Java项目中使用Selenium,需要做两件事。首先下载seleunim所需要的jar包,导入至工程中,然后下载使用的浏览器对应的驱动,本文中使用的是谷歌浏览器,对应的驱动是一个exe文件,推荐放在谷歌浏览的安装目录下,在代码中配置路径即可,本文以Java开发环境为例,抓取新浪微博指定微博的内容,直接上代码。

//等待数据加载的时间 //为了防止服务器封锁,这里的时间要模拟人的行为,随机且不能太短 long waitLoadBaseTime = 10000; int waitLoadRandomTime = 3000; Random random = new Random(System.currentTimeMillis()); // 设置 chrome 的路径 System.setProperty( "webdriver.chrome.driver", "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"); // 创建一个 ChromeDriver 的接口,用于连接 Chrome @SuppressWarnings("deprecation") ChromeDriverService service = new ChromeDriverService.Builder() .usingDriverExecutable( new File( "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")) .usingAnyFreePort().build(); service.start(); // 创建一个 Chrome 的浏览器实例 WebDriver driver = new RemoteWebDriver(service.getUrl(), DesiredCapabilities.chrome()); // 让浏览器访问微博主页 driver.get("http://weibo.com/338303018"); //等待页面动态加载完毕 Thread.sleep(waitLoadBaseTime random.nextInt(waitLoadRandomTime)); //选择每条微博的整体子模块 List<WebElement> elements = driver.findElements(By.cssSelector("div[action-type=feed_list_item]")); //选择每条微博的文本内容模块 List<WebElement> elements2 = driver.findElements(By.cssSelector("div[node-type=feed_list_reason],div[node-type=feed_list_content]")); System.out.println(elements.size()); for (int i = 0; i < elements.size(); i ) { //展开评论 elements.get(i).findElement(By.cssSelector("a[action-type=fl_comment]")).click();; Thread.sleep(1000); } //评论列表 List<WebElement> elements3 = driver.findElements(By.cssSelector("div[node-type=feed_list_commentList]")); System.out.println(elements3.size()); int a = 0; for (int i =0;i<elements2.size()&&a<elements3.size();i ) { //抓取内容 String content = elements2.get(i).getText(); if (!content.contains("转发微博")) { System.out.println("content:" content); //抓取评论 if (elements3.get(a).getText().isEmpty()) { System.out.println("comment:no comment"); }else{ System.out.println("comment:" elements3.get(a).getText()); } a ; } } driver.quit(); // 关闭 ChromeDriver 接口 service.stop();

相关jar包与驱动资源下载:http://download.csdn.net/detail/u013407099/9521615

0 人点赞