数据解析

  • 数据解析分类
    • 正则
      • 例子:使用正则聚焦爬取图片
    • bs4
      • bs4提供的用于数据解析的属性和方法
      • 实战练习:爬取三国演义所有章节标题和内容
    • xpath
      • xpath解析原理
      • 环境的安装
      • 如何实例化etree对象
      • xpath表达式
      • xpath实战
  • 原理概述

数据解析分类

正则

例子:使用正则聚焦爬取图片

爬取的网站:https://818ps.com/search/0-0-0-0-0-null-0_0_0_67-0-0-0-0.html


重点:分析需要在哪一块中寻找到图片地址,可以使用.*?来省略中间不需要的部分

ex = '<div class="min-img" has-ajax="0" style="width:216px;height:384px">.*?<img.*?src="(.*?)".*?</div>'
img_src_list = re.findall(ex, page_text, re.S)

代码:

import requests
import random
import re
import osuser_agent_list=['Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)','Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)','Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)','Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11','Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)','Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60','Opera/8.0 (Windows NT 5.1; U; en)','Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11']if __name__ == '__main__':# 创建一个文件夹,保存所有的图片if not os.path.exists('./img'):os.mkdir('./img')# 如何爬取图片数据url = 'https://818ps.com/search/0-0-0-0-0-null-0_0_0_67-0-0-0-0.html'header = { 'User-Agent': random.choice(user_agent_list) }# 使用通用爬虫对url对应的一整张页面进行爬取page_text = requests.get(url=url, headers=header).text# 使用聚焦爬虫将页面中所有的图片进行解析/提取  正则, 获取的是()中的.*?ex = '<div class="min-img" has-ajax="0" style="width:216px;height:384px">.*?<img.*?src="(.*?)".*?</div>'img_src_list = re.findall(ex, page_text, re.S)# print(img_src_list)for index,src in enumerate(img_src_list):
#         拼接出完整路径if ("http" in src):continueelse:src = 'http:' + srcprint(src)# 请求到了图片的二进制数据img_data = requests.get(url=src, headers=header).contentwith open('./img/' + str(index) + '.jpg', 'wb') as fp:fp.write(img_data)

效果:

bs4

bs4 实现数据解析原理:

  • 1.实例化一个BeautifulSoup,并且将页面源码数据加载到该对象中
  • 2.通过调用***BeautifulSoup对象***中相关的属性或者方法进行标签定位和数据提取

环境安装:
pip install bs4
pip install lxml

如何实例化BeautifulSoup对象:

  • from bs4 import BeautifulSoup
  • 对象的实例化
    • 1.将本地的HTML文档中的数据加载到该对象中
from bs4 import BeautifulSoupif __name__ == '__main__':# 将HTML文档中数据加载到BeautifulSoup对象中fp = open('./colorPicker.html', 'r', encoding='utf-8')soup = BeautifulSoup(fp, 'lxml')print(soup)
* 2.将互联网上获取的页面源码加载到该对象中

bs4提供的用于数据解析的属性和方法

  • tagNamesoup.tagName 返回的是HTML中第一次出现的tagName标签 print(soup.li)
  • find()soup.find(‘div’) 相当于soup.div soup.find(‘div’, class_=‘aa’) 查找class为aa的div
  • find_all()soup.find_all(‘div’) 返回的是列表
  • selectsoup.select(’.aa’) 可以使用某种选择器属性去查找,也可以使用层级去查找 soup.select(’.aa > ul > li > a’), 返回的也是列表
  • get_text():获取标签之间的文本数据, soup.a.text/string/get_text()
  • ['属性']:获取标签的属性值, soup.a[‘href’]

实战练习:爬取三国演义所有章节标题和内容

爬取页面:https://www.shicimingju.com

页面代码:

from bs4 import BeautifulSoup
import requests
import randomif __name__ == '__main__':header = {'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}url = 'https://www.shicimingju.com/book/sanguoyanyi.html'page_text = requests.get(url=url, headers=header)page_text.encoding = 'utf-8'# 在首页中解析出章节的标题和详情页url# 1.实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中soup = BeautifulSoup(page_text.text, 'lxml')li_list = soup.select('.book-mulu > ul > li')fp = open('./sanguo.txt', 'w', encoding='utf-8')for li in  li_list:title = li.a.textdetail_url = 'https://www.shicimingju.com' + li.a['href']# 对详情页发起请求,解析出章节内容detail_content_text = requests.get(url=detail_url, headers=header)detail_content_text.encoding = 'utf-8'# 解析出详情页中相关章节内容detail_soup = BeautifulSoup(detail_content_text.text, 'lxml')div_tag = detail_soup.find('div', class_='chapter_content')# 解析到了章节的内容content = div_tag.text# 持久化存储fp.write(title+':'+ content + '\n')print(title + '---爬取成功!')

效果:

xpath

xpath解析:最常用且最便捷高效的一种解析方式。通用性。

xpath解析原理

  • 1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
  • 2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。

环境的安装

pip install lxml

如何实例化etree对象

  • 1.将本地的HTML文档中源码数据加载到etree对象中: etree.parse()
  • 2.可以将从互联网上获取的源码数据加载到该对象中: etree.HTML(‘page_text’)

xpath(‘xpath表达式’)
例子:

tree = etree.parse('test.html')
tree.xpath('/html/head/title')  //此时返回的是存储地址

xpath表达式

  • /:表示的是从根节点开始定位。表示的是一个层级
  • //:表示的是多个层级。可以从任意位置开始定位
  • [@class="属性值"]: 属性定位 //div[@class=“aa”] //div[@class=“aa”]/ul/li
  • [1]:索引定位,索引是从1开始的 //div[3]
  • text():取文本 ** //div[3]/a/text() ** /text() 获取标签中直系的文本内容 //text() 获取标签中非直系的文本内容(所有的文本内容)
  • /@attrName img/@src

xpath实战

图片解析下载

图片来源:彼岸图网


代码:

import requests
from lxml import etree
import osif __name__ == '__main__':# 创建一个文件夹,保存所有的图片if not os.path.exists('./img'):os.mkdir('./img')url = 'http://pic.netbian.com/4kmeinv/'header = {'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}page = requests.get(url=url, headers=header)page.encoding = 'gbk'page_text = page.texttree = etree.HTML(page_text)# 数据解析,src的数据值li_list = tree.xpath('//div[@class="slist"]/ul/li')for li in li_list:imgsrc = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]imgname = li.xpath('./a/img/@alt')[0] + '.jpg'# 通用处理中文乱码的解决方案# imgname.encode('iso-8859-1').decode('gbk')# 图片持久化存储img_data = requests.get(url=imgsrc, headers=header).contentwith open('./img/' + imgname, 'wb') as fp:fp.write(img_data)print(imgname, imgsrc, '存储成功')

效果:

原理概述

  • 解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
  • 1.进行指定标签的定位
  • 2.标签或者标签对应的属性中存储的数据值进行提取(解析)

python爬虫系列——开始入土(二)数据解析相关推荐

  1. Python爬虫初学三(网络数据解析)

    目录 1.学习正则表达式的原因 2.什么是正则表达式 3.正则表达式匹配规则 4.正则实现步骤 5.Pattern 对象 6.正则模块常量 7.Match 对象 8.search 9.findall和 ...

  2. 「Python爬虫系列讲解」二、Python知识初学

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  3. 「Python爬虫系列讲解」十二、基于图片爬取的 Selenium 爬虫

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  4. 「Python爬虫系列讲解」十四、基于开发者工具 Network 的数据抓包技术

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  5. 「Python爬虫系列讲解」七、基于数据库存储的 BeautifulSoup 招聘爬取

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  6. 「Python爬虫系列讲解」八、Selenium 技术

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  7. 「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  8. 「Python爬虫系列讲解」十一、基于登录分析的 Selenium 微博爬虫

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  9. java爬取网页数据_Python网络爬虫实战(二)数据解析

    Python网络爬虫实战 (二)数据解析 本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站 ...

最新文章

  1. 网络推广专员敲黑板了,教你网站优化中如何更好地编写网站标题?
  2. 如何判断两物体加速度相等_高中物理:速度和加速度知识点
  3. Yarn框架和工作流程研究
  4. Struts2之路第一天
  5. 织梦dedecms财务会计代理记账财税公司网站模板 带手机版
  6. linux查看nec进程状态,【linux】 /proc/PID/stat
  7. 【eclipse插件开发实战】Eclipse插件开发2——SWT
  8. Windows安装apache+php的nts版本
  9. 高等数学(第七版)同济大学 习题3-2 个人解答
  10. 关于linux文件系统出现脏数据修复的思路
  11. ps安装插件提示“无法加载扩展,因为它未正确签署”怎么办?PS插件未经签署解决方法
  12. 层次化网络设计(三层网络结构)
  13. 软件测试整理:测试设计
  14. IDEA import飘红,清除缓存重启也不行
  15. php redis序列化,php session之存储在redis的方法
  16. 使用vigil 监控微服务系统包含可视化界面
  17. 3万元微型电动车,能否成为蔚来的“回港”利器?
  18. C++学习(四八二)zlib的inflate
  19. ORY Hydra项目详解
  20. 制作windows xp开机画面并替换

热门文章

  1. Elasticsearch之分词器查询分词效果
  2. 【计算机网络】什么是因特网
  3. big endian和little endian 的区别 ,BOOST_BIG_ENDIAN
  4. SQL Developer的下载、安装和连接Oracle数据库
  5. SQL server数据库安装包下载
  6. c++中using的几种用法
  7. AD18版本中测距之后显示信息不能清除
  8. java实现冒泡排序完整版
  9. android 验证邮箱格式,android开发中, 如何验证邮箱的格式 ?
  10. 【Linux 0.11】第六章 引导启动程序