-
用Nodejs做爬虫
2016-05-07 13:03:13欢迎访文我的博客YangChen’s Blog引言提起爬虫,最容易想到的就是python,因为python给人的感觉就是啥都能干,但是之前用python做爬虫的过程还是很不爽的,主要问题来自这么几个方面:第一个是对爬来的网页dom操作...欢迎访文我的博客YangChen’s Blog
引言
提起爬虫,最容易想到的就是python,因为python给人的感觉就是啥都能干,但是之前用python做爬虫的过程还是很不爽的,主要问题来自这么几个方面:第一个是对爬来的网页dom操作上,第二个就是编码的处理,第三就是多线程,所以用python做爬虫其实并不是很爽,有没有更爽的方式呢?当然有那就是node.js!
Nodejs做爬虫的优劣
首先说一下node做爬虫的优势
第一个就是他的驱动语言是JavaScript。JavaScript在nodejs诞生之前是运行在浏览器上的脚本语言,其优势就是对网页上的dom元素进行操作,在网页操作上这是别的语言无法比拟的。
第二就是nodejs是单线程异步的。听起来很奇怪,单线程怎么能够异步呢?想一下学操作系统的时候,单核cpu为什么能够进行多任务处理?道理也是类似,在操作系统中进程对CPU的占有进行时间切片,每一个进程占有的时间很短,但是所有进程循环很多次,因此看起就像是多个任务在同时处理。js也是一样,js里有事件池,CPU会在事件池循环处理已经响应的事件,未处理完的事件不会放到事件池里,因此不会阻塞后续的操作。在爬虫上这样的优势就是在并发爬取页面上,一个页面未返回不会阻塞后面的页面继续加载,要做到这个不用像python那样需要多线程。
其次是node的劣势
首先是异步并发上。处理的好很方便,处理的不好就会很麻烦。例如要爬取10个页面,用node不做异步处理话,那返回的结果可不一定是按1、2、3、4……这个顺序,很可能是随机。解决的办法就是增加一个页面的序列戳,让爬取的数据生成csv文件,然后重新排序。
第二个是数据处理上的劣势,这点是不如python的,如果只是单纯的爬数据,用node当然很好,但是如果用爬来的数据继续做统计分析,做个回归分析聚类啥的话,那就不能用node一步到底了。
如何用nodejs做爬虫
下面就要说一下如何用nodejs做爬虫了
1、初始化项目文件
在对应的项目文件夹下执行
npm init
来初始化一个package.json文件2、安装request和cheerio依赖包
request听起来很熟悉吧,跟python里request功能一样。它的功能就是建立起对目标网页的链接,并返回相应的数据,这个不难理解。
cheerio的功能是用来操作dom元素的,他可以把request返回来的数据转换成可供dom操作的数据,更重要的cheerio的api跟jquery一样,用$来选取对应的dom结点,是不很方便?对一个前端程序员来说,这比python的什么xpath和beautisoup方便了不知道多少啊哈哈
安装命令也很简单,分别是
npm install request --save
和npm install cheerio
3、引入依赖包并使用
接下来就用request和cherrio写一个爬虫吧!
首先引入依赖
var request = require("request"); var cheerio = require("cheerio");
接下来就以爬取我们学校的新闻页为例吧,我们学校的新闻页面链接是http://news.shu.edu.cn/Default.aspx?tabid=446
然后调用request的接口
request('http://news.shu.edu.cn/Default.aspx?tabid=446',function(err,result){ if(err){ console.log(err); } console.log(result.body); })
运行一下结果就是这样的
是不是很激动哈哈,html返回回来了。这样还是不够的,接下就是要处理下返回的数据,并提炼出我们想要获得的信息,这就轮到cheerio登场了
将request返回的结果传入cheerio中,并获得想要获取的信息,看代码是不是想在写脚本的感觉?
request('http://news.shu.edu.cn/Default.aspx?tabid=446',function(err,result){ if(err){ console.log(err); } var $ = cheerio.load(result.body); $('a[id^="dnn"]').each(function(index,element){ console.log($(element).text()); }) })
运行下结果如下:
这样一个简单的爬虫就完成啦,是不是很简单啊,当然这远远是不够的。
4、设置请求头
众所周知,http协议里,建立连接要发送请求头header,对于一些动态网页的爬取有时候需要设置user agent、cookies等等,那么这些设置如何使用呢?
具体事例代码如下:var options = { url: startUrl+'?page=1', method: 'GET', charset: "utf-8", headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36", "cookie": cookies } }; request(options,function(err,response,body){ //... })
5并发控制
爬取一个页面还好,要是页面多了就是无限制并发了,那肯定就要被封了,所以就要有一个并发控制,这里要介绍的就是async。跟上述一样要通过
npm install async --save
来安装并通过var async = require("async")
来引入。具体以一个限制并发的方式来示例一下
async.mapLimit(5,function(url,callback)){ //... fetch(url,callback) })
这里面的5就是限制的并发数量,可以自由发挥,最后千万不要忘了执行完后callback,因为如果没有的话就会阻塞了,async并不知道他限制的函数是否执行完毕,因此不会释放掉。
总结
至此呢,Nodejs爬虫的核心就已经介绍完毕了,剩下就完全可以自由发挥了,最后附上一个自己做的简单的新浪微博的爬虫吧https://github.com/Fazich/nodeSpider
-
pycharm + python 做爬虫
2017-12-26 21:37:04pycharm做爬虫python3.5+bs4爬虫模块安装步骤: 首先,你要先进入pycharm的Project Interpreter界面,进入方法是:setting(ctrl+alt+s) ->Project Interpreter,Project Interpreter在具体的Project下。点击“+”...pycharm + python 做爬虫
python3.5+bs4爬虫模块
安装步骤:
首先,你要先进入pycharm的Project Interpreter界面,进入方法是:setting(ctrl+alt+s) ->Project Interpreter,Project Interpreter在具体的Project下。点击“+”,输入beautifulsoup ,就可以找到你要安装的插件了。
Python3的选择bs4进行安装,Python2的选择beautifulSoup。
爬虫代码
from bs4 import BeautifulSoup
withopen(‘D:\\PycharmProjects\\web_parse\\the_blah.html’,’r’) as wb_data: //这里打开本地文件需要双斜杠
Soup = BeautifulSoup(wb_data,’lxml’)
images = Soup.select(‘body > div.main-content > ul > li > img’)
引用块内容
print(Soup)python版本3.5 报错结果:bs4.FeatureNotFound: Couldn’t find a tree builder with the features you requested: lxml. Do you need to install a parser library?
解决办法:安装lxml重新安装lxml和bs4仍然报错。
补充:
已解决问题,缺少libxslt。
brew install libxsltweb_parse.py
from bs4 import BeautifulSoup
with open(‘D:\PycharmProjects\code_of_video1_2\web\new_index.html’,’r’) as wb_data:
Soup = BeautifulSoup(wb_data,’lxml’)
images = Soup.select(‘body > div.main-content > ul > li > img’)
titles = Soup.select(‘body > div.main-content > ul > li > div.article-info > h3 > a’)
descs = Soup.select(‘body > div.main-content > ul > li > div.article-info > p.description’)
cates = Soup.select(‘body > div.main-content > ul > li > div.article-info > p.meta-info’)
rates = Soup.select(‘body > div.main-content > ul > li > div.rate > span’)
#print(images,titles,descs,cates,rates,sep=’\n————\n’)
#print(cates)
info=[]#定义info list;
for title,image,desc,rate,cate in zip(titles,images,descs,rates,cates):
data = {
‘title’:title.get_text(),
‘rate’ :rate.get_text(),
‘desc’ :desc.get_text(),
‘cate’ :list(cate.stripped_strings),#列表化
‘image’:image.get(‘src’)
}
info.append(data)
”’提取评分大于 3,输出‘title’和‘cate”’
for i in info:
if float(i[‘rate’])>3:
print(i[‘title’],i[‘cate’])
”’body > div.main - content > ul > li: nth - child(1) > img/html/body/div[2]/ul/li[1]/img
/html/body/div[2]/ul/li[1]/div[1]/h3/a
body > div.main-content > ul > li:nth-child(1) > div.article-info > h3 > a
print(Soup)”’提取评分大于 3,输出‘title’和‘cate
输出Sardinia’s top 10 beaches [‘fun’, ‘Wow’]
How to get tanned [‘butt’, ‘NSFW’]
How to be an Aussie beach bum [‘sea’] -
网络爬虫入门:网络爬虫的目的,企业获取数据的方式,可以用于做爬虫的程序语言,爬虫爬取数据的步骤
2020-02-09 15:54:53目录 爬取数据的目的: 1.获取大量数据,用于做数据分析 ...可以用于做爬虫的程序语言 1.Python 2.PHP 3.JAVA 4.C/C++ 爬虫分类 1.通用网络爬虫(搜索引擎使用,遵守robots协议) 2.聚焦网...目录
爬取数据的目的:
1.获取大量数据,用于做数据分析
当公司想要开发一个新的项目,肯定需要做市场调研,这就需要大量的数据,可以从同类型项目历年来的数据爬取下来,把数据经过处理后得到可观的图表,从而预测项目开发后可能获得的收益。
2.公司项目的测试数据,公司业务所需数据
当公司开发了一个新项目或新模块,在没有测试数据的情况下,就会要求爬虫工程师去各大网站上爬取热点数据。比如开发了一个新闻网站,爬虫工程师就会去各大成熟的新闻网站上爬取实时的热点新闻,经过数据加工处理后发布到自己的新闻网站。然后再由测试工程师测试网站的网络负载量、流量、CPU负载等信息。
企业获取数据的方式
1.公司自有数据
顾名思义,就是公司以往的数据,可能是纸质的,这时候需要将纸质数据录入到计算机中。也可能是公司数据库中的,只是没有经过加工处理。
2.第三方数据平台购买(数据堂,贵阳大数据交易所)
如果想要买到如房产,金融,医疗,消费,工业等数据,可以去一些比较正规的售卖数据的公司去购买。如数据堂和贵阳大数据交易所,当然,根据你想要数据的珍稀程度,价格也相对来说不菲。总而言之,在第三方平台购买数据是非常昂贵的。
3.爬虫爬取数据
当然,我们也可以通过爬虫工具来爬取数据,这样的方式相对来说较为廉价,也更加灵活,缺点也比较明显,首先是数据的来源和有效性不能保证,二是涉及某些违法的操作是不允许的,三是能否爬取到有价值的数据绝大程度上取决于该爬虫工程师的技术水平。公司里会设置这样的爬虫工程师岗位,专门来做数据的爬取,如果一个爬虫工程师一年的工资是20W,那么当公司去购买第三方数据的价格小于20W时,公司多半就不会设置爬虫工程师的岗位,当然,这也取决于公司的财力与规模,较成熟的公司一般都会设有爬虫工程师的岗位。
可以用于做爬虫的程序语言
1.Python
请求模块,解析模块丰富成熟,拥有Scrapy网络爬虫框架
2.PHP
对多线程、异步支持不太好
3.JAVA
代码笨重,代码量大
4.C/C++
效率高,但是开发速度慢
爬虫分类
1.通用网络爬虫(搜索引擎使用,遵守robots协议)
国内像百度,360,搜狐等公司,就是利用的爬虫来爬取页面,实际上我们几乎天天都在使用百度的搜索功能,那么实质上也是在使用网络爬虫来爬取数据,而这里的数据其实是我们想查看的某个网站的相关信息,或者某一类型网站的相关信息。
robots协议:
robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。
如淘宝网站的robots.txt:https://www.taobao.com/robots.txt
robots协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。
2.聚焦网络爬虫
聚焦网络爬虫就是自己写的爬虫程序,不需要遵守robots协议,你可以根据自己的想法来编写爬虫程序。
爬虫爬取数据的步骤
1.确定需要爬取的URL地址
爬取数据的前提是获取URL地址,URL是统一资源定位符,它规定了某个页面(文件)存放在何处。只有获取了这个网页文件后,才可以对后续的数据进行爬取。
2.由请求模块向URL地址发出请求,并获得响应
委托相关语言的请求模块,模拟人的操作去发送请求。
3.从响应类容中获取数据
获得完数据后,保存到本地。得到的数据就是如图 下所示的。
4.数据分析和二次爬取
经过了前三步后,此时我们已经有整个网页的数据文件了,只不过数据的格式可能是不友好的。这时候就需要爬虫工程师对数据进行处理,按照编排的格式收集数据。在这个过程中,一个网页下面可能有其他的URL地址,如果需要进一步跟进(爬取),那么又会重复第二步到第四步去处理,如何循环(这个又叫做递归爬虫)。
-
不再使用php做爬虫
2016-03-12 08:00:51技术小白的反思在做爬虫之前自己纠结了些许,用什么做爬虫,当然听说过python在爬虫方面的璀璨事迹,但是又怕技术学的乱七八糟,目前就不打算学了,又加之最近学习php,就打算使用php,但是随之问题出现了。...技术小白的反思
在做爬虫之前自己纠结了些许,用什么做爬虫,当然听说过python在爬虫方面的璀璨事迹,但是又怕技术学的乱七八糟,目前就不打算学了,又加之最近学习php,就打算使用php,但是随之问题出现了。。。单线程(当然php还是世界上最好的语言,我怕打,别喷我),所以还是使用java吧!
-
java做爬虫解决521错误
2018-12-10 12:31:38最近做爬虫时碰到了521错误,500开头的都是服务器错误,521错误有很大可能是请求头参数不对,比如下面这个 这是错误的 这是正确的 就是这一堆东西可能有哪些少了或是错误,而在爬虫中遇到这个错误,又极大... -
python写爬虫的优势-用Python做爬虫有哪些优势 该怎么学好Python
2020-10-29 22:30:52用Python做爬虫有哪些优势?该怎么学好Python?除了人工智能和数据分析,Python最广为人知的应用当属爬虫。所谓爬虫,是指按照一定的规则,自动地抓取万维网信息的程序或者脚本。接下来千锋小编程就给大家来讲解一下... -
为什么要用python做爬虫
2018-12-10 16:40:27可以做爬虫的语言很多, 如php, java, c/c++, python等等… php 虽然是世界上最好的语言,但是他天生不是干这个的,而且对多线程, 异步高并发的支持并不是很好,爬虫是工具性程序,对速度和效率要求比较高 java ... -
java 使用ChromeDriver做爬虫如何动态代理?
2017-11-08 08:14:19java使用ChromeDriver做爬虫时需要做代理,而好多网上的例子都用了 browser = new ChromeDriver(cap);这个方法,但这个方法每次都会启动一个新的浏览器,每次我都要重新登录,有没有好的办法动态设置代理呢? 伙计们... -
手把手教你做爬虫---基于NodeJs
2016-03-07 16:56:54手把手教你做爬虫,基于NodeJs,适合新手操作 -
【小白篇】scrapy做爬虫抓数据,小白入门专用
2020-04-03 11:35:26【小白篇】从零学习scrapy做爬虫抓数据 -
用Python做爬虫时,提取Excel数据
2019-07-15 17:35:36最近做爬虫时,需要根据excel里的数据进行爬取,在此记录一下excel里的数据如何导入,代码如下: import xlrd data = xlrd.open_workbook(r'此处为excel文件.xlsx') #默认当前路径 # 获取所有的sheet sheet_name =... -
Julia也能做爬虫?可以,但没必要
2019-03-11 09:23:58Julia也能做爬虫?可以,但没必要 https://mp.weixin.qq.com/s/_o0ktXNy4tNeRsM652vUTQ -
-
在做爬虫时cookie问题,地址重定向获取不到cookie
2018-08-15 12:30:31如图,我在做爬虫得时候前面登陆验证可以正常访问,但是访问第四个地址的时候正常应该给我返回cookie 我才能用返回得cookie去访问第五次地址。 图片是我fiddler抓包信息 第五次访问的时候不是在第四次response里获... -
爬虫系列——做爬虫必备:各大网站蜘蛛UA
2019-08-10 09:30:28了解各大搜索引擎蜘蛛爬虫的UA,对我们进行某些程序编写十分有用,例如网页判断客户端来源时,UA是常用的标准之一。本文收集了各大搜索引擎的蜘蛛爬虫UA,以便需要时查阅。 1.百度蜘蛛Baiduspide... -
爬虫项目(二)用phantomjs做爬虫
2017-02-11 00:10:14这几天有事没怎么研究,最开始用的java爬虫想爬取携程,结果失败告终。 主要表现在: 1.抓取不到对应的标签,jsoup语法对应的element个数是0,推测是因为直接用get方法获取机票信息时,该网站不显示和价格信息有关... -
Selenimu做爬虫
2012-10-31 22:49:45http://www.cnblogs.com/oscarxie/archive/2009/12/25/1631981.html ... 前面有介绍过Selenium作为开源的自动化测试框架,其实Selenium还可以作为爬虫工具。 举个例子,我想爬取中国概念股的一些 -
【Python爬虫3】在下载的本地缓存做爬虫
2017-02-17 13:06:121为链接爬虫添加缓存支持 2磁盘缓存 1用磁盘缓存的实现 2缓存测试 3节省磁盘空间 4清理过期数据 5用磁盘缓存的缺点 3数据库缓存 1NoSQL是什么 2安装MongoDB 3MongoDB概述 4MongoDB缓存实现 5压缩存储 6... -
使用SpringBoot + selenium-java 做爬虫
2019-05-09 16:20:52题记 最近发现了springboot本身就集成了selenium-java ,就拿来研究了一下,分布式爬虫是很大的一个架构,也比较复杂,没做研究,还是对爬虫的客户端实现有点兴趣,就想着用java做一个小爬虫客户端,其实selenium是... -
Python爬虫教程很多,为何做爬虫的那么少?爬虫学了没用吗?
2019-09-20 15:03:57每个人的时间是有限的,你的编程学得好,但是你唱歌跳舞也很好,总不可能白天当爱豆和蔡徐坤一起参加活动,晚上回公司做项目吧?肯定只能选一个作为你主要的工作,另一个就只能成为业余爱好。 爬虫绝不是表面的 ... -
使用scrapy做爬虫遇到的一些坑:网站常用的反爬虫策略,如何机智的躲过反爬虫Crawled (403)
2018-06-13 15:21:18在这幅图中我们可以很清晰地看到爬虫与反爬虫是如何进行斗智斗勇的。在学习使用爬虫时,我们制作出来的爬虫往往是在“裸奔”,非常的简单。简单低级的爬虫有一个很大的优点:速度快,伪装度低。如果你爬取的网站没有... -
做爬虫,JS 逆向了解一下
2019-10-23 17:45:21爬虫是大数据时代不可或缺的数据获取手段,它是综合技术的应用体现。有取就有失,有攻就有防。开发者为了保护数据,不得已想出了很多办法来限制爬虫对数据的获取。WEB 网站的构成... -
c# 做爬虫求大牛指点
2020-08-12 16:05:51[img=... 想用c# 做爬虫大致分为以下模块(以csdn为例): 1.通过Url 获取页面各个元素里的数据; 2.可以点赞,收藏; 有没有大牛指点一下思路,或分享一下相关源码[face]monkey:14.gif[/face] -
做爬虫的可以看一下
2018-06-05 12:14:09所谓爬虫,就是将目标网络资源通过自动化的方式获取并得到操作权。至于使用什么语言工具,那看你自己的爱好,但你选择的语言工具最好自带网络通信功能,否者你需要自己去封装很多这方面的功能模块,那就本末倒置了。...
-
原生js实现自动点击按钮超链接跳转
-
MySQL 高可用工具 heartbeat 实战部署详解
-
【硬核】一线Python程序员实战经验分享(1)
-
使用 Linux 平台充当 Router 路由器
-
ipscan-3.7.6-setup.exe
-
2021-02-25 数仓项目的搭建方向
-
Day 18 类的继承、访问权限、拷贝和内存管理
-
strade:strade是一个开源的股票扫描仪和筛选器-源码
-
2021-02-25
-
PPT大神之路高清教程
-
io-11.github.io-源码
-
产业数字金融的数字化与生态化
-
FastDFS 分布式文件系统部署
-
设置代码高亮
-
epam_python_autumn_2020:EPAM SPb秋季python课程-源码
-
RapidScada从入门到精通
-
离子交换玻璃波导折射率分布的确定
-
【Python-随到随学】 FLask第一周
-
安装Mysql与Navicat12
-
centos7 php7.2 安装