zoukankan      html  css  js  c++  java
  • 爬虫之三种解析方式

      1.实现标签的定位

      2.将标签中的存储的文本内容或者相关的属性值进行提取

    正则

    单字符:
    
            . : 除换行以外所有字符
    
            [] :[aoe] [a-w] 匹配集合中任意一个字符
    
            d :数字  [0-9]
    
            D : 非数字
    
            w :数字、字母、下划线、中文
    
            W : 非w
    
            s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ f
    
    	v]。
    
            S : 非空白
    
        数量修饰:
    
            * : 任意多次  >=0
    
            + : 至少1次   >=1
    
            ? : 可有可无  0次或者1次
    
            {m} :固定m次 hello{3,}
    
            {m,} :至少m次
    
            {m,n} :m-n次
    
        边界:
    
            $ : 以某某结尾 
    
            ^ : 以某某开头
    
        分组:
    
            (ab)  
    
        贪婪模式: .*
    
        非贪婪(惰性)模式: .*?
    
     
    
        re.I : 忽略大小写
    
        re.M :多行匹配
    
        re.S :单行匹配
    
     
    
        re.sub(正则表达式, 替换内容, 字符串)
    
     
    
    正则回顾  

    爬虫练习之爬取糗事百科

    #!/usr/bin/env python
    
    # -*- coding:utf-8 -*-
    
    import requests
    
    import re
    
    import os
    
    if __name__ == "__main__":
    
         url = 'https://www.qiushibaike.com/pic/%s/'
    
         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',
    
         }
    
         #指定起始也结束页码
    
         page_start = int(input('enter start page:'))
    
         page_end = int(input('enter end page:'))
    
     
    
         #创建文件夹
    
         if not os.path.exists('images'):
    
             os.mkdir('images')
    
         #循环解析且下载指定页码中的图片数据
    
         for page in range(page_start,page_end+1):
    
             print('正在下载第%d页图片'%page)
    
             new_url = format(url % page)
    
             response = requests.get(url=new_url,headers=headers)
    
     
    
             #解析response中的图片链接
    
             e = '<div class="thumb">.*?<img src="(.*?)".*?>.*?</div>'
    
             pa = re.compile(e,re.S)
    
             image_urls = pa.findall(response.text)
    
              #循环下载该页码下所有的图片数据
    
             for image_url in image_urls:
    
                 image_url = 'https:' + image_url
    
                 image_name = image_url.split('/')[-1]
    
                 image_path = 'images/'+image_name
    
     
    
                 image_data = requests.get(url=image_url,headers=headers).content
    
                 with open(image_path,'wb') as fp:
    
                     fp.write(image_data)
    
     
    
    爬取糗事百科指定页面的糗图,并将其保存到指定文件夹中

    BS4

    环境安装

      1.pip install BS4

      2.pip install lxml

    解析原理 

    • 实例化一个BeautifulSoup对象,必须把即将被解析的页面源码加载到该对象中
    • 调用该对象中相关的属性或者方法进行标签的定位和内容的提取

    如何实例化一个BeautifulSoup对象

    • 本地: 
      • soup = BeautifulSoup(open('本地文件'), 'lxml')
    • 网络加载:
      • soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')

    XPath

    解析原理

      1.实例化etree对象,且将源码加载到该对象中

      2.使用xpath方法结合着xpath表达式进行标签的定位和数据的提取

    属性定位:
    
        #找到class属性值为song的div标签
    
        //div[@class="song"] 
    
    层级&索引定位:
    
        #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
    
        //div[@class="tang"]/ul/li[2]/a
    
    逻辑运算:
    
        #找到href属性值为空且class属性值为du的a标签
    
        //a[@href="" and @class="du"]
    
    模糊匹配:
    
        //div[contains(@class, "ng")]
    
        //div[starts-with(@class, "ta")]
    
    取文本:
    
        # /表示获取某个标签下的文本内容
    
        # //表示获取某个标签下的文本内容和所有子标签下的文本内容
    
        //div[@class="song"]/p[1]/text()
    
        //div[@class="tang"]//text()
    
    取属性:
    
        //div[@class="tang"]//li[2]/a/@href

    代码中使用xpath表达式进行数据解析:

    1.下载:pip install lxml
    
    2.导包:from lxml import etree
    
     
    
    3.将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
    
     
    
      2.1 本地文件:tree = etree.parse(文件名)
    
                    tree.xpath("xpath表达式")
    
     
    
      2.2 网络数据:tree = etree.HTML(网页内容字符串)
    
                    tree.xpath("xpath表达式")

    安装xpath插件在浏览器中对xpath表达式进行验证:可以在插件中直接执行xpath表达式

    • 将xpath插件拖动到谷歌浏览器拓展程序(更多工具)中,安装成功

    •  启动和关闭插件 ctrl + shift + x

    下载煎蛋网中的图片

    import requests
    
    from lxml import etree
    
    from fake_useragent import UserAgent
    
    import base64
    
    import urllib.request
    
    url = 'http://jandan.net/ooxx'
    
    ua = UserAgent(verify_ssl=False,use_cache_server=False).random
    
    headers = {
    
        'User-Agent':ua
    
    }
    
    page_text = requests.get(url=url,headers=headers).text
    
     
    
    #查看页面源码:发现所有图片的src值都是一样的。
    
    #简单观察会发现每张图片加载都是通过jandan_load_img(this)这个js函数实现的。
    
    #在该函数后面还有一个class值为img-hash的标签,里面存储的是一组hash值,该值就是加密后的img地址
    
    #加密就是通过js函数实现的,所以分析js函数,获知加密方式,然后进行解密。
    
    #通过抓包工具抓取起始url的数据包,在数据包中全局搜索js函数名(jandan_load_img),然后分析该函数实现加密的方式。
    
    #在该js函数中发现有一个方法调用,该方法就是加密方式,对该方法进行搜索
    
    #搜索到的方法中会发现base64和md5等字样,md5是不可逆的所以优先考虑使用base64解密
    
    #print(page_text)
    
     
    
    tree = etree.HTML(page_text)
    
    #在抓包工具的数据包响应对象对应的页面中进行xpath的编写,而不是在浏览器页面中。
    
    #获取了加密的图片url数据
    
    imgCode_list = tree.xpath('//span[@class="img-hash"]/text()')
    
    imgUrl_list = []
    
    for url in imgCode_list:
    
        #base64.b64decode(url)为byte类型,需要转成str
    
        img_url = 'http:'+base64.b64decode(url).decode()
    
        imgUrl_list.append(img_url)
    
     
    
    for url in imgUrl_list:
    
        filePath = url.split('/')[-1]
    
        urllib.request.urlretrieve(url=url,filename=filePath)
    
        print(filePath+'下载成功')
    
     
    
    下载煎蛋网中的图片数据:http://jandan.net/ooxx
  • 相关阅读:
    2012年8月20日 我单身了!
    IE8与VS2008 添加变量 脚本错误的解决方案
    感染导入表方法附源码(转载)
    获取远程网卡MAC地址(VC++)
    [转]VC 中 TreeView 全面解析
    利用INF安装服务启动
    IOCP编程之基本原理
    LIMIT 用法
    SQL Server 触发器的删除操作
    CLRviaCsharp学习笔记
  • 原文地址:https://www.cnblogs.com/pythonz/p/10933886.html
Copyright © 2011-2022 走看看