xpath re bs4 等爬虫解析器的性能比较

本文原始地址:https://sitoi.cn/posts/23470.html

思路

测试网站地址:http://baijiahao.baidu.com/s?id=1644707202199076031

根据同一个网站,获取同样的数据,重复 500 次取和后进行对比。

测试例子

# -*- coding: utf-8 -*-
import re
import time import scrapy
from bs4 import BeautifulSoup class NewsSpider(scrapy.Spider):
name = 'news'
allowed_domains = ['baidu.com']
start_urls = ['http://baijiahao.baidu.com/s?id=1644707202199076031'] def parse(self, response):
re_time_list = []
xpath_time_list = []
lxml_time_list = []
bs4_lxml_time_list = []
html5lib_time_list = []
bs4_html5lib_time_list = []
for _ in range(500):
# re
re_start_time = time.time()
news_title = re.findall(pattern="<title>(.*?)</title>", string=response.text)[0]
news_content = "".join(re.findall(pattern='<span class="bjh-p">(.*?)</span>', string=response.text))
re_time_list.append(time.time() - re_start_time)
# xpath
xpath_start_time = time.time()
news_title = response.xpath("//div[@class='article-title']/h2/text()").extract_first()
news_content = response.xpath('string(//*[@id="article"])').extract_first()
xpath_time_list.append(time.time() - xpath_start_time)
# bs4 html5lib without BeautifulSoup
soup = BeautifulSoup(response.text, "html5lib")
html5lib_start_time = time.time()
news_title = soup.select_one("div.article-title > h2").text
news_content = soup.select_one("#article").text
html5lib_time_list.append(time.time() - html5lib_start_time)
# bs4 html5lib with BeautifulSoup
bs4_html5lib_start_time = time.time()
soup = BeautifulSoup(response.text, "html5lib")
news_title = soup.select_one("div.article-title > h2").text
news_content = soup.select_one("#article").text
bs4_html5lib_time_list.append(time.time() - bs4_html5lib_start_time) # bs4 lxml without BeautifulSoup
soup = BeautifulSoup(response.text, "lxml")
lxml_start_time = time.time()
news_title = soup.select_one("div.article-title > h2").text
news_content = soup.select_one("#article").text
lxml_time_list.append(time.time() - lxml_start_time) # bs4 lxml without BeautifulSoup
bs4_lxml_start_time = time.time()
soup = BeautifulSoup(response.text, "lxml")
news_title = soup.select_one("div.article-title > h2").text
news_content = soup.select_one("#article").text
bs4_lxml_time_list.append(time.time() - bs4_lxml_start_time)
re_result = sum(re_time_list)
xpath_result = sum(xpath_time_list)
lxml_result = sum(lxml_time_list)
html5lib_result = sum(html5lib_time_list)
bs4_lxml_result = sum(bs4_lxml_time_list)
bs4_html5lib_result = sum(bs4_html5lib_time_list) print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")
print(f"re 使用时间:{re_result}")
print(f"xpath 使用时间:{xpath_result}")
print(f"lxml 纯解析使用时间:{lxml_result}")
print(f"html5lib 纯解析使用时间:{html5lib_result}")
print(f"bs4_lxml 转换解析使用时间:{bs4_lxml_result}")
print(f"bs4_html5lib 转换解析使用时间:{bs4_html5lib_result}")
print("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")
print(f"xpath/re :{xpath_result / re_result}")
print(f"lxml/re :{lxml_result / re_result}")
print(f"html5lib/re :{html5lib_result / re_result}")
print(f"bs4_lxml/re :{bs4_lxml_result / re_result}")
print(f"bs4_html5lib/re :{bs4_html5lib_result / re_result}")
print("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")

测试结果:

第一次

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

re 使用时间:0.018010616302490234
xpath 使用时间:0.19927382469177246
lxml 纯解析使用时间:0.3410227298736572
html5lib 纯解析使用时间:0.3842911720275879
bs4_lxml 转换解析使用时间:1.6482152938842773
bs4_html5lib 转换解析使用时间:6.744122505187988 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> xpath/re :11.064242408196765
lxml/re :18.934539726245003
html5lib/re :21.336925154218847
bs4_lxml/re :91.51354213550078
bs4_html5lib/re :374.4526223822509
lxml/xpath :1.7113272673976896
html5lib/xpath :1.9284578525152096 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

第二次

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

re 使用时间:0.023047208786010742
xpath 使用时间:0.18992280960083008
lxml 纯解析使用时间:0.3522317409515381
html5lib 纯解析使用时间:0.418229341506958
bs4_lxml 转换解析使用时间:1.710503101348877
bs4_html5lib 转换解析使用时间:7.1153998374938965 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> xpath/re :8.24059917034769
lxml/re :15.28305419636484
html5lib/re :18.14663742538819
bs4_lxml/re :74.21736476770769
bs4_html5lib/re :308.7315216154427
lxml/xpath :1.8546047296364272
html5lib/xpath :2.2021016979791463 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

第三次

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

re 使用时间:0.014002561569213867
xpath 使用时间:0.18992352485656738
lxml 纯解析使用时间:0.3783881664276123
html5lib 纯解析使用时间:0.39995455741882324
bs4_lxml 转换解析使用时间:1.751767873764038
bs4_html5lib 转换解析使用时间:7.1871068477630615 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> xpath/re :13.563484360899695
lxml/re :27.022781835827757
html5lib/re :28.56295653062267
bs4_lxml/re :125.10338662716453
bs4_html5lib/re :513.2708620660298
lxml/xpath :1.9923185751389976
html5lib/xpath :2.1058716013241323 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

结果分析:

三次取平均值结果分析

re xpath lxml html5lib lxml(bs4) html5lib(bs4)
re 1 10.52 19.46 21.84 92.82 382.25
xpath 1 1.85 2.08 8.82 36.34
lxml 1 1.12 4.77 19.64
html5lib 1 4.25 17.50
lxml(bs4) 1 4.12
html5lib(bs4) 1
  • xpath/re :10.52
  • lxml/re :19.46
  • html5lib/re :21.84
  • bs4_lxml/re :92.82
  • bs4_html5lib/re :382.25
  • lxml/xpath :1.85
  • html5lib/xpath :2.08
  • bs4_lxml/xpath :8.82
  • bs4_html5lib/xpath :36.34
  • html5lib/lxml :1.12
  • bs4_lxml/lxml :4.77
  • bs4_html5lib/lxml :19.64
  • bs4_lxml/html5lib :4.25
  • bs4_html5lib/html5lib :17.50
  • bs4_html5lib/bs4_lxml :4.12

三种爬取方式的对比

re xpath bs4
安装 内置 第三方 第三方
语法 正则 路径匹配 面向对象
使用 困难 较困难 简单
性能 最高 适中 最低

结论

re > xpath > bs4

  • re 是 xpath 的 10 倍左右

    虽然 re 在性能上远比 xpath bs4 高很多,但是在使用上,比 xpath 和 bs4 难度上要大很多,且后期维护的困难度上也高很多。

  • xpath 是 bs4 的 1.8 倍左右

    仅仅比较提取的效率来说,xpath 是 bs4 的 1.8 倍左右,但是实际情况还包含 bs4 的 转换过程,在层数多且量大的情况下,实际效率 xpath 要比 bs4 高很多。

总的来说,xpath 加上 scrapy-redis 的分布式已经非常满足性能要求了,建议入 xpath 的坑。

Xpath re bs4 等爬虫解析器的性能比较的更多相关文章

  1. Python HTML解析器BeautifulSoup(爬虫解析器)

    BeautifulSoup简介 我们知道,Python拥有出色的内置HTML解析器模块——HTMLParser,然而还有一个功能更为强大的HTML或XML解析工具——BeautifulSoup(美味的 ...

  2. Jsoup -- 网络爬虫解析器

    需要下载jsoup-1.8.1.jar包 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQue ...

  3. SQL解析器的性能測试

    对同一个sql语句,使用3种解析器解析出ast语法树(这是编译原理上的说法,在sql解析式可能就是解析器自己定义的statement类型).运行100万次的时间对照. package demo.tes ...

  4. 高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

  5. 非标准的xml解析器的C++实现:一、思考基本数据结构的设计

    前言: 我在C++项目中使用xml作为本地简易数据管理,到目前为止有5年时间了,从最初的全文搜索标签首尾,直到目前项目中实际运用的类库细致到已经基本符合w3c标准,我一共写过3次解析器,我自己并没有多 ...

  6. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  7. 3 爬虫解析 Xpath 和 BeautifulSoup

    1.正则表达式 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [-] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\w ...

  8. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  9. 爬虫入门之爬取策略 XPath与bs4实现(五)

    爬虫入门之爬取策略 XPath与bs4实现(五) 在爬虫系统中,待抓取URL队列是很重要的一部分.待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪 ...

随机推荐

  1. 【oracle】ORA-12638 : 身份证明检索失败

    sqlnet.ora 1.删了 2.#注释了 背后缘由:待写

  2. 洛谷 P1950 长方形_NOI导刊2009提高(2)

    传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 ...

  3. [LeetCode] 772. Basic Calculator III 基本计算器之三

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  4. [LeetCode] 79. Word Search 词语搜索

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  5. NOI 2019 退役记

    非常抱歉,因为不退役了,所以这篇退役记鸽了.

  6. oracle--表空间基本操作

    --查表空间使用率情况(含临时表空间) SELECT d.tablespace_name "Name", d.status "Status", TO_CHAR ...

  7. WC 2008 观光计划(斯坦纳树)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2595 思路 是一道比较裸的斯坦纳树呢- 题意等价于选出包含一些点的最小生成树,这就是斯坦纳树 ...

  8. ffmpeg Operation not permitted 报错的解决过程记录

    问题重现 由于视频的录制过程出现了一些小问题,需要重新将视频文件切割和合并,找了几个视频编辑软件来做这个事情,最终的结果都不是特别满意,当时已经挺晚的了,本来打算上床睡觉第二天再去想辙,从椅子上起身的 ...

  9. 【操作系统之十四】iptables扩展模块

    1.iprange 使用iprange扩展模块可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址.--src-range:匹配报文的源地址所在范围--dst-ra ...

  10. 修!咻咻!团队Beta作业博客汇总

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...