Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >案例对比 Requests、Selenium、Scrapy 谁是yyds?

案例对比 Requests、Selenium、Scrapy 谁是yyds?

作者头像
龙哥
发布于 2021-08-05 03:27:36
发布于 2021-08-05 03:27:36
3.7K01
代码可运行
举报
文章被收录于专栏:Python绿色通道Python绿色通道
运行总次数:1
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制

经常有读者会爬虫学哪个库?其实常用的 Python 爬虫库无非是requestsseleniumscrapy,且每个库都有他们的特点,对于我来说没有最推荐的库只有最合适库,本文就将基于一个简单的爬虫案例(Python爬取起点中文网)来对比分析(从时间角度)三个库

目标需求为批量采集排行榜书籍信息,如下图所示:

页面结构很容易分析出来,排行榜100条书籍信息,一个静态页面包含20条数据。使用不同的第三方库进行数据解析并提取数据,分别是:

  • requests
  • selenium
  • Scrapy

然后再逻辑代码的开头和结尾加上时间戳,得到程序运行时间,进行效率对比。

这里由于都是使用xpath提取数据,三种方式xpath语句大同小异,这里提前数据解析说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

首先导入相关库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from lxml import etree
import requests
import time

逻辑代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

首先导入相关库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
from selenium import webdriver

代码实现如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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").text
    print(imglink,title,author,intro,update)

end = time.time()                   #  结束计时⏲

print(end-start)
# 18.564752340316772

运行结果如下

可以看到时间是18.8174s

三、Scrapy

最后是 Scrapy 实现,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scrapy
import time


class 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开发、调试代码的时间相比于 requestsselenium 回长一点,

在仔细研究一下原因

requests:requests模拟浏览器的请求,将请求到的网页内容下载下来以后,并不会执行js代码。 selenium为什么最慢:首先Selenium是一个用于Web应用程序自动化测试工具,Selenium测试直接运行在浏览器中(支持多种浏览器,谷歌,火狐等等),模拟用户进行操作,以得到网页渲染之后的结果,selenium解析执行了网页CSS,js代码,所以效率较低。 scrapy框架爬取效率最高:首先同requests一样,scrapy它也没有执行网页js代码,但是我们知道scrapy他说一个提取结构性数据的应用框架,Scrapy使用了Twisted异步网络框架,可以加快我们的下载速度,并发性好,性能较高,所以它的效率最高。 ”

五、补充

通过上面的简单测试,我们可能会觉得selenium效率如此低下,是不是数据采集不太常用selenium?只能说在能够爬取到数据的前提下,采集效率高的方式才会作为首选。

所以本文的目的不是为了说明不要使用selenium,接下来我们看看招聘网站--拉勾招聘的页面数据采集。随机选择一个岗位java,页面如下:

5.1 requests实现

如果是用 requests 请求数据

你会发现并没有数据,网页做了反爬处理,这时候selenium就派上用场了,不用分析网站反爬方式,直接模拟用户请求数据(大多数情况下,也有针对selenium的反爬手段)

5.2 selenium实现

如上文所说,如果是用 requests 或者 scrapy爬虫发现有反爬措施,可以尝试selenium,有时会异常简单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from selenium import webdriver

url = '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").text
    print(title)

运行结果如下:

很轻松就提取到了页面的数据!

所以根据本文的案例分析,如果有爬虫需求时,将方法定格在某一个方法并非是一个很好的选择,大多情况下我们需要根据对应网站/app的特点以及具体需求,来综合判断,挑选出最合适的爬虫库!

代码语言:javascript
代码运行次数:0
运行
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python绿色通道 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python——爬虫实战 爬取淘宝店铺内所有宝贝图片
之前用四篇很啰嗦的入门级别的文章,带着大家一起去了解并学习在编写爬虫的过程中,最基本的几个库的用法。
Originalee
2018/08/30
3.1K0
scrapy_selenium爬取Ajax、JSON、XML网页:豆瓣电影
在网络爬虫的开发过程中,我们经常会遇到一些动态加载的网页,它们的数据不是直接嵌入在HTML中,而是通过Ajax、JSON、XML等方式异步获取的。这些网页对于传统的scrapy爬虫来说,是很难直接解析的。那么,我们该如何使用scrapy_selenium来爬取这些数据格式的网页呢?本文将为你介绍scrapy_selenium的基本原理和使用方法,并给出一个实际的案例。
jackcode
2023/08/21
3710
scrapy_selenium爬取Ajax、JSON、XML网页:豆瓣电影
Scrapy+Selenium爬取动态渲染网站
在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值。但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据。那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值
py3study
2020/11/05
1.7K0
Scrapy+Selenium爬取动态渲染网站
Scrapy_Study02
当当网的爬取也是比较容易, 但是这里需要结合scrapy-redis来实现分布式爬取数据
Echo_Wish
2023/11/30
1970
Scrapy_Study02
[腾讯云 Cloud studio 实战训练营] 制作Scrapy Demo爬取起点网月票榜小说数据
而这个云开发的IDE就是只需要一台能够上网的电脑就可以进行开发,完全不需要配置环境,下载编译器和编辑器。
布小禅
2023/08/03
2660
python+selenium+pyquery实现数据爬虫
首先我们本次爬虫的任务是完成某采购网站的信息爬取,省去人工耗费的时间。快速筛选出我们的需要的指定信息。然后将招标信息的标题、链接、和时间找出来,并保存到Excel。
用户6367961
2020/12/01
9300
python+selenium+pyquery实现数据爬虫
Selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器,但是现在谷歌的无头比较火,下面展示谷歌的无头)
HammerZe
2022/05/11
3.2K0
Selenium
(二)selenium的实际运用
上一篇我们已经知道怎么简单使用selenium了,那么我们就从这篇博客来动手爬取网站吧。
全栈程序员站长
2021/05/19
6620
实战案例 | Scrapy 集成Selenium爬取智联招聘数据
初学scrapy之后,发现就是效率对比于selenium和requests快了很多,那么问题来了,如果网站设置了反爬,比如User-Agent反爬,cookie反爬,IP封禁等等,所以我们需要通过集成selenium到scrapy中,绕过网站反爬,达到目的。
快学Python
2021/08/09
1.6K0
scrapy全站爬取
需求:爬取站长素材的高清图片的爬取https://sc.chinaz.com/tupian/
用户8447427
2022/08/18
8150
scrapy全站爬取
day130-day132requests+selenium&线程池&scrapy安装
1.requests简单爬虫 1.1依赖第三方工具 # pip install requests # pip install lxml 1.2lxml的xpath解析 from lxml import etree # 获取页面文本 web_response = requests.get(web_url, web_headers) web_response.encoding = 'utf8' web_text = web_response.text # 生成 etree 对象 web_tree = etre
少年包青菜
2020/05/05
6530
【学习笔记】Python爬虫
URL由协议、主机名、端口、路径、参数、锚点 URLError\HTTPError 后者时前者的子类 用try-except捕获异常
Livinfly
2022/10/26
2.1K0
python爬虫–scrapy(再探)
— 图片:xpath解析出图片src的属性值。单独的对图片地址发起请求获取图片二进制类型的数据。
全栈程序员站长
2021/04/21
6680
python爬虫–scrapy(再探)
scrapy结合selenium进行动态加载页面内容爬取
使用requests进行数据获取的时候一般使用的是respond.text来获取网页源码,然后通过正则表达式提取出需要的内容。
zx钟
2019/07/19
2.4K0
利用selenium尝试爬取豆瓣图书
目录 一、小小课堂 二、selenium+driver初步尝试控制浏览器 三、完整代码 四、运行结果 链接:https://search.douban.com/book/subject_searc
Python研究者
2020/11/24
1.5K0
爬虫之scrapy框架
  何为框架,就相当于一个封装了很多功能的结构体,它帮我们把主要的结构给搭建好了,我们只需往骨架里添加内容就行。scrapy框架是一个为了爬取网站数据,提取数据的框架,我们熟知爬虫总共有四大部分,请求、响应、解析、存储,scrapy框架都已经搭建好了。scrapy是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架,scrapy使用了一种非阻塞的代码实现并发的,结构如下:
py3study
2020/01/17
1.3K0
scrapy分布式浅谈+京东示例
Github:https://github.com/xbhog/scrapyRedis
xbhog
2020/12/10
6420
scrapy分布式浅谈+京东示例
爬虫之selenium
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 有了selenium能够实现可见即可爬 -使用(本质,并不是python在操作浏览器,而是python在操作浏览器驱动(xx.exe),浏览器驱动来驱动浏览器) -0 以驱动谷歌浏览器为例子(建议你用谷歌,最合适)找谷歌浏览器驱动 -0 如果是windows,解压之后是个exe,不同平台就是不同平台的可执行文件 -1 安装模块:pip3 install selenium -2 需要浏览器驱动(ie,火狐,谷歌浏览器。。。。驱动得匹配(浏览器匹配,浏览器版本跟驱动匹配)) -3 写代码
GH
2020/03/19
1.9K0
Python网络爬虫实战使用Requests、Beautiful Soup和Selenium获取并处理网页数据
在网络数据变得日益丰富和重要的今天,网络爬虫成为了获取和分析数据的重要工具之一。Python作为一种强大而灵活的编程语言,在网络爬虫领域也拥有广泛的应用。本文将介绍如何使用Python中的两个流行库Beautiful Soup和Requests来创建简单而有效的网络爬虫,以便从网页中提取信息。
一键难忘
2024/04/23
2K0
爬虫案例1-爬取图片的三种方式之一:selenium篇(2)
继使用requests库爬取图片后,本文使用python第三方库selenium来进行图片的爬取,后续也会使用同样是自动化测试工具DrissionPage篇来进行图片的爬取。
laity
2024/08/20
4140
爬虫案例1-爬取图片的三种方式之一:selenium篇(2)
相关推荐
Python——爬虫实战 爬取淘宝店铺内所有宝贝图片
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验