htmlunit抓取动态网页(webmagic渲染网页的爬取过程,你知道几个?)

优采云 发布时间: 2021-11-10 23:12

  htmlunit抓取动态网页(webmagic渲染网页的爬取过程,你知道几个?)

  最近突然了解到,我以后的工作有很多数据采集。朋友推荐了webmagic项目,于是就开始玩了。发现这个爬虫项目还是很有用的,爬取静态网站几乎不需要自己写任何代码(当然是小爬虫~~|)。好了,废话少说。以此文记录渲染网页的爬取过程。先找个js渲染网站。这里我们直接取学习文档中给出的网址。

  打开网页是这样的

  

  像这样查看源代码

  

  源代码这么小,不用说,必须渲染。我搜索了一条记录,果然,在源代码中没有找到任何结果。

  然后开始解析URL。我从浏览器开发人员工具中找到了这样的请求记录。

  

  只需开始查看数据量最大的请求,如上图红线所示。从xhr可以看出这是一个ajax请求的数据,打开请求的数据是这样的

  

  从网页中找到源代码中找不到的一条记录,在这个json数据中搜索。幸运的是,我找到了。

  

  不用说,就是这样!!接下来直接解析这个json就可以得到所有渲染出来的链接了。

  直接从网页上点击一个链接进入,发现链接是这样的:

  

  然后回到json文件,找到这个标题

  

  发现了惊人的东西!那是 id,后跟链接。大胆推测所有链接都是这种尿性!!(其实我还点了几个链接才敢确认这个尿性)

  然后就很简单了,写代码解析这个json数据,然后把所有的链接拼凑起来加入爬取队列进行爬取。

  原来通过首页链接点进来的下级链接还是js渲染的。. .

  没办法,拿着链接要求继续分析

  获取这样的请求数据:

  

  直接看xhr列,就是ajax请求的数据

  

  还是从大到小看json数据,匹配页面内容,直到找到第三个。++|

  然后得到了最终数据的请求链接:

  然后就可以写代码了:

   1 public class SpiderTest implements PageProcessor {

2 // 抓取网站的相关配置,包括编码、抓取间隔、重试次数等

3 private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

4 // 先从浏览器中分析出隐藏请求可得出以下匹配规则

5 private static final String URLRULE = "http://angularjs\\.cn/api/article/latest.*";

6 private static String firstUrl = "http://angularjs.cn/api/article/";

7

8 @Override

9 public Site getSite() {

10 // TODO Auto-generated method stub

11 return site;

12 }

13

14 @Override

15 public void process(Page page) {

16 // TODO Auto-generated method stub

17 /**

18 * 筛选出所有符合条件的url,手动添加到爬取队列。

19 */

20 if (page.getUrl().regex(URLRULE).match()) {

21 //通过jsonpath得到json数据中的id内容,之后再拼凑待爬取链接

22 List endUrls = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());

23 if (CollectionUtils.isNotEmpty(endUrls)) {

24 for (String endUrl : endUrls) {

25 page.addTargetRequest(firstUrl + endUrl);

26 }

27 }

28 } else {

29 //通过jsonpath从爬取到的json数据中提取出id和content内容

30 page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));

31 page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));

32 }

33

34 }

35

36 @Test

37 public void test(){

38 Spider.create(new SpiderTest()).addUrl("http://angularjs.cn/api/article/latest?s=20").run();

39 }

40 }

  此时,一个渲染的网页就被爬下来了。超过

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线