知己知彼,案例对比 Requests、Selenium、Scrapy 爬虫库!
大家好,我是早起。
经常有读者会爬虫学哪个库?其实常用的 Python 爬虫库无非是requests
,selenium
和scrapy
,其实每个库都有他们的特点,对于我来说没有最推荐的库只有最合适库,本文就将基于一个简单的爬虫案例(Python爬取起点中文网)来对比分析三个库
目标需求为批量采集排行榜书籍信息,如下图所示:
页面结构很容易分析出来,排行榜100条书籍信息,一个静态页面包含20条数据。使用不同的第三方库进行数据解析并提取数据,分别是:
requests
selenium
Scrapy
然后再逻辑代码的开头和结尾加上时间戳,得到程序运行时间,进行效率对比。
这里由于都是使用xpath提取数据,三种方式xpath语句大同小异,这里提前数据解析说明:
1. imgLink: //div[@class='book-img-text']/ul/li/div[1]/a/@href
2. title: //div[@class='book-img-text']/ul/li//div[2]/h4/a/text()
3. author: //div[@class='book-img-text']/ul/li/div[2]/p[1]/a[1]/text()
4. intro: //div[@class='book-img-text']/ul/li/div[2]/p[2]/text()
5. update://div[@class='book-img-text']/ul/li/div[2]/p[3]/a/text()
一、requests
首先导入相关库
from lxml import etree
import requests
import time
逻辑代码如下
start = time.time() # 开始计时⏲url = 'https://www.qidian.com/rank/yuepiao?style=1&page=1'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
}page = requests.get(url,headers=headers)
html = etree.HTML(page.content.decode('utf-8'))
books = html.xpath("//div[@class='book-img-text']/ul/li")for book in books:imglink = 'https:' + book.xpath("./div[1]/a/@href")[0]# 其它信息xpath提取,这里省略 ....update = book.xpath("./div[2]/p[3]/a/text()")[0]print(imglink,title,author,intro,update)end = time.time() # 结束计时⏲print(end-start)
程序运行结果如下
可以看到用时 0.823s 将全部数据爬取下来。
二、 selenium
首先导入相关库
import time
from selenium import webdriver
代码实现如下
url = 'https://www.qidian.com/rank/yuepiao?style=1&page=1'start = time.time() # 开始计时⏲
driver = webdriver.Chrome()
driver.get(url)
books = driver.find_elements_by_xpath("//div[@class='book-img-text']/ul/li")for book in books:imglink = 'https:' + book.find_element_by_xpath("./div[1]/a").get_attribute('href')# 其它小说信息的定位提取语句,...update = book.find_element_by_xpath("./div[2]/p[3]/a").textprint(imglink,title,author,intro,update)end = time.time() # 结束计时⏲print(end-start)
# 18.564752340316772
运行结果如下
可以看到时间是18.8174s
三、Scrapy
最后是 Scrapy
实现,代码如下
import scrapy
import timeclass QdSpider(scrapy.Spider):name = 'qd'allowed_domains = ['qidian.com']start_urls = ['https://www.qidian.com/rank/yuepiao?style=1&page=1']def parse(self, response):start = time.time() # 开始计时⏲books = response.xpath("//div[@class='book-img-text']/ul/li")for book in books:imglink = 'https:' + book.xpath("./div[1]/a/@href").extract_first()# 其它信息的xpath提取语句,......update = book.xpath("./div[2]/p[3]/a/text()").extract_first()print(imglink, title, author, intro, update)end = time.time() # 结束计时⏲print(end - start)
运行结果如下
可以看到运行时间仅仅用了0.016s
四、结果分析
从代码量来看的话:其实代码量相差不大,因为实现逻辑比较简单。
但从运行时间来看的话:scrapy
是最快的只花了0.02s不到,selenium
是最慢的,花了将近20s,运行效率是 scrapy 的1/1000。不过scrapy开发、调试代码的时间相比于 requests
、selenium
回长一点,
在仔细研究一下原因
“
requests
:requests模拟浏览器的请求,将请求到的网页内容下载下来以后,并不会执行js代码。
selenium
为什么最慢:首先Selenium是一个用于Web应用程序自动化测试工具,Selenium测试直接运行在浏览器中(支持多种浏览器,谷歌,火狐等等),模拟用户进行操作,以得到网页渲染之后的结果,selenium解析执行了网页CSS,js代码,所以效率较低。
scrapy
框架爬取效率最高:首先同requests一样,scrapy它也没有执行网页js代码,但是我们知道scrapy他说一个提取结构性数据的应用框架,Scrapy使用了Twisted异步网络框架,可以加快我们的下载速度,并发性好,性能较高,所以它的效率最高。”
五、补充--selenium的优势
通过上面的简单测试,我们可能会觉得selenium效率如此低下,是不是数据采集不太常用selenium的方式,这个的话只能说在能够爬取到数据的前提下,采集效率高的方式才会作为首选。
本文的目的不是为了说明不要使用selenium,接下来我们看看招聘网站--拉勾招聘的页面数据采集。随机选择一个岗位java,页面如下:
5.1 requests实现
如果是用 requests
请求数据
你会发现并没有数据,网页做了反爬处理,这时候selenium就派上用场了,不用分析网站反爬方式,直接模拟用户请求数据(大多数情况下,也有针对selenium的反爬手段)
5.2 selenium实现
如上文所说,如果是用 requests
或者 scrapy
爬虫发现有反爬措施,可以尝试selenium
,有时会异常简单
from selenium import webdriverurl = 'https://www.lagou.com/zhaopin/Java/?labelWords=label'driver = webdriver.Chrome()
driver.get(url)
items = driver.find_elements_by_xpath("//ul[@class='item_con_list']/li")
print(len(items))
for item in items:title = item.find_element_by_xpath("./div[1]/div[1]/div[1]/a/h3").textprint(title)
运行结果如下:
很轻松就提取到了页面的数据!
所以根据本文的案例分析,如果有爬虫需求时,将方法定格在某一个方法并非是一个很好的选择,我们需要根据对应网站/app的特点以及具体需求,来综合判断,挑选出最合适的爬虫库!
知己知彼,案例对比 Requests、Selenium、Scrapy 爬虫库!相关推荐
- 爬虫必备,案例对比 Requests、Selenium、Scrapy 爬虫库!
经常有读者会爬虫学哪个库?其实常用的 Python 爬虫库无非是requests,selenium和scrapy,且每个库都有他们的特点,对于我来说没有最推荐的库只有最合适库,本文就将基于一个简单的爬 ...
- python 基金净值_Python爬虫周记之案例篇——基金净值Selenium动态爬虫
在成功完成基金净值爬虫的爬虫后,简单了解爬虫的一些原理以后,心中不免产生一点困惑--为什么我们不能直接通过Request获取网页的源代码,而是通过查找相关的js文件来爬取数据呢? 有时候我们在用req ...
- Scrapy爬虫框架视频学习
文章目录 Scrapy爬虫框架 1. 框架架构 1.1 Scrapy框架介绍 1.2 Scrapy架构图 1.3 Scrapy框架模块功能 1.4 Scrapy的运作流程(容易理解的介绍) 2. Sc ...
- Python网络爬虫之requests库Scrapy爬虫比较
requests库Scrapy爬虫比较 相同点: 都可以进行页面请求和爬取,Python爬虫的两个重要技术路线 两者可用性都好,文档丰富,入门简单. 两者都没有处理JS,提交表单,应对验证码等功能(可 ...
- 爬虫文档学习 xpath bs4 selenium scrapy...
爬虫 一.介绍 1.什么是爬虫 1.1 爬虫(Spider)的概念 爬虫用于爬取数据, 又称之为数据采集程序. 爬取的数据来源于网络,网络中的数据可以是由Web服务器(Nginx/Apache).数据 ...
- Scrapy爬虫及案例剖析
来自:ytao 由于互联网的极速发展,所有现在的信息处于大量堆积的状态,我们既要向外界获取大量数据,又要在大量数据中过滤无用的数据.针对我们有益的数据需要我们进行指定抓取,从而出现了现在的爬虫技术,通 ...
- python构造响应头_Python爬虫库requests获取响应内容、响应状态码、响应头
首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...
- Scrapy 爬虫实战-爬取字幕库
Scrapy 爬虫实战-爬取字幕库 1.首先,创建Scrapy框架 创建工程 scrapy startproject zimuku创建爬虫程序 cd zimuku scrapy genspider z ...
- 推荐几个值得关注的爬虫库
转载自公众号:easypython 爬虫速度太慢?在这里推荐几个值得关注的异步爬虫库,给你的爬虫提速.看看有没有你没听过的? 类似 Requests 的库 为什么要推荐类似 Requests 的库呢? ...
最新文章
- 源码分析-Activity的启动流程
- html 流动效果,html5 canvas流动的海浪特效
- 【Paper】Network Dissection: Quantifying Interpretability of Deep Visual Representations跑源码遇到的问题
- Qt for Android 自定义启动页(解决启动页拉伸的问题)
- 计算机网络第1章(概述)
- 关于HibernateDaoSupport中的getHibernateTemplate().execute及executeFind方法
- 异步导致UI句柄增加的解决办法
- 一加7pro保存的录音文件在哪一个文件夹?
- ubuntu误删旧内核,重启后循环检测进不了系统解决方案
- Maven配置文件无法被导出或者生效的问题【已解决】
- 【腾讯内部干货分享】分析Dalvik字节码进行减包优化
- Pixel 3a 开箱及 Google Fi 服务评测视频
- c语言中lookup函数功能,Lookup函数以及0/的用法
- (w10)Prtsc截图键无法正常使用——解决办法
- 非常实用的“绿色电子地图”
- 网站接口被恶意攻击怎么办
- VMware克隆虚拟机后修改UUID、MAC地址、IP和主机名
- 手把手简单制作一个 Java 木马程序
- 好看更好玩的vivo S12 Pro,越用越顺手
- 等保2.0linux测评指南