当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢?
如类似今日头条这样的网站:http://toutiao.com/
我们可以使用Selenium来搞定这件事情。Selenium的设计目的虽然是用于Web应用程序的自动化测试,但是却非常适合用来做数据抓取,可以非常简单地绕过网站的反爬虫限制,因为Selenium直接运行在浏览器中,就像真正的用户在操作一样。
使用Selenium,我们不但可以抓取Js动态生成数据的网页,而且可以抓取以滚动页面方式分页的网页。
首先,我们使用maven引入Selenium依赖:
- <dependency>
- <groupId>org.seleniumhq.selenium</groupId>
- <artifactId>selenium-java</artifactId>
- <version>2.47.1</version>
- </dependency>
接下来就可以写代码抓取了:
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.firefox.FirefoxDriver;
- import java.util.List;
- import java.util.Random;
- /**
- * 如何抓取Js动态生成数据且以滚动页面方式分页的网页
- * 以抓取今日头条为例说明:http://toutiao.com/
- * Created by ysc on 10/13/15.
- */
- public class Toutiao {
- public static void main(String[] args) throws Exception{
- //等待数据加载的时间
- //为了防止服务器封锁,这里的时间要模拟人的行为,随机且不能太短
- long waitLoadBaseTime = 3000;
- int waitLoadRandomTime = 3000;
- Random random = new Random(System.currentTimeMillis());
- //火狐浏览器
- WebDriver driver = new FirefoxDriver();
- //要抓取的网页
- driver.get("http://toutiao.com/");
- //等待页面动态加载完毕
- Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime));
- //要加载多少页数据
- int pages=5;
- for(int i=0; i<pages; i++) {
- //滚动加载下一页
- driver.findElement(By.className("loadmore")).click();
- //等待页面动态加载完毕
- Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime));
- }
- //输出内容
- //找到标题元素
- List<WebElement> elements = driver.findElements(By.className("title"));
- int j=1;
- for(int i=0;i<elements.size();i++) {
- try {
- WebElement element = elements.get(i).findElement(By.tagName("a"));
- //输出标题
- System.out.println((j++) + "、" + element.getText() + " " + element.getAttribute("href"));
- }catch (Exception e){
- System.out.println("ignore "+elements.get(i).getText()+" because "+e.getMessage());
- }
- }
- //关闭浏览器
- driver.close();
- }
- }
代码也可以从我的开源项目HtmlExtractor中获取。
这里我们共抓取了6页,每页20条新闻,共120条新闻,代码运行结果。
本文转自:http://my.oschina.net/apdplat/blog/516848
相关推荐
java抓取网页数据实现
主要介绍了Java爬虫Jsoup+httpclient获取动态生成的数据的相关资料,需要的朋友可以参考下
主要介绍了Python3实现抓取javascript动态生成的html网页功能,结合实例形式分析了Python3使用selenium库针对javascript动态生成的HTML网页元素进行抓取的相关操作技巧,需要的朋友可以参考下
这个程序利用java抓取网页内容,然后生成生成静态页面
asp.net数据采集 生成静态页面Demo asp.net数据采集 asp.net生成静态页面 asp.net
抓取动态网页的数据,然后将其导入数据库文件中
Java抓取https网页数据,解决peer not authenticated异常。导入eclipse就能运行,带有所用的jar包(commons-httpclient-3.1.jar,commons-logging.jar,httpclient-4.2.5.jar,httpcore-4.2.4.jar)
java网页抓取数据
c# 网页抓取分析 表格图形生成 数据挖掘
Python的网页数据抓取,表格的制作,CSS文件的生成,字体的改变
抓取淘宝页面数据
spliter 数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取数据抓取
动态抓取网页内容,生成word文件,包含具体demo和所需jar包
htmlparser实现从网页上抓取数据
抓取AMF协议的flex页面,支持模拟登录和页面抓取。
Java网页抓取数据
一个demo实现简单的比分抓取功能,用户需要根据自己要抓取的网站设置,就可以抓取网页数据!
这个demo是用c#语音开发的运用正则抓取网页数据,可以用来学习、借鉴。
主要介绍了Python实现抓取HTML网页并以PDF文件形式保存的方法,结合实例形式分析了PyPDF2模块的安装及Python抓取HTML页面并基于PyPDF2模块生成pdf文件的相关操作技巧,需要的朋友可以参考下