社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python爱好者社区 • 3 年前 • 469 次点击  

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


“虫子”的第 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进阶,内容完美衔接!

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

限时下单立减50元

扫码或点击阅读原文抢购吧

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/146773
 
469 次点击