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

这篇具有很好参考价值的文章主要介绍了Python爬虫入门之爬虫解析提取数据的四种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

基础爬虫的固定模式

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

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

· requests+BeautifulSoup

· requests+lxml

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

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


比如说我们想抓取每个新闻的标题和链接,并将其组合为一个字典的结构打印出来。首先查看HTML源码确定新闻标题信息组织形式。
Python爬虫入门之爬虫解析提取数据的四种方法
可以目标信息存在于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

})

很常规的处理方式,抓取效果如下:

· 方式二: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的方式。效果如下:

· 方式三: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方法。效果如下:
· 方式四: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模块。抓取效果如下:

很多人觉得爬虫有点难以掌握,因为知识点太多,需要懂前端、需要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 说明能正常请求,并返回网页源代码文本。

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

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理文章来源地址https://www.toymoban.com/news/detail-437638.html

到了这里,关于Python爬虫入门之爬虫解析提取数据的四种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 检测数据类型的四种方法

    一、数据类型: 1、基本数据类型:String、Number、Boolean、Null、Undefined、Symbol 、BigInt 2、引用数据类型:Object、Array、Function、Date、RegExp 二、检测数据类型的四种方法 1.typeof检测   特点:typeof只能检测基本数据类型(除了null),不能准确的检测引用数据类型。 object、array、

    2024年02月15日
    浏览(34)
  • 数据的四种基本存储方法

    数据的存储结构可用以下四种基本存储方法得到: ( 1 )顺序存储方法     该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。     由此得到的存储表示称为顺序存储结构  (Sequential Storage Structure),通常借

    2024年02月15日
    浏览(28)
  • Hive数据导出的四种方法

    hive数据仓库有多种数据导出方法,我在本篇文章中介绍下面的四种方法供大家参考: Insert语句导出、Hadoop命令导出、Hive shell命令导出、Export语句导出。 Hive支持将select查询的结果导出成文件存放在文件系统中。语法格式如下; 注意: 导出操作是一个OVERWRITE覆盖操作,慎重

    2024年01月17日
    浏览(28)
  • 【转载】Python 修改DataFrame列名的四种方法

    本文转自知乎博文Zhuang Tommy Pandas 3:如何修改columns的名称 - 知乎 (zhihu.com) @Zhuang Tommy 关于更详细的pandas DataFrame教程,可参考@Ding Jiaxiong 的博文 【Pandas入门教程】如何选择DataFrame的子集_pandas 子集-CSDN博客

    2024年02月04日
    浏览(32)
  • python 读写16bit图像的四种方法

    应对超高清、HDR等图像增强类深度学习任务和专业图片处理任务时,我们需要对16bit图像进行读取、转tensor和保存等操作,这里总结出四种python实现的方法供参考~ 1.使用 imageio ,输出图像无压缩 2.使用 openCV, 输出图像的水平分辨率和垂直分辨率被压缩 3.使用 skimage,输出图像

    2024年02月13日
    浏览(31)
  • pip安装python第三方库的四种方法

    pip install 库名 打开命令提示符【win + r】,输入cmd,在命令提示窗口输入pip install 库名, 再点击回车键【Enter】,就可以安装。当安装成功时,会提示successfully。例如,安装pytest库 使用该方法会存在由于网络不稳定时就无法安装成功的情况,遇到此情况时,可以多尝试几次,若

    2024年01月17日
    浏览(31)
  • IDEA连接MySQL数据库的四种方法

    首先右击此电脑点击管理,进入页面  再服务栏确保MySQL是正常运行状态 打开IDEA, 左边栏选择Maven Archetype,新建一个名为javaweb的新工程 进行如图编辑完成新建  在Main包下新建一个java包,右击java包进行下图操作,java包拥有新建class的权限 在java下面新建一个HelloConnection1的类,

    2024年02月12日
    浏览(39)
  • 【数据结构】-快速排序的四种方法实现以及优化

    作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 今天讲一种不一样的排序,听名字就知道这个排序不拐弯抹角的,我们来看看它又多快速,并且快速排序的前三种方法都是递归思想,

    2024年02月03日
    浏览(30)
  • 数据结构中处理散列冲突的四种方法

    开放定址法 就是一旦发生了冲突,就去寻找下一个空的散列地址 只要 散列表 足够大 空的散列地址总能找到,并将记录存入 使用该公式用于解决冲突的开放定址法称为 线性探测法 对于线性探测法,在出现冲突时,它只能晚后一步一步检测看是否有空位置 假设此时该冲突位

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包