爬虫02 /数据解析

目录

  • 爬虫02 /数据解析

    • 1. 数据解析概述
    • 2. 正则实现的数据解析
    • 3. bs4实现数据解析
    • 4. xpath解析
    • 总结:

爬虫02 /数据解析

1. 数据解析概述

  • 什么是数据解析,数据解析可以干什么?

    • 概念:就是将一组数据中的局部数据进行提取。
    • 作用:使用来实现聚焦爬虫
  • 数据解析的通用原理
    • 问题:html展示的数据可以存储在哪里?

      • 标签之中
      • 属性中
    • 1.标签定位
    • 2.取文本或者取属性
  • 数据解析的常用方法
    • re
    • bs4
    • xpath
    • pyquery

2. 正则实现的数据解析

  • 需求:http://duanziwang.com/category/%E6%90%9E%E7%AC%91%E5%9B%BE/,将该网站中的图片数据进行爬取
  • 如何对图片(二进制)数据进行爬取

    方法一:

    import requests
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    }
    url = 'http://duanziwang.com/usr/uploads/2019/02/3334500855.jpg'
    pic_data = requests.get(url=url,headers=headers).content
    # content返回的是二进制类型的响应数据
    with open('1.jpg','wb') as fp:
        fp.write(pic_data)

    方法二:urllib就是一个低版本的requests

    import urllib
    url = 'http://duanziwang.com/usr/uploads/2019/02/3334500855.jpg'
    urllib.request.urlretrieve(url=url,filename='./2.jpg')
  • 两种图片爬取的方法的区别是什么?
    • 方法1可以进行UA伪装,方法2不行
  • 抓包工具中response中显示的页面源码和开发者工具的Element选项卡显示的页面源码的区别是什么?
    • Element:显示的页面源码内容是当前网页加载完毕后对应的所有数据(包含动态加载的数据)
    • response:显示的内容仅仅是当前一个请求请求到的数据(不包含动态加载的数据)
  • 代码示例
    • 需求的实现:爬取了一页的数据
    import re
    import os
    
    url = 'http://duanziwang.com/category/%E6%90%9E%E7%AC%91%E5%9B%BE/'
    page_text = requests.get(url,headers=headers).text  # 页面源码数据
    
    # 新建一个文件夹
    dirName = 'imgLibs'
    if not os.path.exists(dirName):
        os.mkdir(dirName)
    
    # 数据解析:每一张图片的地址
    ex = '<article.*?<img src="(.*?)" alt=.*?</article>'
    img_src_list = re.findall(ex,page_text,re.S)  # 爬虫中使用findall函数必须要使用re.S
    
    for src in img_src_list:
        imgName = src.split('/')[-1]
        imgPath = dirName+'/'+imgName
        urllib.request.urlretrieve(url=src,filename=imgPath)
        print(imgName,'下载成功!!!')
    • 需求的实现:进行全站数据的爬取:爬取所有页码的图片数据
    # 制定一个通用的url模板,不可以被改变
    url = 'http://duanziwang.com/category/搞笑图/%d/'
    
    for page in range(1,4):
        new_url = format(url%page)
        page_text = requests.get(new_url,headers=headers).text  # 页面源码数据
    
        # 新建一个文件夹
        dirName = 'imgLibs'
        if not os.path.exists(dirName):
            os.mkdir(dirName)
    
        # 数据解析:每一张图片的地址
        ex = '<article.*?<img src="(.*?)" alt=.*?</article>'
        img_src_list = re.findall(ex,page_text,re.S)  # 爬虫中使用findall函数必须要使用re.S
    
        for src in img_src_list:
            imgName = src.split('/')[-1]
            imgPath = dirName+'/'+imgName
            urllib.request.urlretrieve(url=src,filename=imgPath)
            print(imgName,'下载成功!!!')

3. bs4实现数据解析

  • 环境的安装:

    • pip install bs4
    • pip install lxml
  • 解析原理
    • 实例化一个BeautifulSoup的一个对象,把即将被解析的页面源码内容加载到该对象中
    • 调用BeautifulSoup对象中相关的方法和属性进行标签定位和本文数据的提取
  • BeautifulSoup对象的实例化的方式:
    • BeautifulSoup(fp,‘lxml‘):将本地的文件内容加载到该对象中进行数据解析
    • BeautifulSoup(page_text,‘lxml‘):将互联网上请求到的数据加载到该对象中进行数据解析
  • bs4相关解析操作
    • 标签定位:返回值一定是定位到的标签

      • soup.tagName:定位到第一个出现的tagName标签.返回的是单数
      • 属性定位:soup.find(‘tagName‘,attrName=‘value‘),返回的是单数
      • find_all(‘tagName‘,attrName=‘value‘)返回的是复数(列表)
      • 选择器定位:select(‘选择器‘),返回的也是一个列表
        • 层级选择器:

          • 大于号:表示一个层级
          • 空格:标识多个层级
    • 取文本
      • string:只可以将标签中直系的文本取出
      • text:可以将标签中所有的内容取出
    • 取属性
      • tag[‘attrName‘]
    • 代码示例
    from bs4 import BeautifulSoup
    fp = open('./test.html','r',encoding='utf-8')
    soup = BeautifulSoup(fp,'lxml')
    soup.p
    soup.find('div',class_='tang')
    soup.find('a',id='feng')
    soup.find_all('div',class_='tang')
    soup.select('#feng')
    soup.select('.tang > ul > li')
    soup.select('.tang li')
    tag = soup.title
    tag.text
    li_list = soup.select('.tang > ul > li')
    li_list[6].text
    div_tag = soup.find('div',class_='tang')
    div_tag.text
    a_tag = soup.select('#feng')[0]
    a_tag['href']
  • 需求:http://www.shicimingju.com/book/sanguoyanyi.html 进行全篇小说内容的爬取
  • 分析:
    • 首页:解析出章节的名称+详情页的url
    • 详情页:解析章节的内容
  • 代码示例
    # 爬取到首页的页面数据
    main_url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    page_text = requests.get(main_url,headers=headers).text
    
    fp = open('./sanguo.txt','a',encoding='utf-8')
    
    # 解析章节名称+详情页的url
    soup = BeautifulSoup(page_text,'lxml')
    a_list = soup.select('.book-mulu > ul > li > a')
    for a in a_list:
        title = a.string   # 章节标题
        detail_url = 'http://www.shicimingju.com'+a['href']
    
        # 爬取详情页的页面源码内容
        detail_page_text = requests.get(url=detail_url,headers=headers).text
        # 解析章节内容
        detail_soup = BeautifulSoup(detail_page_text,'lxml')
        div_tag = detail_soup.find('div',class_="chapter_content")
        content = div_tag.text # 章节内容
        fp.write(title+':'+content+'\n')
        print(title,'下载成功!!!')
    fp.close()

4. xpath解析

  • 环境的安装:

    • pip install lxml
  • 解析原理(流程)
    • 实例化一个etree的对象,将解析的数据加载到该对象中
    • 需要调用etree对象中的xpath方法结合着不同的xpath表达式进行标签定位和文本数据的提取
  • etree对象的实例化
    • etree.parse(‘filePath‘):将本都数据加载到etree中
    • etree.HTML(page_text):将互联网上的数据加载到该对象中
  • html中所有的标签都是遵从了树状的结构,便于我们实现高效的节点的遍历或者查找(定位)
  • xpath方法的返回值一定是复数(列表)
  • 标签定位
    • 最左侧的/:xpath表达式式一定要从根标签开始进行定位
    • 非最左侧的/:表示一个层级
    • 最左侧的//:从任意位置进行标签定位(常用)
    • 非最左侧//:表示多个层级
    • //tagName:定位到所有的tagName标签
    • 属性定位://tagName[@attrName="value"]
    • 索引定位://tagName[index],index索引是从1开始
    • 模糊匹配:
      • //div[contains(@class, "ng")]
      • //div[starts-with(@class, "ta")]
  • 取文本
    • /text():取直系的文本内容。列表只有一个元素
    • //text():所有的文本内容。列表会有多个列表元素
  • 取属性
    • /@attrName
  • 代码示例
    from lxml import etree
    tree = etree.parse('./test.html')
    tree.xpath('/html/head/meta')
    tree.xpath('/html//meta')
    tree.xpath('//meta')
    tree.xpath('//div')
    tree.xpath('//div[@class="tang"]')
    tree.xpath('//li[1]')
    tree.xpath('//a[@id="feng"]/text()')[0]
    tree.xpath('//div[2]//text()')
    tree.xpath('//a[@id="feng"]/@href')
  • 需求:爬取解析虎牙中直播的房间名称,热度,详情页的url
    url = 'https://www.huya.com/g/lol'
    page_text = requests.get(url=url,headers=headers).text
    # 数据解析
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//div[@class="box-bd"]/ul/li')
    for li in li_list:
        # 实现局部解析:将局部标签下指定的内容进行解析
        # 局部解析xpath表达式中的最左侧的./表示的就是xpath方法调用者对应的标签
        title = li.xpath('./a[2]/text()')[0]
        hot = li.xpath('./span/span[2]/i[2]/text()')[0]
        detail_url = li.xpath('./a[1]/@href')[0]
        print(title,hot,detail_url)
    • xpath图片数据爬取+乱码的处理
    # url模板
    url = 'http://pic.netbian.com/4kmeinv/index_%d.html'
    for page in range(1,11):
        new_url = format(url%page)  # 只可以表示非第一页的页码连接
        if page == 1:
            new_url = 'http://pic.netbian.com/4kmeinv/'
        page_text = requests.get(new_url,headers=headers).text
        tree = etree.HTML(page_text)
        li_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')
        for li in li_list:
            img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
            img_name = img_name.encode('iso-8859-1').decode('gbk')
            img_src = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
            print(img_name,img_src)
    • 使用xpath管道符
    url = 'https://www.aqistudy.cn/historydata/'
    page_text = requests.get(url,headers=headers).text
    
    tree = etree.HTML(page_text)
    # hot_cities = tree.xpath('//div[@class="bottom"]/ul/li/a/text()')
    all_cities = tree.xpath('//div[@class="bottom"]/ul/div[2]/li/a/text() | //div[@class="bottom"]/ul/li/a/text()')
    all_cities
    • xpath表达式中管道符的应用

      • 目的:使得xpath表达式具有更强的通用性

总结:

  1. content返回的是二进制类型的响应数据

    data = requests.get(url=url,headers=headers).content

  2. 正则re.S的使用
    • img_src_list = re.findall(ex,page_text,re.S)
    • 如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行

      而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配

  3. new_url = format(url%page)
    def format(value, format_spec='', /)
     Return value.__format__(format_spec)
  4. urllib用的是request请求数据,不是requests

原文地址:https://www.cnblogs.com/liubing8/p/11980080.html

时间: 2024-10-11 16:31:08

爬虫02 /数据解析的相关文章

05 Python网络爬虫的数据解析方式

一.爬虫数据解析的流程 1.指定url 2.基于requests模块发起请求 3.获取响应中的数据 4.数据解析 5.进行持久化存储 二.解析方法 (1)正则解析 (2)bs4解析 (3)xpath解析 1. 正则解析 常用正则表达式 1 单字符: 2 . : 除换行以外所有字符 3 [] :[aoe] [a-w] 匹配集合中任意一个字符 4 \d :数字 [0-9] 5 \D : 非数字 6 \w :数字.字母.下划线.中文 7 \W : 非\w 8 \s :所有的空白字符包,括空格.制表符.

爬虫项目数据解析方式

数据解析 requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据,所以,我们的数据爬取的流程可以修改为: 指定url 基于requests模块发起请求 获取响应中的数据 数据解析 进行持久化存储 正则解析 常用的正则表达式回顾: 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d

爬虫之数据解析,网页源码数据分析

数据解析,就是对网页源码数据的解析和清洗,获取自己想要的数据信息. 常用的数据解析有下面四种: 1.正则 2.bs4 3.xpath 4.pyquery 一: 正则:熟练使用正则表达式,对数据进行提取即可 二:BS4 解析原理: 1.实例化一个BeautifulSoup的一个对象,并且将即将被解析的页面源码加载到该对象中 2.调用bs对象中相关属性和方法进行标签定位和数据的提取 环境安装: pip install lxml pip install bs4 使用; from bs4 import

Python_爬虫_数据解析回顾

--数据解析原理 --定位标签 --提取标签中存储的数据 --xpath解析原理 --实例化一个etree的对象且将解析的页面源码数据加载到该对象中 --通过xpath方法(返回值:列表)结合者xpath表达式进行数据解析 -- //tagName -- //tagName[@attr = 'value'] -- //tagName[index] -- /text() //text() -- /@attrName --bs4解析原理 --实例化一个bs4的对象且将解析的页面源码数据加载到该对象中

爬虫之数据解析的三种方式

一,正则表达式解析 re正则就不写了,前面已经写入一篇很详细的正则表达式模块了~ 而且,在爬虫中,下面两种方式用的多一些~ 正则表达式:https://www.cnblogs.com/peng104/p/9619801.html 大致用法: pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a' +'.*?>(.*?)<

网络笔记02数据解析 -1-JSON解析

1.JSON解析 1.JSON介绍 JSON是最网络传输数据最为广泛的数据格式,没有之一,出身草根,是Javascript的子集,专门负责描述数据格式.Javascript是网页开发的一种脚本语言,和Java没有任何关系. 2.语法规则 JSON数据以key/value 值对表示,每个数据由逗号分割,花括号保存对象,方括号保存数组 3.JSON值 数字(整数或浮点数),字符串(在双引号中),逻辑值(true 或false),数组(在方括号中),对象(在花括号中),null; 4.序列化&反序列化

Python爬虫:数据解析 之 xpath

资料: W3C标准:https://www.w3.org/TR/xpath/all/ W3School:https://www.w3school.com.cn/xpath/index.asp 菜鸟教程:https://www.runoob.com/xpath/xpath-tutorial.html xpath教程:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html XPATH在线测试:http://www.bejson.

网络爬虫初步:从访问网页到数据解析

前言: 网络爬虫这个东西看上去还是很神奇的.不过,如果你细想,或是有所研究就知道,其实爬虫并不那么高深.高深的是在我们的数据量很大的时候,就是当我们网络"图"的回环越来越多的时候,应该怎么去解决它. 本篇文章在这里只是起一个抛砖引玉的作用.本文主要是讲解了如何使用Java/Python访问网页并获得网页代码.Python模仿浏览器进行访问网页和使用Python进行数据解析.希望我们以本文开始,一步一步解开网络蜘蛛神秘的一面. 参考: 1.<自己动手写网络爬虫> 2.用pyt

Python网络爬虫之三种数据解析方式

引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据.因此,本次课程中会给大家详细介绍讲解三种聚焦爬虫中的数据解析方式.至此,我们的数据爬取的流程可以修改为: 指定url 基于requests模块发起请求 获取响应中的数据 数据解析