htmlunit抓取动态网页(webmagic渲染网页的爬取过程,你知道几个?)
优采云 发布时间: 2021-11-10 23:12htmlunit抓取动态网页(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 }
此时,一个渲染的网页就被爬下来了。超过