转自:
https://zhuanlan.zhihu.com/p/33542626
最近在群里经常会看到有些朋友说,使用Selenium去采集网站,我看到其实内心是很难受的,哎!为什么要用Selenium呢?
我想说下自己的看法,欢迎各位大佬批评。
观点
如果可以使用 Requests
完成的,别用 Selenium
数据采集的顺序
接到一个项目或者有一个采集需求时,第一步就是明确自己的需求。经常会遇到半路改需求的事情,真的很难受。
第二步就是去分析这个网站,这个在之前有提到过 采集方案策略之App抓包 :
首先大的地方,我们想抓取某个数据源,我们要知道大概有哪些路径可以获取到数据源,基本上无外乎三种:
PC端网站
针对移动设备响应式设计的网站(也就是很多人说的H5, 虽然不一定是H5);
移动App
原则是能抓移动App的,最好抓移动App,如果有针对移动设备优化的网站,就抓针对移动设备优化的网站,最后考虑PC网站。因为移动App基本都是API很简单,而移动设备访问优化的网站一般来讲都是结构简单清晰的HTML,而PC网站自然是最复杂的了;针对PC端网站和移动网站的做法一样,分析思路可以一起讲,移动App单独分析。
这个时候可以借用 postman
来分析请求,参考 或许你应该学学 postman
然后下一步可能就是工程开始,各种配置,以及选择哪种采集方式,一般来说 Scrapy 是最好用、也是最常见的框架。当然你也可以使用requests + xpath
或者 Selenium
。下面就我自己的看法来说说这三种采集方式。
三种采集差异
Scrapy
在 Scrapy 官网 上是这样写的:
Scrapy | A Fast and Powerful Scraping and Web Crawling Framework
关键词是 Fast
和 Powerful
,使用过确实感觉如此。我感觉 Scrapy
就是一个全家桶,它把爬虫所需要的大部分东西(为什么不是全部,下面会说到)都集成到这个框架中,如:下载器、中间件、调度器、Spider、调试、数据流等等所有功能全部都在这一个框架中,你所需要做的只是在命令行中输入:scrapy startproject yourproject
Scrapy 的缺点也是显而易见的:不支持分布式。scrapy中scheduler是运行在队列中的,而队列是在单机内存中的,服务器上爬虫是无法利用内存的队列做任何处理。但是也有解决办法,参见rmax/scrapy-redis
Requests
来看看 Requests的文档
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
gh_url = 'https://api.github.com'
req = urllib2.Request(gh_url)
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')
auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)
urllib2.install_opener(opener)
handler = urllib2.urlopen(req)
print handler.getcode()
print handler.headers.getheader('content-type')
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
r = requests.get('https://api.github.com', auth=('user', 'pass'))
print r.status_code
print r.headers['content-type']
# ------ # 200 # 'application/json'
简单对比发现 requests 的好用之处了,刚开始学习爬虫的时候也是从 urllib 开始,当看到 requests 果断抛弃,就像看到 xpath 抛弃 bs4 一样
所以如果你是初学者,那么请毫不犹豫的选择 requests
Selenium
最后来到今天的主角 Selenium, 首先看看官方怎么说
What is Selenium?
Selenium automates browsers. That's it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) be automated as well.
Selenium has the support of some of the largest browser vendors who have taken (or are taking) steps to make Selenium a native part of their browser. It is also the core technology in countless other browser automation tools, APIs and frameworks.
重点是:it is for automating web applications for testing purposes, but is certainly not limited to just that
,翻译过来就是:它是用于自动化Web应用程序的测试目的,但肯定不仅限于此,简单来说,Selenium 是web自动化测试工具集,如果你去Google上搜索 Selenium ,大多结果都是 利用Selenium 自动化web 测试
相关内容,比较出名的有博客园的虫师
至于为啥爬虫要用selenium,我在某些博客上找到有人这样说,我也不知道怎么说
对于一般网站来说scrapy、requests、beautifulsoup等都可以爬取,但是有些信息需要执行js才能显现,而且你肉眼所能看到的基本都能爬取下来,在学习中遇到了,就记录下来方便以后查看。
webdrive是selenium中一个函数:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('网址')
其中PhantomJS同时可以换成Chrome、Firefox、Ie等等,但是PhantomJS是一个无头的浏览器,运行是不会跳出相应的浏览器,运行相对效率较高。在调试中可以先换成Chrome,方便调试,最后再换成PhantomJS即可。
下面是吐槽时间,说一说 Selenium
的缺点:
- 速度慢。每次运行爬虫都打开一个浏览器,如果没有设置,还会加载图片、JS等等一大堆东西;
- 占用资源太多。有人说,把
Chrome
换成无头浏览器PhantomJS
,原理都是一样的,都是打开浏览器,而且很多网站会验证参数,如果对方看到你是以PhantomJS
去访问,会BAN掉你的请求,然后你又要考虑更换请求头的事情,事情复杂程度不知道多了多少,为啥学Python?因为Python简单啊,如果有更快、更简单的库可以实现同样的功能,为什么不去使用呢? - 对网络的要求会更高。
Selenium
加载了很多可能对您没有价值的补充文件(如css,js和图像文件)。 与仅仅请求您真正需要的资源(使用单独的HTTP请求)相比,这可能会产生更多的流量。 - 爬取规模不能太大。你有看到哪家公司用
Selenium
作为生产环境吗? - 难。学习
Selenium
的成本太高,只有我一个人觉得Selenium
比Requests
难一百倍吗?
我能想到的就这么多了,欢迎各位大佬补充。所以,如果可以使用 Requests
完成的,别用 Selenium
,OK,洗脑完成。