Scrapy爬虫是用Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
Scrapy 使用了 Twisted'twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。它能我们更好的完成爬虫任务,自己写Python爬虫程序好比孤军奋战,而使用了Scrapy就好比手底下有了千军万马
• Scrapy Engine(Scrapy核心) 负责数据流在各个组件之间的流。
• Spiders(爬虫)发出Requests请求,经由Scrapy Engine(Scrapy核心) 交给Scheduler(调度器),Downloader(下载器)Scheduler(调度器) 获得Requests请求,然后根据Requests请求,从网络下载数据。
• Downloader(下载器)的Responses响应再传递给Spiders进行分析。根据需求提取出Items,交给Item Pipeline进行下载。Spiders和Item Pipeline是需要用户根据响应的需求进行编写的。
• 除此之外,还有两个中间件,Downloaders Mddlewares和Spider Middlewares,这两个中间件为用户提供方面,通过插入自定义代码扩展Scrapy的功能,例如去重等。
在正式开始爬虫编写之前,有几种小技巧,可以方便我们操纵和调试爬虫。
一、建立main.py文件,直接在Pycharm下进行调试
很多时候我们在使用Scrapy爬虫框架的时候,如果想运行Scrapy爬虫项目的话,一般都会想着去命令行中直接执行命令“scrapy crawl crawler_name”,其中crawler_name指的是爬虫的名字,在一开始创建Scrapy爬虫模板的时候就指定了的,而且在该爬虫项目中具有唯一性。但是每次跑到命令行下去执行,看交互的结果,有时候并不是很清晰,所以这里介绍一种方法,可以帮助大家提高开发效率,尤其是调试的时候更是显得方便。
在与爬虫项目的scrapy.cfg文件同级目录下建立一个main.py文件,用于控制整个爬虫项目的执行。
在该文件夹中写入的代码见下图。其中execute函数是内嵌在scrapy中的,调用这个函数可以直接调用该Scrapy工程项目的爬虫脚本,这个函数的执行需要在爬虫项目的父目录下进行。而第7行代码的意思就是获取当前py文件的父目录,省去我们直接复制路径的精力和时间,同时也方便我们将该项目放到其他的平台上去运行,不会报路径的错误。execute函数里边的参数其实就是将Scrapy爬虫执行命令拆分,然后分别以一个字符的方式放到了一个数组中。
之后我们直接运行这个main.py文件便可以调用Scrapy爬虫程序了。
二、设置网站robots.txt规则为False
一般的,我们在运用Scrapy框架抓取数据之前,需要提前到settings.py文件中,将“ROBOTSTXT_OBEY = True”改为ROBOTSTXT_OBEY = False。
在未改动之后settings.py文件中默认爬虫是遵守网站的robots.txt规则的,如下图所示。
如果遵守robots.txt规则的话,那么爬取的结果会自动过滤掉很多我们想要的目标信息,因此有必要将该参数设置为False,如下图所示。
设置好robots.txt规则之后,我们便可以抓到更多网页的信息。
关于Scrapy爬虫项目运行和调试的部分小技巧有很多,希望小伙伴们可以多多利用起来,让其为自己的项目服务,可以事半功倍。同时Scrapy爬虫需要配合亿牛云高质量的爬虫代理IP 才能更加长期稳定采集相关数据。
performance && performance.mark && performance.mark("start-js-render");
var MaxErrorReportLimit = 100;
// 简单的将错误采集上报到 /api/logs/error
window.onerror = function(message, source, lineno, colno, error) {
// 同一个页面最多上报100次错误,防止某个循环错误页面一直打开,不断的报错
if (MaxErrorReportLimit-- < 0) return;
try {
var msg = {
message: message,
source: source,
lineno: lineno,
colno: colno,
stack: error && error.stack,
traceId: window.appData && window.appData.traceId,
href: window.location.href,
};
msg = JSON.stringify(msg);
// 用于 macaca E2E 自动化测试
window.__macaca_latest_error = msg;
var req = new XMLHttpRequest();
req.open('post', '/api/logs/error', true);
req.setRequestHeader('Content-Type', 'application/json');
req.send(msg);
// yuyanMonitor 记录错误堆栈
if (window.yuyanMonitor) {
yuyanMonitor.logError(error, {
code: 1,
msg: message,
});
}
} catch (err) {
console.log('report error', err);
}
};
// 监听 window.onload 是否执行,用于组件中执行 onload 后续事件
window.addEventListener('load', function() {
try {
// 移动端开启
var isMobile = navigator.userAgent.toLowerCase().match(/iphone|ipad|android|micromessenger/i);
if (isMobile) {
var rootNode = document.querySelector('#ReactApp');
if (rootNode && !rootNode.innerHTML) {
// ready 3s 后节点内容为空,展示友好报错
setTimeout(function() {
// 插入节点前再次检查是否白屏
if (!rootNode.innerHTML) {
var html = '<div>';
html += '<h3 style="margin-top: 45%;text-align: center;">页面打不开?快来找开发 GG 帮忙</h3>';
if (window.appData && window.appData.traceId) {
html += '<p style="padding: 10px 30px;">反馈信息: ' + window.appData.traceId + '</p>';
}
html += '<p style="padding: 10px 30px;">截图或复制反馈信息到: <a target="_blank" href="https://www.yuque.com/yuque/topics/new">https://www.yuque.com/yuque/topics</a></p>'
html += '</div>';
rootNode.innerHTML = html;
}
}, 3000);
}
}
} catch (e) {
console.log(e);
}
}, false);
if ('serviceWorker' in navigator) {
if (!/[?&]enable_sw=false/.test(location.search) && window.appData && window.appData.settings.enable_serviceworker) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/serviceworker.js');
});
} else {
navigator.serviceWorker.getRegistrations().then(function(registrations) {
registrations.forEach(sw => sw.unregister());
});
}
}
window.routerBase = '/';
window.resourceBaseUrl = 'https://gw.alipayobjects.com/os/chair-script/skylark/';
window.__webpack_public_path__ = '/os/chair-script/skylark/';
1 / 5
!function(t,e,a,r,c){t.TracertCmdCache=t.TracertCmdCache||[],t[c]=window[c]||
{_isRenderInit:!0,call:function(){t.TracertCmdCache.push(arguments)},
start:function(t){this.call('start',t)}},t[c].l=new Date;
var n=e.createElement(a),s=e.getElementsByTagName(a)[0];
n.async=!0,n.src=r,s.parentNode.insertBefore(n,s)}
(window,document,'script','https://ur.alipay.com/tracert_a385.js','Tracert');
Tracert.start({
spmAPos: 'a385',
spmBPos: 'b4693',
role_id: '1313142',
mdata: {
group_id: appData.group.id,
book_id: appData.book.id,
doc_id: appData.doc.id,
},
});
站长统计
window.yuyanMonitor = new YuyanMonitor({
_appId: '589c123e2b89c03d127000da',
env: '外网',
userId: 'laical',
});
有疑问加站长微信联系(非本文作者)