首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么不推荐Selenium写爬虫

为什么不推荐Selenium写爬虫

作者头像
小歪
发布2018-04-04 15:08:54
2.1K0
发布2018-04-04 15:08:54
举报

最近在群里经常会看到有些朋友说,使用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

关键词是 FastPowerful,使用过确实感觉如此。我感觉 Scrapy 就是一个全家桶,它把爬虫所需要的大部分东西(为什么不是全部,下面会说到)都集成到这个框架中,如:下载器、中间件、调度器、Spider、调试、数据流等等所有功能全部都在这一个框架中,你所需要做的只是在命令行中输入:scrapy startproject yourproject

Scrapy 的缺点也是显而易见的:不支持分布式。scrapy中scheduler是运行在队列中的,而队列是在单机内存中的,服务器上爬虫是无法利用内存的队列做任何处理。但是也有解决办法,参见rmax/scrapy-redis

Requests

来看看 Requests的文档

Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。

作者真幽默

urllib2 VS requests

#!/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')

# ------
# 200
# 'application/json'
#!/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 的缺点:

  1. 速度慢。每次运行爬虫都打开一个浏览器,如果没有设置,还会加载图片、JS等等一大堆东西;
  2. 占用资源太多。有人说,把Chrome换成无头浏览器PhantomJS,原理都是一样的,都是打开浏览器,而且很多网站会验证参数,如果对方看到你是以PhantomJS去访问,会BAN掉你的请求,然后你又要考虑更换请求头的事情,事情复杂程度不知道多了多少,为啥学Python?因为Python简单啊,如果有更快、更简单的库可以实现同样的功能,为什么不去使用呢?
  3. 对网络的要求会更高Selenium 加载了很多可能对您没有价值的补充文件(如css,js和图像文件)。 与仅仅请求您真正需要的资源(使用单独的HTTP请求)相比,这可能会产生更多的流量。
  4. 爬取规模不能太大。你有看到哪家公司用Selenium作为生产环境吗?
  5. 。学习Selenium的成本太高,只有我一个人觉得SeleniumRequests难一百倍吗?

我能想到的就这么多了,欢迎各位大佬补充。所以,如果可以使用 Requests 完成的,别用 Selenium,OK,洗脑完成。

之前面试爬虫工程师有一题就是:如何处理网站的登录系统? A.浏览器模拟 B.HTTP请求

如果你想做测试工程师,那肯定需要学会 Selenium,公司一个妹子就是测试,现在学了 Selenium,工作轻松了好多。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与算法进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 观点
  • 数据采集的顺序
  • 三种采集差异
    • Scrapy
      • Requests
        • Selenium
        相关产品与服务
        消息队列 TDMQ
        消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档