Python网络爬虫(数据解析-bs4模块)
一、实现数据爬取流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据
- 数据解析
- 进行持久化存储
在持久化存储之前需要进行指定数据解析。因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。
二、BeautifulSoup环境安装
环境配置
- 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个文件夹 pip (4)在pip文件夹里面新建一个文件叫做 pip.ini ,内容写如下即可 [global] timeout = 6000 index-url = https://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun.com
- linux (1)cd ~ (2)mkdir ~/.pip (3)vi ~/.pip/pip.conf (4)编辑内容,和windows一模一样
环境安装
- 需要安装:
# 安装BeautifulSoup
pip install bs4
# bs4在使用时候需要一个第三方库,把这个库也安装一下
pip install lxml
三、bs4基础使用
注意:
- lxml就是一款解析器
- find_all与select返回结果是复数形式(列表)
使用流程: - 导包:from bs4 import BeautifulSoup - 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容 (1)转化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml') (2)转化网络文件: - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml') (3)打印soup对象显示内容为html文件中的内容
基础巩固: (1)根据标签名查找 - soup.a 只能找到第一个符合要求的标签
- soup.div 只能找到第一个div标签
(2)获取属性 - soup.a.attrs 获取a所有的属性和属性值,返回一个字典 - soup.a.attrs['href'] 获取href属性 - soup.a['href'] 也可简写为这种形式
(3)获取内容 - soup.a.string # string获取的是标签中直系的文本内容 - soup.a.text # text获取的是当前标签下所有文本内容,包括子标签 - soup.a.get_text() 【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
(4)find:找到第一个符合要求的标签 - soup.find('a') 找到第一个符合要求的 - soup.find('a', title="xxx") 获取title=xxx的第一个标签 - soup.find('a', alt="xxx") h获取alt=xxx的第一个标签 - soup.find('a', class_="xxx") ... - soup.find('a', id="xxx") ...
(5)find_all:找到所有符合要求的标签 - soup.find_all('a') - soup.find_all(['a','b']) 找到所有的a和b标签 - soup.find_all('a', limit=2) 限制前两个
(6)根据选择器选择指定的内容 - soup.select('#tang') - 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器 - 层级选择器: select(".tang li") #class=tang标签下面的所有li标签,包含所有层级 div > p > a > .lala # 只能是下面一级 【注意】select选择器返回永远是列表,需要通过下标提取指定的对象
总结:层级选择器定位返回总是一个复数(列表)
-
-
- 类选择器,id选择器,标签选择器,层级选择器
- 层级选择器:>表示一个层级,空格表示多个层级
-
四、项目实战(诗词名句网)
需求:使用bs4实现将诗词名句网站中三国演义小说的每一章的内容爬去到本地磁盘进行存储
网址:http://www.shicimingju.com/book/sanguoyanyi.html
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup
# 配置请求头 headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', }
# 网站诗词内容下载 def parse_content(url): #获取标题正文页数据 page_text = requests.get(url,headers=headers).text soup = BeautifulSoup(page_text,'lxml') #解析获得标签 ele = soup.find('div',class_='chapter_content') content = ele.text #获取标签中的数据值 return content if __name__ == "__main__": url = 'http://www.shicimingju.com/book/sanguoyanyi.html' reponse = requests.get(url=url,headers=headers) page_text = reponse.text #创建soup对象 soup = BeautifulSoup(page_text,'lxml') #解析数据 a_eles = soup.select('.book-mulu > ul > li > a') print(a_eles) cap = 1 for ele in a_eles: print('开始下载第%d章节'%cap) cap+=1 title = ele.string content_url = 'http://www.shicimingju.com'+ele['href'] content = parse_content(content_url) with open('./sanguo.txt','w') as fp: fp.write(title+":"+content+'\n\n\n\n\n') print('结束下载第%d章节'%cap)
https://www.cnblogs.com/WiseAdministrator/