python抓取网页数据(如何快速的采集到异步加载页面的异步代码?)
优采云 发布时间: 2022-01-24 22:03python抓取网页数据(如何快速的采集到异步加载页面的异步代码?)
在采集网页中,我们经常会遇到采集一些异步加载页面的网页,而我们平时使用的httpwebrequest类并不是采集。这时候我们一般都是用webbrowser来辅助采集,但是.net自带的webbrowser用起来很不爽。获取页面是否加载比较麻烦。DocumentCompleted事件被iframe反复触发,获取到的源码通常不会异步加载。在源代码之后,我们经常需要添加一个定时器来不断的检查来获取我们想要的源代码。当然,我们可以使用一些第三方的webkit内核浏览器,但是判断页面是否真的加载比较费力,而且体积也不小。
今天我将介绍 CasperJS。CasperJS 是一个开源的导航脚本处理和测试工具,基于 PhantomJS 和 slimerjs(前端自动化测试工具)编写。CasperJS 简化了完整导航场景的流程定义,为常见任务提供了有用的高级函数、方法和语法。CasperJS 本身非常强大。有两个内置引擎,PhantomJS 和 slimerjs,默认使用 PhantomJS。具体详细功能可以参考这些官方网站了解更多,或者加入QQ群389709524进行讨论。今天的重点是如何快速 采集 到异步加载的网页。
如果我们要采集dudu对这个文章的评论,这个文章看源码是找不到这两条评论的,通过httpwebrequest也拿不到。这时候我们用 casperjs 让它变得非常简单。
caperjs代码定义如下:
1 var fs = require('fs');
2 var casper = require('casper').create({
3 pageSettings: {
4 loadImages: false,
5 loadPlugins: false
6 },
7 logLevel: "debug",//日志等级
8 verbose: true, // 记录日志到控制台
9 });
10
11 var url = casper.cli.raw.get('url');
12
13 //请求页面
14 casper.start(url, function () {
15 fs.write("temp.html", this.getHTML(), 'w');
16 });
17
18 casper.run();
结果如下:
这样,几行简单的代码就可以得到异步加载的html代码。是不是非常简单快速!
当然,这在实际生产环境中是不够的。我们必须考虑各种 网站 场景和各种网络状况,例如网络超时。如果一个网页一分钟不能加载,我们就认为是超时了,否则我们一直在等待,我们要过滤掉与我们的采集无关的请求,对比谷歌统计,百度统计,广告等。这通常会减慢网页的加载速度。此外,我们通常还会使用 CSS 样式和页面的图片。不需要,可以忽略。总而言之,我们的代码是这样扩展的。
1 var fs = require('fs');
2
3 var casper = require('casper').create({
4 pageSettings: {
5 loadImages: true,
6 loadPlugins: false,
7 userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'
8 },
9 logLevel: "debug",//日志等级
10 verbose: true, // 记录日志到控制台
11 timeout: 60000,//60秒超时,退出
12 });
13
14
15 var url = casper.cli.raw.get('url');
16
17 //排除不相关的请求,加快页面加载进度
18 casper.on('resource.requested', function(requestData, request) {
19 if (requestData.url.indexOf('google-analytics.com') > 0) {
20 request.abort();
21 }
22 if (requestData.url.indexOf('googlesyndication.com') > 0) {
23 request.abort();
24 }
25 if (requestData.url.indexOf('hm.baidu.com') > 0) {
26 request.abort();
27 }
28 if (requestData.url.indexOf('baidustatic.com') > 0) {
29 request.abort();
30 }
31 if (requestData.url.indexOf('share.baidu.com') > 0) {
32 request.abort();
33 }
34 if (requestData.url.indexOf('cbjs.baidu.com') > 0) {
35 request.abort();
36 }
37 if (requestData.url.indexOf('jiathis.com') > 0) {
38 request.abort();
39 }
40 if (requestData.url.indexOf('.cnzz.com') > 0) {
41 request.abort();
42 }
43 if (requestData.url.indexOf('.51.la') > 0) {
44 request.abort();
45 }
46 if (requestData.url.indexOf('.tanx.com') > 0) {
47 request.abort();
48 }
49 //this.echo("==============>page.resource.requested"+requestData.url);
50 });
51
52 //超时执行的函数,记录到日志文件
53 casper.on('timeout', function () {
54 //this.echo("===>timeout"+url);
55 var fileName = this.evaluate(getFileName);
56 var nowTime = this.evaluate(CurentTime);
57 fs.write("log/timeout_" + fileName + ".txt", nowTime + "====>" + url + "\r\n", 'a');
58 });
59
60 //请求页面
61 casper.start(url, function () {
62 var status = this.status().currentHTTPStatus;
63 //this.capture('tt.png');
64 fs.write("temp.html", this.getHTML(), 'w');
65 });
66
67
68 function getFileName() {
69 var now = new Date();
70
71 var year = now.getFullYear(); //年
72 var month = now.getMonth() + 1; //月
73 var day = now.getDate(); //日
74
75 return (year + "" + month + "" + day);
76 }
77
78 function CurentTime() {
79 var now = new Date();
80
81 var year = now.getFullYear(); //年
82 var month = now.getMonth() + 1; //月
83 var day = now.getDate(); //日
84
85 var hh = now.getHours(); //时
86 var mm = now.getMinutes(); //分
87
88 var clock = year + "-";
89
90 if (month < 10)
91 clock += "0";
92
93 clock += month + "-";
94
95 if (day < 10)
96 clock += "0";
97
98 clock += day + " ";
99
100 if (hh < 10)
101 clock += "0";
102
103 clock += hh + ":";
104 if (mm < 10) clock += '0';
105 clock += mm;
106 return (clock);
107 }
108
109 casper.run();
查看代码
CasperJs的安装可以参考官方网站文档,或者关注下方微信公众号,提供本文所有工具和源码下载。今天写这个文章的另一个目的是,我在使用CasperJs的时候,遇到页面出现乱码,一时找不到解决办法。欢迎知道的大侠帮忙!场景如下:
比如采集这个网页,这个网站code是gb2312采集,遇到曹睿的“睿”,就会出现乱码。网站是utf-8编码的,采集的时候是ok的,但是我们是采集的程序,不可能要求别人改编码,所以我没有还没想到解决办法,想知道的同学,给点指点,多谢了!
文章来源:
在线工具: