前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python怎么使用爬虫获取网页内容

Python怎么使用爬虫获取网页内容

作者头像
科技新语
发布于 2024-08-09 10:02:39
发布于 2024-08-09 10:02:39
25600
代码可运行
举报
运行总次数:0
代码可运行

1、网页是什么?

浏览器画网页的流程,是浏览器将用户输入的网址告诉网站的服务器,然后网站的服务器将网址对应的网页返回给浏览器,由浏览器将网页画出来。

这里所说的网页,一般都是一个后缀名为 html 的文件。

网页文件和我们平时打交道的文件没什么不同,平时我们知道 Word 文件,后缀名为 .doc, 通过 Word 可以打开。图片文件后缀名为 .jpg,通过 Photoshop 可以打开;而网页则是后缀名为 .html,通过浏览器可以打开的文件。

网页文件本质也是一种文本文件,为了能够让文字和图片呈现各种各样不同的样式,网页文件通过一种叫作 HTML 语法的标记规则对原始文本进行了标记。

(1)手动下载网页

我们以煎蛋网为例体会一下网页的实质,使用浏览器打开这个链接jandan.net/可以看到如下界面。可以…

在空白区域点击右键,另存为,并在保存类型中选择:仅 HTML。

接下来回到桌面,可以看到网页已经被保存到桌面了,后缀名是 html,这个就是我们所说的网页文件。

(2)网页内容初探

我们右键刚下载的文件,选择用 VS Code 打开,打开后的文件内容如下图所示。

这就是网页文件的实际内容(未被浏览器画出来之前)。现在先不用管看不懂的代码,还记得我们看到的第一条新闻吗?“今日好价………………”。(你的暗号)

我们在 VS Code 中通过 CTRL + F 调出搜索面板,搜索“今日好价”(暗号)。可以看到成功找到了这条新闻,虽然被很多不认识的代码包围,但这也可以确定,我们看到的煎蛋网的主页确实就是这个 html 文件。

2、如何实现下载普通网页?

Python 以系统类的形式提供了下载网页的功能,放在 urllib3 这个模块中。这里面有比较多的类,我们并不需要逐一都用一遍,只需要记住主要的用法即可。

(1)获取网页内容

还是以煎蛋网为例。在我们打开这个网页的时候,排在第一的新闻是:“天文学家首次见证黑洞诞生”。

煎蛋又更新了新的新闻,你记住你当时的第一条新闻题目即可。我们待会儿会在我们下载的网页中搜索这个标题来验证我们下载的正确性。

下面开始,打开vscode,输入如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码# 导入 urllib3 模块的所有类与对象

import urllib3



# 将要下载的网址保存在 url 变量中,英文一般用 url 表示网址的意思

url = "http://jandan.net/p/date/2021/03/23"



# 创建一个 PoolManager 对象,命名为 http

http = urllib3.PoolManager()



# 调用 http 对象的 request 方法,第一个参数传一个字符串 "GET"

# 第二个参数则是要下载的网址,也就是我们的 url 变量

# request 方法会返回一个 HTTPResponse 类的对象,我们命名为 response

response = http.request("GET", url)



# 获取 response 对象的 data 属性,存储在变量 response_data 中

response_data = response.data



# 调用 response_data 对象的 decode 方法,获得网页的内容,存储在 html_content 

# 变量中

html_content = response_data.decode()



# 打印 html_content

print(html_content)

上述代码就完成了一个完成的网页下载的功能。其中有几个额外要注意的点:

  • 我们创建 PoolManager的时候,写的是 urllib3.PoolManager,这里是因为我们导入了 urllib3 的所有类与函数。所以在调用这个模块的所有函数和类的前面都需要加模块名,并用点符号连接。
  • response 对象的 data 属性也是一个对象,是一个 bytes 类型的对象。通过调用 decode 方法,可以转化成我们熟悉的字符串。

执行上述代码,可以看到打印出了非常多的内容,而且很像我们第一部分手动保存的网页,这说明目前 html_content 变量中保存的就是我们要下载的网页内容。

(2)将网页保存到文件

现在 html_content 已经是我们想要的网页内容,对于完成下载只差最后一步,就是将其保存成文件。其实这一步已经和保存网页无关的,而是我们如何把一个字符串保存成一个文件。

Python 中,读取文件和保存文件都是通过文件对象来完成的。接下来,我们通过实际的例子来了解这个技术。

新建 Cell,输入以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码# 调用 open 函数,三个参数都是字符串类型,第一个参数为要操作的文件名

# 第二个参数代表模式,w 表示写入文件,r 表示读取文件

# 第三个参数表示编码格式,一般有中文的认准 utf-8 就好

# open 函数返回一个文件对象,我们存储在 fo 变量中

fo = open("jiandan.html","w", encoding="utf-8")

# 调用文件对象的 write 方法,将我们上面存储着网页内容的字符春变量,html_content 

# 作为参数

fo.write(html_content)

# 关闭文件对象

fo.close()

执行完上述代码后,可以在 VS Code 的左侧边栏中看到,文件夹下多了一个 jiandan.html 的文件,这个就是我们用刚才 Python 代码保存的文件。

打开就可以看到熟悉的网页内容了。

(3)让我们的代码更加通用

刚才我们在两个 cell 中分别实现了将网页保存成一个字符串,以及将字符串保存为一个文件。如果我们要抓取新的网页,要么直接修改之前的代码,要么就需要拷贝一份代码出来。

这两种方式都不是很好,基于我们之前了解的内容,对于有一定通用度的代码我们可以将其改写为函数,来方便后续使用。

改写之后的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码# 第一个函数,用来下载网页,返回网页内容

# 参数 url 代表所要下载的网页网址。

# 整体代码和之前类似

def download_content(url):

    http = urllib3.PoolManager()

    response = http.request("GET", url)

    response_data = response.data

    html_content = response_data.decode()

    return html_content

# 第二个函数,将字符串内容保存到文件中

# 第一个参数为所要保存的文件名,第二个参数为要保存的字符串内容的变量

def save_to_file(filename, content):

    fo = open(filename,"w", encoding="utf-8")

    fo.write(content)

    fo.close()

url = "http://jandan.net/"

# 调用 download_content 函数,传入 url,并将返回值存储在html_content 

# 变量中

html_content = download_content(url)

# 调用 save_to_file 函数,文件名指定为 jiandan.html, 然后将上一步获得的

# html_content 变量作为第二个参数传入

save_to_file("jiandan.html", html_content)

这样改写之后,我们在抓取新的网页的时候就可以使用 download_content 函数和 save_to_file 函数快速完成了,不再需要去写里面复杂的实现。

3、如何实现动态网页下载?

urllib3 很强大,但是却不能一劳永逸地解决网页下载问题。对于煎蛋这类普通网页,urllib3 可以表现更好,但是有一种类型的网页,它的数据是动态加载的,就是先出现网页,然后延迟加载的数据,那 urllib3 可能就有点力不从心了。

我们以豆瓣的电视剧网页为例:

现在,我们来使用刚才定义的两个函数来下载一下这个网页。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码url = "https://movie.douban.com/tv"

html_content = download_content(url)

save_to_file("douban_tv.html", html_content)

代码很简单,就是把豆瓣电视剧的网页下载到 douban_tv.html 这个文件中。执行代码,可以在 VS Code 左边的文件夹视图中看到成功生成了douban_tv.html 这个文件,这说明网页已经下载成功。

现在我们在 VS Code 中打开这个网页,搜索上图中出现的电视剧:“山河令”。这次却神奇的搜不到了,事实上,你会发现我们在网页看到的电视剧名字都搜不到。

为什么我们明明下载到了网页但是却搜不到电视剧呢?造成这个现象的原因是豆瓣电视剧网页中的电视剧列表的部分是动态加载的,所以我们用 urllib3 去直接下载,只能下载到一个壳网页,没有里面的列表内容。这种网页内部的数据是动态加载的网页,我们统一称之为动态网页。

动态网页应该怎么抓取呢?回过头去想,一个网页不管再怎么动态,最终都是要展示给用户看的,所以浏览器应该是最知道网页内容是什么的角色。如果我们可以使用代码控制浏览器来帮我们下载网页,应该就可以解决动态网页的抓取问题。

接下来我们就介绍使用 Python 来控制浏览器的利器:selenium。

(1)安装selenium

selenium 不属于 Python 的系统库,所以要使用这个库需要先进行安装。

我们安装 Python 的库一般通过 Anaconda 的命令行。既然是模拟浏览器,我们的电脑首先要先有浏览器。这里我们以 Chrome 为例。所以在一切开始之前,你需要确保你电脑上安装了 Chrome。

在准备环节,我们已经安装了 Anaconda 套件,现在我们去开始菜单(或者在桌面状态下按 Win 键)找到 Anaconda 3 文件夹,并点击文件夹中的 Anaconda Prompt 程序。Mac 用终端即可。

打开后会出现一个命令行窗口,在这个命令行,我们可以输入 conda install xxx 来安装 Python 的扩展库。

比如在这个例子中,我们输入 conda install selenium,回车。界面会变得如下所示,询问我们是否要确认安装,输入 y 继续回车就可以。

安装完毕后命令行窗口会回到待输入命令的状态,此时就可以关闭了。

回到 VS Code,新建 Cell,输入以下的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
csharp 代码解读复制代码# 从 selenium 库中导入 webdriver 类

from selenium import webdriver

# 创建一个 Chrome 浏览器的对象

brow = webdriver.Chrome()

# 使用 Chrome 对象打开 url(就是刚才豆瓣电视剧的 url)

brow.get(url)

运行代码,会自动打开一个 Chrome 浏览器的窗口,并展示 url 对应的网页。同时还会有一个提示,说明这个浏览器窗口是在被程序控制的,如下图所示。

如果代码运行出错,提示找不到 chromedriver。那说明你安装的 selenium 版本缺少 chromedriver, 可以按如下方式操作:

  • 重新按照刚才的方法打开 Anaconda Prompt,输入 pip install --upgrade --force-reinstall chromedriver-binary-auto 回车执行安装。
  • 在上面的代码增加一行 import chromedriver_binary 添加完毕后如下所示。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python 代码解读复制代码# 从 selenium 库中导入 webdriver 类

from selenium import webdriver

# 导入 chromedriver

import chromedriver_binary

# 创建一个 Chrome 浏览器的对象

brow = webdriver.Chrome()

# 使用 Chrome 对象打开 url(就是刚才豆瓣电视剧的 url)

brow.get(url)

(2)使用selenium下载动态网页

如果刚才的代码已经运行成功并打开了 Chrome 的界面的话,那我们离最后的下载动态网页已经不远了。在我们通过 Chrome 对象打开了一个网页之后,只需要访问 Chrome 对象的 page_source 属性即可拿到网页的内容。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码# 从 selenium 库中导入 webdriver 类

from selenium import webdriver

# 创建一个 Chrome 浏览器的对象

brow = webdriver.Chrome()

# 使用 Chrome 对象打开 url(就是刚才豆瓣电视剧的 url)

brow.get(url)

# 访问 Chrome 对象的 page_source 属性,并存储在 html_content 变量中

html_content = brow.page_source

# 调用我们之前定义的 save_to_file 函数,这次我们保存为 double_tv1.html

# 要保存的内容就是 html_content

save_to_file("douban_tv1.html", html_content)

运行代码,可以看到 Chrome 被打开并加载网页,等电视剧列表都加载完之后,在 VS Code 中可以看到 double_tv1.html 也被成功创建。

这个时候我们去这个文件搜索山河令,发现已经有结果了,在这个 html 文件中已经有了所有电视剧的信息。

至此,我们也实现了对于动态内容网页的下载功能。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 万能代码模版:爬虫代码篇
很多同学一听到 Python 或编程语言,可能条件反射就会觉得“很难”。但今天的 Python 课程是个例外,因为今天讲的 Python 技能,不需要你懂计算机原理,也不需要你理解复杂的编程模式。即使是非开发人员,只要替换链接、文件,就可以轻松完成。
AI悦创
2021/09/14
6.4K0
Python 万能代码模版:爬虫代码篇
Python爬虫:结合requests和Cheerio处理网页内容
Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一。requests库是Python中用于发送HTTP请求的第三方库,它简单易用,功能强大,能够方便地处理各种网络请求。而Cheerio库则是一个用于解析HTML和XML文档的库,它提供了类似于jQuery的接口,使得对网页元素的选择和操作变得极为便捷。将这两个库结合起来,我们可以轻松地实现对网页内容的抓取和解析。
小白学大数据
2025/01/15
1370
Python爬虫:结合requests和Cheerio处理网页内容
Python爬虫:结合requests和Cheerio处理网页内容
一、前言 Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一。requests库是Python中用于发送HTTP请求的第三方库,它简单易用,功能强大,能够方便地处理各种网络请求。而Cheerio库则是一个用于解析HTML和XML文档的库,它提供了类似于jQuery的接口,使得对网页元素的选择和操作变得极为便捷。将这两个库结合起来,我们可以轻松地实现对网页内容的抓取和解析。
小白学大数据
2025/01/14
1840
利用Selenium和PhantomJS提升网页内容抓取与分析的效率
在互联网数据驱动的时代,网页内容抓取(Web Scraping)是获取和分析公开数据的重要手段。然而,现代网页普遍采用动态渲染、反爬机制和复杂JavaScript逻辑,传统工具(如requests+BeautifulSoup)难以应对。本文介绍如何结合‌Selenium‌和‌PhantomJS‌(注:PhantomJS已停止维护,但技术原理仍具参考性,推荐替代方案为无头Chrome/Firefox)实现高效动态网页抓取,并提供完整的代码实现和优化策略。
小白学大数据
2025/03/14
1010
6个强大且流行的Python爬虫库,强烈推荐!
Python中有非常多用于网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。
派大星的数据屋
2024/07/17
1.8K0
6个强大且流行的Python爬虫库,强烈推荐!
Python爬虫如何获取JavaScript动态渲染后的网页内容?
在现代Web开发中,许多网站采用JavaScript动态渲染技术(如React、Vue、Angular等框架)来加载数据,传统的HTTP请求(如Python的requests库)只能获取初始HTML,而无法捕获JS执行后的内容。因此,爬取这类动态网页需要模拟浏览器行为,等待JavaScript执行完成后再提取数据。
小白学大数据
2025/05/12
1600
使用Python库实现自动化网页截屏和信息抓取
在网络时代,网页截屏和信息抓取是一项常见而重要的任务。利用Python的强大库,我们可以轻松实现自动化的网页截屏和信息抓取,为数据分析、监测和展示提供了便利。今天就给大家介绍一下如何使用Python库实现自动化网页截屏和信息抓取的相关步骤,并分享一些简单实用的代码示例,一起学习一下吧。
华科云商小彭
2023/10/08
2K0
使用Python库实现自动化网页截屏和信息抓取
Jsoup 爬虫:轻松搞定动态加载网页内容
在深入探讨如何使用 Jsoup 获取动态加载内容之前,我们需要先了解动态加载网页的原理。传统的静态网页内容在服务器响应时已经完整生成,而动态加载的网页则通过 JavaScript 在客户端动态生成内容。这些内容可能通过以下几种方式实现:
小白学大数据
2025/03/11
2130
网页内容获取:Scala自动化脚本的实现
对于开发者和数据科学家来说,自动化获取网页内容是一个常见的需求。Scala,作为一种多范式编程语言,以其强大的函数式编程特性和并发处理能力,成为了编写高效自动化脚本的理想选择。本文将介绍如何使用Scala结合Selenium WebDriver来自动化获取网页内容。
小白学大数据
2024/10/14
1930
Web Scraping指南: 使用Selenium和BeautifulSoup
在当今信息时代,数据是无处不在的宝贵资源。对于许多企业、研究人员以及开发者来说,从互联网上获取准确且有价值的数据变得越来越重要。而Web scraping(网络爬虫)技术则成为了实现这一目标的关键工具。
华科云商小孙
2023/09/11
3560
2024,Python爬虫系统入门与多领域实战指南fx
在数据驱动的今天,Python爬虫技术已成为获取网络数据的重要手段。本文将从Python爬虫的基础知识入手,逐步深入到多领域的实战应用,帮助读者构建一个完整的爬虫系统。
用户11138550
2024/06/23
5150
爬虫实战:爬虫之 web 自动化终极杀手 ( 上)
serena
2017/09/19
5K0
爬虫实战:爬虫之 web 自动化终极杀手 ( 上)
使用Python调用JavaScript进行网页自动化操作
随着互联网技术的飞速发展,网页自动化操作在数据抓取、用户界面测试、内容管理等多个领域变得越来越重要。Python作为一种流行的编程语言,因其简洁的语法和强大的库支持,成为了许多开发者进行网页自动化的首选工具。然而,面对动态生成的网页内容,传统的HTTP请求库(如requests)就显得力不从心。此时,JavaScript的作用就显得尤为重要。本文将介绍如何使用Python调用JavaScript进行网页自动化操作。
小白学大数据
2024/08/28
3210
爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法
随着互联网的发展,许多网站开始采用动态网页来呈现内容。与传统的静态网页不同,动态网页使用JavaScript等脚本技术来实现内容的动态加载和更新。这给网页爬取带来了一定的挑战,因为传统的爬虫工具往往只能获取静态网页的内容。本文将介绍如何使用Selenium和API来实现动态网页的爬取
全栈若城
2024/02/29
2.7K0
爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法
使用Python和Selenium自动化爬取 #【端午特别征文】 探索技术极致,未来因你出“粽” # 的投稿文章
本文章将介绍如何使用Python的Selenium库和正则表达式对CSDN的活动文章进行爬取,并将爬取到的数据导出到Excel文件中。
全栈若城
2024/02/29
2340
使用Python和Selenium自动化爬取 #【端午特别征文】 探索技术极致,未来因你出“粽” # 的投稿文章
Python写爬虫爬妹子
最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据、解析数据、保存数据。下面一一来讲。
六月的雨
2020/03/27
7290
实战|Python轻松实现动态网页爬虫(附详细源码)
事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做《实战|手把手教你用Python爬虫(附详细源码)》。发出去不到一天,一名从业10年的王律师找到了我,我虽然同意了他的微信申请,但内心是按奈不住的慌张。
小小詹同学
2020/10/10
1.6K0
实战|Python轻松实现动态网页爬虫(附详细源码)
《Python网络爬虫与数据挖掘小课堂》——part2
在介绍爬虫及爬取网页或图片之前,大家需要知道如何使用pip快速方便的安装第三方Python库。
IT技术小咖
2019/11/24
8900
爬虫篇 | 不会这几个库,都不敢说我会Python爬虫
最近整理一个爬虫系列方面的文章,不管大家的基础如何,我从头开始整一个爬虫系列方面的文章,让大家循序渐进的学习爬虫,小白也没有学习障碍.
龙哥
2019/10/14
9340
不会这几个库,都不敢说我会Python爬虫
requests库应该是现在做爬虫最火最实用的库了,非常的人性化。有关于它的使用我之前也写过一篇文章 一起看看Python之Requests库 ,大家可以去看一下。
Python进击者
2019/10/10
5850
推荐阅读
相关推荐
Python 万能代码模版:爬虫代码篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验