• requests 模块的使用与数据解析的介绍


    requests 模块的使用与数据解析的介绍

    提前补充:Python 中常用的发送网络信息就是requestsurllib模块。

    1.介绍

    requests模块:python中一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
    作用:模拟浏览器发请求。

    如何使用:(requests模块的编码流程)

    • 指定url

      • UA伪装
      • 请求参数的处理
    • 发起请求

    • 获取响应数据

    • 持久化存储

    环境安装:

    pip install requests
    

    2.实战演练

    2.1 爬取搜狗首页

    get 函数的源码

    image-20220630155242974

    import requests
    
    if __name__ == '__main__':
        url = 'https://www.sogou.com/'
        # step_2:发起请求
        # get方法会返回一个响应对象
        response = requests.get(url=url)
        # step_3:获取响应数据.text返回的是字符串形式的响应数据
        page_text = response.text
        print(page_text)
        # step_4:持久化存储
        with open('./sogou.html', 'w', encoding='utf-8') as fp:
            fp.write(page_text)
        print('爬取数据结束!!!')
    

    2.2 UA标识的使用

    UA:User-Agent(请求载体的身份标识)

    • UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器,说明该请求是一个正常的请求。但是,如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),则服务器端就很有可能拒绝该次请求。
    • UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
    import requests
    if __name__ == "__main__":
        #UA伪装:将对应的User-Agent封装到一个字典中
        headers = {
            'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
        }
        url = 'https://www.sogou.com/web'
        #处理url携带的参数:封装到字典中
        kw = input('enter a word:')
        param = {
            'query':kw
        }
        #对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
        response = requests.get(url=url,params=param,headers=headers)
    
        page_text = response.text
        fileName = kw+'.html'
        with open(fileName,'w',encoding='utf-8') as fp:
            fp.write(page_text)
        print(fileName,'保存成功!!!')
    
    

    2.3 百度翻译的抓取使用

    post 函数源码

    image-20220630155220784

    import requests
    
    url = "https://fanyi.baidu.com/sug"
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
    }
    #3.post请求参数处理(同get请求一致)
    word = input('enter a word:')
    data = {
        'kw':word
    }
    #4.请求发送
    response = requests.post(url=url,data=data,headers=headers)
    #5.获取响应数据:json()方法返回的是obj(如果确认响应数据是json类型的,才可以使用json())
    dic_obj = response.json()
    print(">>>",dic_obj)
    

    参数使用:get 请求一般是params,post 请求一般是data

    3.数据解析

    • 聚焦爬虫:爬取页面中指定的页面内容。

    • 编码流程:

      • 指定url
      • 发起请求
      • 获取响应数据
      • 数据解析
      • 持久化存储
    • 数据解析分类:

      • 正则
      • bs4
      • xpath

    3.1 正则解析

    '''
    <div class="thumb">
    
    <a href="/article/121721100" target="_blank">
    <img src="//pic.qiushibaike.com/system/pictures/12172/121721100/medium/DNXDX9TZ8SDU6OK2.jpg" alt="指引我有前进的方向">
    </a>
    
    </div>
    '''
    # 正则表达式
    ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
    

    3.2 BS4 解析

    数据解析的原理:

    • 1.标签定位
    • 2.提取标签、标签属性中存储的数据值

    bs4数据解析的原理:

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

    环境安装

    pip install bs4
    
    pip install lxml
    

    如何实例化BeautifulSoup对象:

    • from bs4 import BeautifulSoup
    • 对象的实例化:
    # 1.将本地的html文档中的数据加载到该对象中
       fp = open('./test.html','r',encoding='utf-8')
       soup = BeautifulSoup(fp,'lxml')
    # 2.将互联网上获取的页面源码加载到该对象中
       page_text = response.text
       soup = BeatifulSoup(page_text,'lxml')
    
    • 提供的用于数据解析的方法和属性:
      • soup.tagName:返回的是文档中第一次出现的tagName对应的标签
      • soup.find():
      • find('tagName'):等同于soup.div
    • 属性定位:
      • soup.find('div',class_/id/attr='song')
      • soup.find_all('tagName'):返回符合要求的所有标签(列表)
    • select:
      • select('某种选择器(id,class,标签...选择器)'),返回的是一个列表。
      • 层级选择器:
        • soup.select('.tang > ul > li > a'):>表示的是一个层级
        • oup.select('.tang > ul a'):空格表示的多个层级
      • 获取标签之间的文本数据:
        • soup.a.text/string/get_text()
        • text/get_text():可以获取某一个标签中所有的文本内容
        • string:只可以获取该标签下面直系的文本内容
        • 获取标签中属性值:
        • soup.a['href']

    注:本人通常不使用该方法解析,本部分内容较少。

    3.3 XPath 解析

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

    • xpath解析原理:

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

      • pip install lxml
        
    • 如何实例化一个etree对象:from lxml import etree

      • 1.将本地的html文档中的源码数据加载到etree对象中:etree.parse(filePath)

      • 2.可以将从互联网上获取的源码数据加载到该对象中:etree.HTML('page_text')

      • xpath('xpath表达式')
        
    • xpath表达式:

      • /:表示的是从根节点开始定位。表示的是一个层级。

      • //:表示的是多个层级。可以表示从任意位置开始定位。

      • 属性定位://div[@class='song'] tag[@attrName="attrValue"]

      • 索引定位://div[@class="song"]/p[3] 索引是从1开始的。

      • 取文本:

        • /text() :获取的是标签中直系的文本内容
        • //text() :标签中非直系的文本内容(所有的文本内容)
      • 取属性:
        /@attrName ==>img/src

        DIV/IMG/@src # 获得照片的连接地址
        

    注:XPath 解析式可以从浏览器中进行获取,但是,当选择的元素是存在表格(tbody)中的话,需要进行手动输入,因为极容易检测不到元素;另一种情况则是使用了<iframe>标签引用的第三方网页,使用浏览器的获取,不会获取到外层的XPath值。

    说明:本部分的代码示例,暂时不在此处进行演示,将在后面的实战案例中进行演示;

  • 相关阅读:
    SCOPE_IDENTITY和@@identity的区别
    IE6.0、IE7.0 与FireFox CSS兼容的解决方法
    DivCSS布局基础:CSS中控制换行的四种属性
    load的用法(问题未解决)
    设置每个li的margin距离(巧设计)
    IE6下设置float和margin的问题
    在IE7下设置zindex没有反应
    做css页面时,注意的地方
    专题页
    IE8下margintop问题
  • 原文地址:https://www.cnblogs.com/Blogwj123/p/16433385.html
Copyright © 2020-2023  润新知