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

news/2024/7/19 9:44:58 标签: python, 爬虫, 开发语言

本文主要介绍了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.niftyadmin.cn/n/303579.html

相关文章

Linux安装canal

Linux安装canal 文章目录 Linux安装canalmsql修改1. mysql创建用户并授权2. 修改mysql的配置文件3. 重启mysql4. 检查是否打开binlog5. 查看binlog日志列表和当前正在写入的binlog canal1. 下载canal:2. 在服务器上解压3. 修改配置文件4. 启动canal5. 查看日志是否正…

蜘蛛池搭建需要多少域名?全面解析!

蜘蛛池是指为搜索引擎爬虫提供优质、可靠的页面,从而提高网站的收录和排名。在蜘蛛池搭建过程中,域名数量是一个非常重要的问题。那么,蜘蛛池搭建需要多少域名呢?本文将对这个问题进行全面解析。 首先,我们需要了解什么…

ChatGPT(GPT-4)与智能AI

ChatGPT(GPT-4) ChatGPT(GPT-4)是一种智能对话系统,它使用了最先进的自然语言处理技术,可以与用户进行自然、流畅的对话。ChatGPT采用了类似于人类思维的方式进行对话,通过对输入信息的理解和推…

把django项目部署到容器,并在本地浏览器访问

1.确保您已经安装并配置好了 Docker。如果您还没有安装 Docker,请访问 Docker 的官方网站来获取适合你的操作系统的 Docker 安装程序。 2.在 demo 项目的根目录中创建一个名为 Dockerfile 的文件,文件内容如下: FROM python:3.9ENV PYTHONU…

CSS中文字体 Unicode 编码表

一、简介 CSS(层叠样式表)是用于样式化Web页面的强大工具,它可以用来控制页面的外观和行为。在CSS中,可以使用多种字体来设置文本的外观和格式,包括中文字体。中文字体的实现需要引入相应的字体文件,并且需…

华硕笔记本系统更新后开机自动蓝屏怎么U盘重装系统?

华硕笔记本系统更新后开机自动蓝屏怎么U盘重装系统?有用户将自己的华硕笔记本进行系统升级之后,遇到了开机自动蓝屏的情况。遇到这个问题我们怎么去进行解决呢?接下来一起来看看怎么通过U盘重装系统的方法解决此问题吧。 准备工作&#xff1a…

【Linux】Linux安装tomcat(图文解说详细版)

文章目录 1、安装前置条件2、下载所需压缩包,上传到服务器3、对资源进行解压4、给防火墙添加访问端口(默认8080,在它的/conf/server.xml文件里面查看)5、然后切换到bin目录下,启动(成功效果如图&#xff09…

go-zero负载均衡算法源码阅读

负载均衡原理分析与源码解读 - go-zero开源社区 - SegmentFault 思否 指数加权移动平均法(EWMA) 一 P2C负载均衡算法 & EWMA 在go-zero中默认使用的是P2C的负载均衡算法。算法的原理:即随机从所有可用节点中选择两个节点,然后…