Python爬虫入门之爬虫解析提取数据的四种方法

news2024/11/17 9:30:32

本文主要介绍了Python爬虫入门之爬虫解析提取数据的四种方法,通过具体的内容向大家展现,希望对大家Python爬虫的学习有所帮助。

基础爬虫的固定模式

笔者这里所谈的基础爬虫,指的是不需要处理像异步加载、验证码、代理等高阶爬虫技术的爬虫方法。一般而言,基础爬虫的两大请求库urllib和requests中requests通常为大多数人所钟爱,当然urllib也功能齐全。两大解析库BeautifulSoup因其强大的HTML文档解析功能而备受青睐,另一款解析库lxml在搭配xpath表达式的基础上也效率提高。就基础爬虫来说,两大请求库和两大解析库的组合方式可以依个人偏好来选择。

笔者喜欢用的爬虫组合工具是:

· requests+BeautifulSoup

· requests+lxml

同一网页爬虫的四种实现方式

笔者以腾讯新闻首页的新闻信息抓取为例。
首页外观如下:

在这里插入图片描述
比如说我们想抓取每个新闻的标题和链接,并将其组合为一个字典的结构打印出来。首先查看HTML源码确定新闻标题信息组织形式。
在这里插入图片描述
可以目标信息存在于em标签下a标签内的文本和href属性中。可直接利用requests库构造请求,并用BeautifulSoup或者lxml进行解析。

· 方式一:requests+BeautifulSoup+select css选择器

select method import requests from bs4 import BeautifulSoup

headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}

url = ‘’ Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode(“utf-8”), ‘lxml’)

em = Soup.select(‘em[class=“f14 l24”] a’) for i in em:

title = i.get_text()

link = i['href']

print({'标题': title,

       '链接': link

})

很常规的处理方式,抓取效果如下:
http://img.blog.itpub.net/blog/attachment/201807/3/31077337_1530609020XPfE.jpg?x-oss-process=style/bb
· 方式二:requests+BeautifulSoup+find_all进行信息提取

find_all method import requests from bs4 importBeautifulSoup

headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}

url = ‘’ Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode(“utf-8”), ‘lxml’)

em = Soup.find_all(‘em’, attrs={‘class’: ‘f14 l24’})for i in em:

title = i.a.get_text()

link = i.a['href']

print({'标题': title,            '链接': link

})

同样是requests+BeautifulSoup的爬虫组合,但在信息提取上采用了find_all的方式。效果如下:
http://img.blog.itpub.net/blog/attachment/201807/3/31077337_1530609089ta9l.jpg?x-oss-process=style/bb
· 方式三:requests+lxml/etree+xpath表达式

lxml/etree method import requests from lxml import etree

headers = { ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}

url = ‘’ html = requests.get(url = url, headers = headers)

con = etree.HTML(html.text)

title = con.xpath(‘//em[@class=“f14 l24”]/a/text()’)

link = con.xpath(‘//em[@class=“f14 l24”]/a/@href’) for i in zip(title, link):

print({'标题': i[0],

       '链接': i[1]

})

使用lxml库下的etree模块进行解析,然后使用xpath表达式进行信息提取,效率要略高于BeautifulSoup+select方法。这里对两个列表的组合采用了zip方法。效果如下:
http://img.blog.itpub.net/blog/attachment/201807/3/31077337_1530609108D7CG.jpg?x-oss-process=style/bb· 方式四:requests+lxml/html/fromstring+xpath表达式

lxml/html/fromstring method import requests import lxml.html as HTML

headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}

url = ‘’ con = HTML.fromstring(requests.get(url = url, headers = headers).text)

title = con.xpath(‘//em[@class=“f14 l24”]/a/text()’)

link = con.xpath(‘//em[@class=“f14 l24”]/a/@href’) for i in zip(title, link):

print({'标题': i[0],'链接': i[1]

})

跟方法三类似,只是在解析上使用了lxml库下的html.fromstring模块。抓取效果如下:
http://img.blog.itpub.net/blog/attachment/201807/3/31077337_15306091256Q0W.jpg?x-oss-process=style/bb
很多人觉得爬虫有点难以掌握,因为知识点太多,需要懂前端、需要python熟练、还需要懂数据库,更不用说正则表达式、XPath表达式这些。其实对于一个简单网页的数据抓取,不妨多尝试几种抓取方案,举一反三,也更能对python爬虫有较深的理解。长此以往,对于各类网页结构都有所涉猎,自然经验丰富,水到渠成。

爬取网页数据用正则表达式的话,可以直接从网页源代码文本中匹配,但出错率较高,且熟悉正则表达式的使用也比较难,需要经常翻阅文档。

实际爬取数据大多基于 HTML 结构的 Web 页面,网页节点较多,各种层级关系。可以考虑使用 Xpath 解析器、BeautifulSoup解析器、PyQuery CSS解析器抽取结构化数据,使用正则表达式抽取非结构化数据。

Xpath:可在 XML 中查找信息;支持 HTML 的查找 ;通过元素和属性进行导航,查找效率很高。在学习 Selenium 以及 Scrapy 框架中也都会用到。

BeautifulSoup:依赖于 lxml 的解析库,也可以从 HTML 或 XML 文件中提取数据。

PyQuery:Python仿照 jQuery 严格实现,可以直接解析 DOM 节点的结构,并通过 DOM 节点的一些属性快速进行内容提取。

对于爬取网页结构简单的 Web 页面,有些代码是可以复用的,如下所示:

from fake_useragent import UserAgent

#随机产生请求头

ua = UserAgent(verify_ssl=False, path=‘fake_useragent.json’)

def random_ua():

headers = {  

    "Accept-Encoding": "gzip",  

    "User-Agent": ua.random  

}  

return headers

伪装请求头,并可以随机切换,封装为函数,便于复用。

def scrape_html(url):

resp = requests.get(url, headers=random_ua())  

# print(resp.status_code, type(resp.status_code))  

# print(resp.text)  

if resp.status_code == 200:  

    return resp.text  

else:  

    logging.info('请求网页失败')

请求网页,返回状态码为 200 说明能正常请求,并返回网页源代码文本。

文章来源:网络 版权归原作者所有

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/504534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vscode开发第一个Vue+Element Plus示例

Vscode开发第一个VueElement Plus示例 目前,前端开发工具非常多,如Webstorm、Atom、HBuilder、Visual Studio Code、Sublime Text、Notepad等。对于有经验的开发者来说,使用哪一款工具都可以。笔者习惯使用Visual Studio Code。 Visual St…

什么是镜像?阿里云服务器镜像是什么?镜像怎么选?

阿里云服务器镜像就是云服务器的装机盘,镜像是为云服务器安装操作系统的。阿里云镜像分为类型分为公共镜像、自定义镜像、共享镜像、云市场镜像和社区镜像,如下图: 目录 什么是镜像? 镜像种类说明 公共镜像 自定义镜像 共享…

【HarmonyOS】轻量级智能穿戴应用如何在页面中实现数据传递与全局变量的使用

【关键词】 轻量级智能穿戴、LiteWearable、数据传递、全局变量 【问题描述】 开发轻量级智能穿戴LiteWearable应用,在app.js中定义全局变量,在页面中通过this.$app.$def.xxx获取时,报错TypeError: Cannot read property $def of undefined…

FlinkTableAPI与SQL编程实战

FlinkTableAPI与SQL编程实战 接下来我们一起来进入到FlinkSQL的编码实战当中&#xff0c;通过代码来实现FlinkSQL的编码开发 1、Flink TableAPI实践 1.1、创建Maven工程 并添加以jar包坐标依赖 <properties><maven.compiler.source>8</maven.compiler.source…

Spring Redis 启用TLS配置支持(踩坑解决)

由于线上Redis要启用TLS,搜遍了google百度也没一个标准的解决方案,要不这个方法没有,要不那个类找不到...要不就是配置了还是一直连不上redis.... 本文基于 spring-data-redis-2.1.9.RELEASE 版本来提供一个解决方案: 1.运维那边提供过来三个文件,分别是redis.crt redis.key …

设计模式 -- 解释器模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

易基因:精原干细胞移植后出生小鼠子代中的精子DNA甲基化变化机制|新研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 精原干细胞移植&#xff08;Spermatogonial stem cell transplantation&#xff0c;SSCT&#xff09;被提议作为儿童癌症幸存者的生育疗法。SSCT首先冷冻保存睾丸活检&#xff0c;然后再…

【2023 · CANN训练营第一季】应用开发深入讲解——第二章 模型推理

学习目标 学习资源 内存管理 在线课程 文档 模型推理 文档 第1节 AscendCL运行资源管理 运行资源管理概述 申请运行管理资源时&#xff0c;需按顺序依次申请&#xff1a; Device 、 Context 、 Stream &#xff0c;然后根据实际需求调用 aclrtGetRunMode 接口获取软件栈的…

黑马Redis实战项目——黑马点评笔记06 | 好友关注

黑马Redis实战项目——黑马点评笔记06 | 好友关注 1、关注和取关2、共同关注2.1 查看他人主页2.2 查询共同关注A 改造关注和取关功能B 求交集 3、关注推送3.1 Feed 流分析3.1.1、拉模式&#xff08;读扩散&#xff09;3.1.2、推模式&#xff08;写扩散&#xff09;3.1.3、推拉结…

C++ JPEG编码

依据上一篇的JPEG编码所得到的RGB信息&#xff0c;我们可以重新对RGB图片进行编码&#xff0c;也可对其他图片如BMP所得到的RGB信息进行编码,来得到*.jpg文件&#xff0c;注意我这里实现的JPEG编码不知道为啥编码出来的文件比原来大了好多。 还有要注意的地方&#xff0c;下面会…

【计算机三级网络技术】 第六篇 交换机及其配置

文章目录 IPS&#xff08;入侵防护系统&#xff09;相关知识点蓝牙服务器技术DNS 服务器WWW 服务器FTP 服务器邮件&#xff08;Winmail 邮件服务器&#xff09;生成树协议IEEEVLAN 标识的描述DHCP 服务器 IPS&#xff08;入侵防护系统&#xff09;相关知识点 1、入侵防护系统&…

迅为i.MX6ULL开发板生成 KEY 文件,并安装

使用“ssh-keygen” 生成个四个 key 文件“ssh_host_rsa_key” “ssh_host_dsa_key” “ssh_host_ecdsa_key” 和“ssh_host_ed25519_key” 。 1 在虚拟机 Ubuntu 控制台&#xff0c; “ /home/ssh/openssh-4.6p1” 目录下&#xff0c; 使用命 令“ssh-keygen -t rsa -f ssh…

帮助客户实现自助服务,企业可以打造产品知识库来解决

随着科技的不断发展&#xff0c;越来越多的企业开始将自助服务作为一种解决客户问题的方式。自助服务不仅可以提高客户满意度&#xff0c;还可以减少企业的工作量和成本。为了帮助客户实现自助服务&#xff0c;企业可以打造产品知识库来解决客户问题。本文将介绍产品知识库的定…

shell脚本----函数

文章目录 一、函数的定义1.1 shell函数:1.2函数如何定义 二、函数的返回值三、函数的传参四、函数变量的作用范围五、函数的递归六、函数库 一、函数的定义 1.1 shell函数: 使用函数可以避免代码重复使用函数可以将大的工程分割为若干小的功能模块&#xff0c;代码的可读性更…

数字农业农村解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 数字农业农村发展现状 数据基础薄弱&#xff1a;数据资源分散&#xff0c;天空地一体化数据获取能力弱&#xff1b;资源数字化、产业数字化水平不高&#xff0c;部分农业数…

“玲珑”编解码融合架构助力视频多元化需求

随着近年来 AI 技术的兴起&#xff0c;视频监控、汽车、智能家居、移动设备及数据中心等对高清视频处理有了越来越高的要求。安谋科技全新视频处理器——“玲珑”V6/V8&#xff0c;针对主流市场的视频流媒体技术进行了大量投入&#xff0c;通过一系列智能权衡实现了极大优化&am…

常用数据处理方式

文章目录 缺失值处理删除法填充法基于统计学变量填充基于插值填充基于模型填充基于预测填充 不处理 异常值处理基于统计分析的方法基于聚类的方法基于树的方法基于预测的方法 数据重采样标准化min-max标准化&#xff08;归一化&#xff09;z-score标准化&#xff08;规范化&…

基于Web的电竞赛事管理系统的设计与实现(论文+源码)_kaic

摘要 迅猛发展并日益成熟的网络已经彻底的影响了我们的方方面面。人们也确实真切的体会到了网络带给我们的便捷。本网站的设计理念在于作为一个大学生电竞赛事联盟推广网&#xff0c;就是能够尽可能详细地展示、介绍电竞赛事联盟资讯信息&#xff0c;播放视频&#xff0c;同时…

WhatsApp 营销:获得更多潜在客户和销售(一)

你需要了解客户的世界观才能进行有效的营销&#xff0c;你应该投入时间和精力来学习和实施你的业务WhatsApp营销 -因为你的客户出现在WhatsApp上&#xff0c;他们希望在那里联系&#xff0c;而不是在他们讨厌被打断的电子邮件或电话中。 SaleSmartly&#xff08;ss客服&#x…

基于磁盘的Kafka为什么这么快

基于磁盘的Kafka为什么这么快 原创 Wyman 大数据技术架构 2019-05-23 18:04 Kafka是大数据领域无处不在的消息中间件&#xff0c;目前广泛使用在企业内部的实时数据管道&#xff0c;并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储&#xff0c;但却具有…