查看原文
其他

Python爬虫:让“蜘蛛”帮我们工作

关东升 赵大羽 博文视点Broadview 2023-04-23

互联网是一个巨大的资源库,只要方法适当,就可以从中找到我们所需的数据。对于少量的数据,可以人工去找。但是对于大量的数据,如果在获取数据之后还要进行分析,则靠人工无法完成任务,这时就需要通过计算机程序帮助我们完成任务,这种程序就叫作网络爬虫(又叫作网页蜘蛛、网络机器人)。


“虫子”的第 1 阶段工作——爬取数据

爬取数据一般指从指定的网址爬取网页中的HTML代码,爬取数据的核心是网络通信,可以使用Python官方提供的urllib.request模块实现,代码如下:

# coding=utf-8# 代码文件:code/chapter6/6.1.1.py# 爬取数据import urllib.request# 爬取数据的网址url = 'http://p.weather.com.cn/'def getHtmlString(): """ 网络请求返回HTML字符串 """ req = urllib.request.Request(url)with urllib.request.urlopen(req) as response: data = response.read() htmlstr = data.decode(encoding='utf-8', errors='ignore')return htmlstrif __name__ == '__main__': html = getHtmlString() print(html)


“虫子”的第 2 阶段工作——解析数据

BeautifulSoup 库是一个可以从HTML或XML文档中提取数据的Python库。安装BeautifulSoup库的pip指令如下:

pip install beautifulsoup4

Windows台上通过命令提示符安装BeautifulSoup库的过程如下图所示其他平台的安装过程类似这里不再赘述


解析HTML数据是通过BeautifulSoup对象实现的,BeautifulSoup对象的常用函数如下。

  • find_all(tagname):根据标签名返回符合条件的所有元素。

  • select(selector):通过CSS中的选择器查找符合条件的所有元素。

  • find(tagname):根据标签名返回符合条件的第一个元素。

  • get(key, default=None):获取标签属性的值,key表示标签属性名。

BeautifulSoup常用的属性如下。

  • title:获取当前HTML页面title属性的值。

  • text:返回标签中的文本内容。

从HTML代码中解析出图片网址的代码如下:

# coding=utf-8# 代码文件:code/chapter6/6.1.2.py# 解析数据import urllib.requestfrom bs4 import BeautifulSoup# 爬取数据的网址url = 'http://p.weather.com.cn/'def getHtmlString(): """ 网络请求返回HTML字符串 """ req = urllib.request.Request(url) with urllib.request.urlopen(req) as response: data = response.read() htmlstr = data.decode(encoding='utf-8', errors='ignore') return htmlstrdef find_imageurls(htmlstr): """从HTML代码中查找匹配的字符串""" sp = BeautifulSoup(htmlstr, 'html.parser') # 返回所有的img标签对象 imgtaglist = sp.find_all('img') # 从img标签对象列表中返回对应的src列表 srclist = list(map(lambda u: u.get('src'), imgtaglist)) # 过滤掉非.png和.jpg结尾文件的src字符串 filtered_srclist = filter(lambda u: u.lower().endswith('.png') or u.lower().endswith('.jpg'), srclist) return filtered_srclistif __name__ == '__main__': html = getHtmlString() # 返回图片列表 url_list = find_imageurls(html) # 遍历图片列表 for img_url in url_list: # 打印图片url列表 print(img_url)

“虫子”的第 3 阶段工作——下载图片

“虫子”的第3个阶段工作是存储数据。但就本例而言主要是根据图片的网址下载图片。

  1. html.parser:用Python编写的解析器,速度比较快,支持Python 2.7.3和Python3.2.2以上版本。

  2.  lxml:用C语言编写的解析器,速度很快,依赖于C库,在CPython环境下可以使用它。

  3. lxml-xml:用C语言编写的XML解析器,速度很快,依赖于C库。

  4. html5lib:HTML5解析器,通过HTML5算法解析文件,容错性好,但速度慢。


下载图片的代码如下:

# coding=utf-8# 代码文件:code/chapter6/6.1.3.py# 爬取数据import osimport urllib.requestfrom bs4 import BeautifulSoup# 爬取数据的网址url = 'http://p.weather.com.cn/'......if __name__ == '__main__': html = getHtmlString() # 返回图片列表 url_list = find_imageurls(html) # 遍历图片列表 for img_url in url_list: # 根据图片地址下载 req = urllib.request.Request(img_url) with urllib.request.urlopen(req) as response: data = response.read() # 获取图片文件名 # 例如:https://i.i8tq.com/weather2020/search/rbAd.png # 截取的文件名是“rbAd.png” # 找到最后一个“/”字符的位置 pos = img_url.rfind('/') # 截取文件名 filename = img_url[pos + 1:] # 获取图片路径 filepath = 'download/' + filename # 判断在当前文件夹下是否存在download子文件夹,如果不存在,则创建 if not os.path.exists('download'): # 创建download子文件夹 os.mkdir('download') # 保存图片 with open(filepath, 'wb') as f: f.write(data) print('下载图片:{}。'.format(filename)) print('工作完成。')

本文节选自《看漫画学Python 2:有趣、有料、好玩、好用(全彩进阶版)》

进阶版是在《看漫画学Python》的基础上讲解Python进阶的知识,如果你看过《看漫画学Python》,那么你一定很喜欢《看漫画学Python 2》。

这两本书的内容不冲突,一本讲Python入门,一本讲Python进阶,内容完美衔接!

各位漫学粉儿们不要错过呀!

当当限时四九折,快抢!

发布:刘恩惠

审核:陈歆懿

 

如果喜欢本文欢迎 在看留言分享至朋友圈 三连

 热文推荐  





▼点击阅读原文,了解本书详情~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存