Python爬虫的两套解析方法和四种爬虫实现

简介:

对于大多数朋友而言,爬虫绝对是学习python的最好的起手和入门方式。因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门。本文想针对某一网页对python基础爬虫的两大解析库(BeautifulSouplxml)和几种信息提取实现方法进行分析,以开python爬虫之初见。

基础爬虫的固定模式

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

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

requests+BeautifulSoup

requests+lxml

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

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

b41e80abd49b02e18cc79464bfc3790a3de405d3

比如说我们想抓取每个新闻的标题和链接,并将其组合为一个字典的结构打印出来。首先查看HTML源码确定新闻标题信息组织形式。

22aa8ef3ea4e0ffeb2950649ea35d940cfd16594

可以目标信息存在于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 = 'http://news.qq.com/'
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
})

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

b64356b212634581f22124281a8cff040d890c76

方式二:

requests+BeautifulSoup+find_all进行信息提取

 

# find_all 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 = 'http://news.qq.com/'
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的方式。效果如下:

2e76defa4ac94dd6787557d3d2eeb2f1644b975d

方式三:

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 = 'http://news.qq.com/'
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方法。效果如下:

460bb6b8ec006a0ac245a60b80d710994a1c0c06

方式四:

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 = 'http://news.qq.com/'
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模块。抓取效果如下:

78a76da8d235f3e752072adfc296a74c768eefdf

很多人觉得爬虫有点难以掌握,因为知识点太多,需要懂前端、需要python熟练、还需要懂数据库,更不用说正则表达式、XPath表达式这些。其实对于一个简单网页的数据抓取,不妨多尝试几种抓取方案,举一反三,也更能对python爬虫有较深的理解。长此以往,对于各类网页结构都有所涉猎,自然经验丰富,水到渠成。


原文发布时间为:2018-08-26

本文作者:鲁伟

本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。

相关文章
|
11天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
1天前
|
存储 关系型数据库 MySQL
Python搭建代理IP池实现存储IP的方法
Python搭建代理IP池实现存储IP的方法
|
1天前
|
数据采集 存储 安全
python检测代理ip是否可用的方法
python检测代理ip是否可用的方法
|
2天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
17 0
|
2天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
17 0
|
3天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
37 0
|
6天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
7天前
|
存储 JSON JavaScript
「Python系列」Python JSON数据解析
在Python中解析JSON数据通常使用`json`模块。`json`模块提供了将JSON格式的数据转换为Python对象(如列表、字典等)以及将Python对象转换为JSON格式的数据的方法。
24 0
|
8天前
|
机器学习/深度学习 人工智能 算法
|
8天前
|
安全 Python
python字典的内置方法
Python字典主要方法包括:`keys()`(返回所有键)、`values()`(返回所有值)、`items()`(返回所有键值对)、`get()`(安全取值,键不存在时返回默认值)、`setdefault()`(设置默认值)、`update()`(合并字典)、`pop()`(删除并返回值)、`clear()`(清空字典)、`copy()`(浅拷贝)、`fromkeys()`(新建字典并设置默认值)、`popitem()`(随机删除键值对)。
8 0

推荐镜像

更多