分享好友 最新动态首页 最新动态分类 切换频道
5分钟轻松学Python:4行代码写一个爬虫
2024-12-27 02:35

 

5分钟轻松学Python:4行代码写一个爬虫

编程不是科学,而是一门手艺

Python 具有丰富的解析库和简洁的语法,所以很适合写爬虫。这里的爬虫指的是爬取网页的“虫子”。简而言之,爬虫就是模拟浏览器访问网页,然后获取内容的程序。

爬虫工程师是个很重要的岗位。爬虫每天爬取数以亿计的网页,供搜索引擎使用。爬虫工程师们当然不是通过单击鼠标右键并另存的方式来爬取网页的,而会用爬虫“伪装”成真实用户,去请求各个网站,爬取网页信息。

本文选自《Python基础视频教程》一书,每一小节都给出了视频讲解,配合视频微课带你快速入门Python。

 


( 正 文

1、初识 HTTP :4行代码写一个爬虫

超文本传输协议(HyperText Transfer Protocol,HTTP)是网络中最常见的网络传输协议。常见网站的网址大都以 http 开头或者以 https 开头,https 在 http 基础上做了一层加密的协议。

通常情况下,在浏览器里给服务器发送 http 或 https 请求,服务器拿到请求后会向浏览器返回相应的结果(response,浏览器解析、润色后呈现给用户。

写爬虫没有那么难,下面用 4 行代码写一个爬虫。在 first_spider.py 文件中写入以下代码

1from urllib import request
2page = request.urlopen('http://www.yuqiaochuang.com/')
3ret = page.read()
4print(ret)

python first_spider.py 运行后,会看到屏幕上打印出了页面的源代码,这短短 4行就是一个爬虫。

从本质上来说,这和打开浏览器、输入网址去访问没有什么区别,只不过后者是借助浏览器获取页面内容,而爬虫则是用原生的 HTTP 获取内容。屏幕上打印的源代码和在 Chrome 浏览器中单击鼠标右键,然后在弹出的快捷菜单中单击“查看网页源代码”是一样的。

 

在此可以看到,网页的源代码是由很多标签组成的。

 

尖括号包围的就是一个标签,如<head>、<body>和<div>。标签内可以有属性,例如<html lang="zh-CN">,有一个值为"zh-CN"的 lang 属性,表示语言是中文。标签通常是成对出现的,例如,<title>Python 教程 - 雨敲窗个人博客</title>。“Python 教程 - 雨敲窗个人博客”被<title>和</title>包括起来,包括起来的部分被称为标签的内容。

2、正则表达式

前面用 4 行代码写了一个爬虫,运行成功后可以看到爬取的内容。不过,这却是一个大块的内容,如果想提取其中的某些字段该怎么办

常用的做法就是用正则表达式(Regular Expression)提取。

对初学编程的人来说,很难理解正则表达式是“何方神圣”。其实大家可以把正则表达式当作一个提取器来看,通过制定一些规则,从字符串中提取出想要的内容。

下面先看看正则表达式的几个简单用法。在regular_expression.py 文件中写入以下代码

1import re # 正则表达式的包
2
3m = re.findall("abc", "aaaaabcccabcc")
4print(m)
5m = re.findall("d", "abc1ab2c")
6print(m)
7m = re.findall("dddd", "123abc1234abc")
8print(m)
9m = re.findall(r"<div>(.*)</div>", "<div>hello</div>")
10print(m)
11m = re.findall(r"<div>(.*)</div>", "<div>hello</div><div>world</div>")
12print(m)
13m = re.findall(r"<div>(.*?)</div>", "<div>hello</div><div>world</div>")
14print(m)

python regular_expression.py 的运行结果如下

1['abc', 'abc']
2['1', '2']
3['1234']
4['hello']
5['hello</div><div>world']
6['hello', 'world']

首先,需要“import re”,以引用正则表达式模块,这样才能使用正则表达式库中的方法。

之后,上述代码中的 m = re.findall("abc", "aaaaabcccabcc") 从"aaaaabcccabcc"中提取出"abc",返回的 m 是一个列表,里面有两个'abc'。

m = re.findall("d", "abc1ab2c") 从"abc1ab2c"中提取出单个数字"d"表示提取的目标字符是数字,返回的结果是['1', '2'] 。

m = re.findall("dddd", "123abc1234abc")提取 4 个连续的数字,返回的结果是['1234']。

m = re.findall(r"<div>(.*)</div>", "<div>hello</div>")从"<div>hello</div>"中提取出<div>和</div>中间的内容,括号括起来就表示提取括号中的内容,“.”表示可以匹配任何字符,“*”表示可以匹配任意多个字符,返回的结果是['hello']。

m = re.findall(r"<div>(.*)</div>", "<div>hello</div><div>world</div>")从"<div> hello</div><div>world</div>" 中 提 取 div 中 的 内 容 , 返 回 的 结 果 是 ['hello</div> <div>world']。与上一行的提取规则相同,为什么没有单独提取出 hello 和 world 呢?因为正则表达式默认用的是贪婪匹配,所谓贪婪匹配就是能匹配多长就匹配多长。"<div>hello</div><div>world</div>"就从头匹配到了末尾,提取出来一个大长串。

m = re.findall(r"<div>(.*?)</div>", "<div>hello</div><div>world</div>") 在括号中加入一个“?”就表示以非贪婪匹配去提取,即能匹配多短就匹配多短,所以提取出来的结果是['hello', 'world']。

结合前面的几个例子,可以总结出正则表达式中最常用的 findall 方法的用法。第一个参数是定义的提取语法,第二个参数是原始字符串。返回的是一个列表,列表里是符合提取规则的字符串。

关于正则表达式更详细的语法,大家可以借助搜索引擎,搜索“菜鸟教程正则表达式”。

3、爬取静态页面的网站

还 记 得 前 面 写 的 那 个 只 有 4 行 代 码 的 爬 虫 吗 ?它 爬 取 了 “ http://www. yuqiaochuang.com”整个页面的内容。在学过正则表达式之后,就可以提取想要的内容。

还是以爬取这个博客为例,提取这个博客上文章列表的标题。

在爬取一个网站前,通常要先分析一下这个网站是否是静态页面。静态页面是指,网站的源代码里包含所有可见的内容,也就是所见即所得。常用的做法是,在浏览器中单击鼠标右键,然后在弹出的快捷菜单中选择“显示网页源代码”,推荐使用 Chrome 浏览器。

 

类似上图中的代码,就是网页的源代码,这里能够看到该博客中文章的标题和网址。

接下来使用正则表达式提取各标题。前面那个只有 4 行代码的爬虫用的是标准库里的urllib 库。推荐使用 requests 库,其具有更强大、更易用的功能。使用 pip 安装,在 PowerShell 命令行窗口中输入以下命令

1pip install requests

 

上述代码的前两行先将要使用的库“import”进来,然后调用 requests 库中的 get方法获取页面(page)。之后使用 re.findall 方法提取所有的标题,page.text 即页面的源代码内容。将页面中以“<p><a.*>”开头、“</a></p>”结尾的标题提取出来。

 

若欲了解更多与 requests 库相关的资料,可以借助搜索引擎,搜索“python requests”查看具体用法。

4、beautifulsoup4

beautifulsoup4 也是一个 Python 的第三方库,提供解析网页的功能。其有些类似于正则表达式,但是比正则表达式的语法更加优雅和便利。

在 PowerShell 命令行窗口中输入以下命令安装 beautifulsoup4

1pip install beautifulsoup4

 

还是以“http://www.yuqiaochuang.com”的网页源代码为例,提取这些文章的标题和链接。在 blog_spider_use_bs4.py 文件中写入以下代码

1from bs4 import BeautifulSoup
2import requests
3page = requests.get('http://www.yuqiaochuang.com/')
4soup = BeautifulSoup(page.text, features="html.parser")
5all_title = soup.find("div", "entry-content").find_all("a")
6for title in all_title:
7 print(title["href"], title.string)

“from bs4 import BeautifulSoup ”将 BeautifulSoup 引 进 程 序 。

“ soup = BeautifulSoup(page.text, features="html.parser")”声明了一个解析结构 soup。这里解析的是爬取的网页源代码 page.text;features 指定了“html.parser”这个默认的解析器。

在此可以看到,想爬取的标题都在 class 是“entry-content”的 div 块中。“soup.find("div", "entry-content")”用于提取 class 是“entry-content”的 div 块。紧接着调用 find_all,爬取所有标题的标签。find_all 方法返回的是一个列表,这个列表中的元素是符合查找条件的标签。

然后写一个循环,把标题的标签打印下来。通过调用 title["href"]可以获取标签中属性的值—链接。title.string 则是获取标签中的内容。

 

5、爬取图片

如果网站中仅有枯燥的文字,则很难吸引用户持续观看,所以,好的网站都是图文并茂的。如果想将图片也爬取下来,该怎么办呢?爬虫当然也可以爬取图片,就像在用浏览器访问网站时,可以在图片上单击鼠标右键,然后在弹出的快捷菜单中选择“另存为”选项去下载图片一样。

利用 requests 库也可以抓取图片。还是以爬取“http://www.yuqiaochuang.com”为例,这次爬取网站左上角的图片。在左上角的图片上面单击鼠标右键,接着在弹出的快捷菜单中选择“检查”。

 

在此可以看到,浏览器下方区域出现了一个工具栏,里面突出显示的部分就是图片地址的网页源代码。

 

在此可以看到,图片是以“img”标签开头的。这个“img”标签在 class 是“profile”的 div 中,因此可以使用 requests+beautifulsoup4 提取图片的地址。

在 image_spider.py文件中写入以下代码

1from bs4 import BeautifulSoup
2import requests
3
4page = requests.get('http://www.yuqiaochuang.com/')
5soup = BeautifulSoup(page.text, features="html.parser")
6img = soup.find("div", "profile").find("img")
7print(img["src"])

python image_spider.py 的运行结果如图下。

 

soup.find("div", "profile").find("img") 直接提取了 img 标签,然后打印 img 标签中的 src 字段,在此可以看到图片地址被提取了出来。但是,你有没有发现这个链接地址似乎少了一些前缀

没错,少了"http://www.yuqiaochuang.com"。有些网站的图片会省略前缀,在爬取时补上即可。接下来正式爬取图片,在 image_spider.py 文件中写入以下代码

1from bs4 import BeautifulSoup
2import requests
3
4page = requests.get('http://www.yuqiaochuang.com/')
5soup = BeautifulSoup(page.text, features="html.parser")
6img = soup.find("div", "profile").find("img")
7
8image_url "http://www.yuqiaochuang.com+ img["src"]
9img_data = requests.get(image_url)
10img_file "image.png"
11
12f = open(img_file, 'wb')
13f.write(img_data.content)
14f.close()

python image_spider.py 运行后,可以看到当前文件夹下多了一个“image.png”图片文件。

 

在获取图片地址后,调用 requests 的 get 方法,获取图片的请求数据,然后调用写文件的方法,将图片数据写入到文件中。

前面爬取文字时,调用的是 text 字段,为什么这里变成了 content 字段呢

这是因为 content 是最原始的数据,二进制的数据流;而 text 则是经过编码的数据。在写文件时,参数也不是'w',而是'wb'。'wb'的意思是,写入的数据是二进制数据流,而不是经过编码的数据。爬取图片和爬取文字的本质,都是根据网页链接发送请求,然后获取内容,只不过图片需要用二进制的形式保存到本地文件中。

—— 完 ——

对编程充满向往和好奇,却不知如何上手吗

博文视点学院精品课程【每天5分钟:Python基础视频教程(书+课)】带你打开编程世界的大门

 

最新文章
温州SEO整站优化攻略,揭秘提升网站排名与用户体验的关键技巧
温州SEO整站优化,助力网站排名与用户体验双重提升。通过精准关键词布局、内容优化、技术优化等多维度策略,实现搜索引擎友好,提升用户粘性,助力企业实现网络营销目标。掌握SEO优化秘诀,让网站在竞争激烈的市场中脱颖而出。随着互联网的
PDF文件转PPT免费工具用福昕?怎么用福昕将PDF转为PPT?
在众多数字文档格式中,PPT(PowerPoint)格式以其独特的优势成为了许多人的首选。相较于PDF格式,PPT格式具有更强的编辑和修改功能,使得用户在制作过程中能够灵活地调整和改变内容。无论是在添加、删除某些内容,还是在调整幻灯片的布局和
支付宝逾期多久会转第三方的解决方法是什么
在当今的互联网时代支付宝作为我国领先的第三方支付平台为广大客户提供了便捷的支付服务。在利用支付宝的期间逾期还款难题时有发生。本文将围绕支付宝逾期多久会转第三方的应对方法实施探讨帮助客户更好地熟悉逾期还款的后续影响及应对策略
苹果6肿么戴图片 截屏快捷键
苹果6sp怎么截屏快捷键1、快捷键截屏:同时按下iPhone6S Plus【电源键】和【Home键】即可。2、辅助触控截屏:进入系统设置菜单,然后依次点击【辅助功能】-【触控】-【辅助触控】,打开【辅助触控】功能;在【辅助触控中】将【轻点两下】设
萨宝智能锁快速售后24小时人工400-(问题解决) - 农业 - 百科知识-蓝心网
萨宝智能锁售后24小时维修服务热线:400-658-8618。萨宝智能锁全市各区售后服务点热线号码。☎:400-658-8618萨宝智能锁售后服务,秉承“诚信为本、客户至上”的服务态度和“以客户为中心”的服务指导思想,不仅真诚地为用户提供先进、高质
Red Giant Magic Bullet Suite For Mac v2024.0.1 红巨星调色插件
对于M1/M2/M3/M4芯片的电脑,如果软件官方未兼容 M1/M2/M3/M4,可以使用 Rosetta2 转译运行。在Apple Silicon ARM Mac电脑上安装Rosetta 2 运行intel应用苹果自家的M1和M2/M3/M4芯片都是ARM架构,所以M1和M2/M3/M4是完全通用的,未来就算有
罗定终于等到了!会“自动驾驶”的AI手机亮相天润广场!
笃行致远 遇见未来罗定荣耀销服一体店正式亮相啦!罗定天润广场 1F12月14日 | 试营业中12月15日 | 盛大开业新店开业,三重大礼等你来拿!One·荣耀简介·- HONOR -荣耀(HONOR),成立于2013年,荣耀是全球领先智能终端提供商,致力于构建
用AI生成超逼真美女写真:搜狐简单AI完全指南
在这个时代,科技的进步让我们很好地记录生活的点滴,而AI技术的崛起更是让每一个人都能成为创作者。你是否曾想过,一张栩栩如生的美女写真,可以只通过几次点击就能生成?让我们一起深入探讨一下AI生成美女写真背后的技术,以及如何使用这
抖音直播时没人气怎么办,如何提高直播间热度?
1、请求熟人亲朋好友、同事、同学、家人,你能够找到的人,都拉到你的直播间来。让他们来帮忙增加你直播间的基础人气。2、小号协助小号是我们能自己控制的直播间在线人数,可以避免观众进来后没人评论的尴尬。开启小号后可以在评论区留言增
从机器幻觉到智能幻觉
机器幻觉与智能幻觉主要是关于人工智能(AI)系统在处理信息和生成输出时,可能会产生的错误认知或“幻觉”现象。1. 机器幻觉在早期的计算机科学中,“机器幻觉”通常指的是计算机在进行数据处理时,出现了错误的输出或意外的结果。这类“
相关文章
推荐文章
发表评论
0评