您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496netPython互联网爬虫与消息提取

新葡亰496netPython互联网爬虫与消息提取

发布时间:2019-11-23 15:40编辑:奥门新萄京娱乐场浏览(53)

    【根据北京理工大学嵩天老师“Python网络爬虫与信息提取”慕课课程编写  文章中部分图片来自老师PPT

    一:Requests库

    Python网络爬虫与信息提取(实例讲解),python实例讲解

    课程体系结构:

    1、Requests框架:自动爬取HTML页面与自动网络请求提交

    2、robots.txt:网络爬虫排除标准

    3、BeautifulSoup框架:解析HTML页面

    4、Re框架:正则框架,提取页面关键信息

    5、Scrapy框架:网络爬虫原理介绍,专业爬虫框架介绍

    理念:The Website is the API ...

    Python语言常用的IDE工具

    文本工具类IDE:

    IDLE、Notepad 、Sublime Text、Vim & Emacs、Atom、Komodo Edit

    集成工具IDE:

    PyCharm、Wing、PyDev & Eclipse、Visual Studio、Anaconda & Spyder、Canopy

    ·IDLE是Python自带的默认的常用的入门级编写工具,它包含交互式文件式两种方式。适用于较短的程序。

    ·Sublime Text是专为程序员开发的第三方专用编程工具,可以提高编程体验,具有多种编程风格。

    ·Wing是Wingware公司提供的收费IDE,调试功能丰富,具有版本控制,版本同步功能,适合于多人共同开发。适用于编写大型程序。

    ·Visual Studio是微软公司维护的,可以通过配置PTVS编写Python,主要以Windows环境为主,调试功能丰富。

    ·Eclipse是一款开源的IDE开发工具,可以通过配置PyDev来编写Python,但是配置过程复杂,需要有一定的开发经验。

    ·PyCharm分为社区版和专业版,社区版免费,具有简单、集成度高的特点,适用于编写较复杂的工程。

    适用于科学计算、数据分析的IDE:

    ·Canopy是由Enthought公司维护的收费工具,支持近500个第三方库,适合科学计算领域应用开发。

    ·Anaconda是开源免费的,支持近800个第三方库。

    Requests库入门

    Requests的安装:

    Requests库是目前公认的爬取网页最好的Python第三方库,具有简单、简捷的特点。

    官方网站:

    在"C:WindowsSystem32"中找到"cmd.exe",使用管理员身份运行,在命令行中输入:“pip install requests”运行。

    新葡亰496net 1

    使用IDLE测试Requests库:

    >>> import requests
    >>> r = requests.get("http://www.baidu.com")#抓取百度页面
    >>> r.status_code
    >>> r.encoding = 'utf-8'
    >>> r.text
    

    Requests库的7个主要方法

    方法 说明
    requests.request() 构造一个请求,支撑以下各方法的基础方法
    requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
    requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
    requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
    requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
    requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
    requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELET

    详细信息参考 Requests库 API文档:

    get()方法

    r = requests.get(url)

    get()方法构造一个向服务器请求资源的Request对象,返回一个包含服务器资源的Response对象。

    requests.get(url, params=None, **kwargs)

    url:拟获取页面的url链接

    params:url中的额外参数,字典或字节流格式,可选

    **kwargs:12个控制访问参数

    Requests库的2个重要对象

    · Request

    · Response:Response对象包含爬虫返回的内容

    Response对象的属性

    r.status_code :HTTP请求的返回状态,200表示连接成功,404表示失败

    r.text :HTTP响应内容的字符串形式,即,url对应的页面内容

    r.encoding : 从HTTP header中猜测的相应内容编码方式 

    r.apparent_encoding : 从内容中分析出的相应内容编码方式(备选编码方式)

    r.content : HTTP响应内容的二进制形式

    r.encoding :如果header中不存在charset,则认为编码为ISO-8859-1 。

    r.apparent_encoding :根据网页内容分析出的编码方式可以 看作是r.encoding的备选。

    Response的编码:

    r.encoding : 从HTTP header中猜测的响应内容的编码方式;如果header中不存在charset,则认为编码为ISO-8859-1,r.text根据r.encoding显示网页内容

    r.apparent_encoding : 根据网页内容分析出的编码方式,可以看作r.encoding的备选

    爬取网页的通用代码框架

    Requests库的异常

    异常 说明
    requests.ConnectionError 网络连接错误异常,如DNS查询失败拒绝连接等
    requests.HTTPError HTTP错误异常
    requests.URLRequired URL缺失异常
    requests.ToolManyRedirects 超过最大重定向次数,产生重定向异常
    requests.ConnectTimeout 连接远程服务器超时异常
    requests.Timeout 请求URL超时,尝试超时异常

    Response的异常

    r.raise_for_status() : 如果不是200,产生异常requests.HTTPError;

    在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try-except进行异常处理

    import requests
    
    def getHTMLText(url):
      try:
        r = requests.get(url, timeout=30)
        r.raise_for_status() # 如果状态不是200,引发HTTPError异常
        r.encoding = r.apparent_encoding
        return r.text
      except: 
        return "产生异常"
    
    if __name__ == "__main__":
      url = "http://www.baidu.com"
      print(getHTMLText(url))
    

    通用代码框架,可以使用户爬取网页变得更有效,更稳定、可靠。

    HTTP协议

    HTTP,Hypertext Transfer Protocol,超文本传输协议。

    HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。

    HTTP协议采用URL作为定位网络资源的标识。

    URL格式:]

    · host:合法的Internet主机域名或IP地址
    · port:端口号,缺省端口号为80
    · path:请求资源的路径

    HTTP URL的理解:

    URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。

    HTTP协议对资源的操作

    方法 说明
    GET 请求获取URL位置的资源
    HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
    POST 请求向URL位置的资源后附加新的数据
    PUT 请求向URL位置存储一个资源,覆盖原URL位置资源
    PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
    DELETE 请求删除URL位置存储的资源

    理解PATCH和PUT的区别

    假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段。

    需求:用户修改了UserName,其他不变。

    · 采用PATCH,仅向URL提交UserName的局部更新请求。

    · 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除。

    PATCH的主要好处:节省网络带宽

    Requests库主要方法解析

    requests.request(method, url, **kwargs)

    · method:请求方式,对应get/put/post等7种

    例: r = requests.request('OPTIONS', url, **kwargs)

    · url:拟获取页面的url链接

    · **kwargs:控制访问的参数,共13个,均为可选项

    params:字典或字节序列,作为参数增加到url中;

    kv = {'key1':'value1', 'key2':'value2'}
    r = requests.request('GET', 'http://python123.io/ws',params=kv)
    print(r.url)
    '''
    http://python123.io/ws?key1=value1&key2=value2
    '''
    

    data:字典、字节序列或文件对象,作为Request的内容;

    json:JSON格式的数据,作为Request的内容;

    headers:字典,HTTP定制头;

    hd = {'user-agent':'Chrome/10'}
    
    r = requests.request('POST','http://www.yanlei.shop',headers=hd)
    

    cookies:字典或CookieJar,Request中的cookie;

    auth:元组,支持HTTP认证功能;

    files:字典类型,传输文件;

    fs = {'file':open('data.xls', 'rb')}
    
    r = requests.request('POST','http://python123.io/ws',files=fs)
    

    timeout:设定超时时间,秒为单位;

    proxies:字典类型,设定访问代理服务器,可以增加登录认证

    allow_redirects:True/False,默认为True,重定向开关;

    stream:True/False,默认为True,获取内容立即下载开关;

    verify:True/False,默认为True,认证SSL证书开关;

    cert:本地SSL证书路径

    #方法及参数
    requests.get(url, params=None, **kwargs)
    requests.head(url, **kwargs)
    requests.post(url, data=None, json=None, **kwargs)
    requests.put(url, data=None, **kwargs)
    requests.patch(url, data=None, **kwargs)
    requests.delete(url, **kwargs)
    

    新葡亰496net 2

    网络爬虫引发的问题

    性能骚扰:

    受限于编写水平和目的,网络爬虫将会为web服务器带来巨大的资源开销

    法律风险:

    服务器上的数据有产权归属,网路爬虫获取数据后牟利将带来法律风险。

    隐私泄露:

    网络爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私。

    网络爬虫的限制

    ·来源审查:判断User-Agent进行限制

    检查来访HTTP协议头的User-Agent域,值响应浏览器或友好爬虫的访问。

    · 发布公告:Roots协议

    告知所有爬虫网站的爬取策咯,要求爬虫遵守。

    Robots协议

    Robots Exclusion Standard 网络爬虫排除标准

    作用:网站告知网络爬虫哪些页面可以抓取,哪些不行。

    形式:在网站根目录下的robots.txt文件。

    案例:京东的Robots协议

    # 注释:*代表所有,/代表根目录
    User-agent: * 
    Disallow: /?* 
    Disallow: /pop/*.html 
    Disallow: /pinpai/*.html?* 
    User-agent: EtaoSpider 
    Disallow: / 
    User-agent: HuihuiSpider 
    Disallow: / 
    User-agent: GwdangSpider 
    Disallow: / 
    User-agent: WochachaSpider 
    Disallow: /
    

    Robots协议的使用

      网络爬虫:自动或人工识别robots.txt,再进行内容爬取。

    新葡亰496net 3

    约束性:Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险。

    Requests库网络爬虫实战

    1、京东商品

    import requests
    url = "https://item.jd.com/5145492.html"
    try:
     r = requests.get(url)
     r.raise_for_status()
     r.encoding = r.apparent_encoding
     print(r.text[:1000])
    except:
     print("爬取失败")
    

    2、亚马逊商品

    # 直接爬取亚马逊商品是会被拒绝访问,所以需要添加'user-agent'字段
    import requests
    url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
    try:
     kv = {'user-agent':'Mozilla/5.0'} # 使用代理访问
     r = requests.get(url, headers = kv)
     r.raise_for_status()
     r.encoding = r.apparent_encoding
     print(t.text[1000:2000])
    except:
     print("爬取失败")
    

    3、百度/360搜索关键词提交

    搜索引擎关键词提交接口

    · 百度的关键词接口:

    · 360的关键词接口:

    # 百度
    import requests
    keyword = "Python"
    try:
     kv = {'wd':keyword}
     r = requests.get("http://www.baidu.com/s",params=kv)
     print(r.request.url)
     r.raise_for_status()
     print(len(r.text))
    except:
     print("爬取失败")
    
    # 360
    import requests
    keyword = "Python"
    try:
     kv = {'q':keyword}
     r = requests.get("http://www.so.com/s",params=kv)
     print(r.request.url)
     r.raise_for_status()
     print(len(r.text))
    except:
     print("爬取失败")
    

    4、网络图片的爬取和存储

    网络图片链接的格式:

    国家地理:

    选择一张图片链接:

    图片爬取全代码
    import requests
    import os
    url = "http://image.nationalgeographic.com.cn/2017/0704/20170704030835566.jpg"
    root = "D://pics//"
    path = root   url.split('/')[-1]
    try:
     if not os.path.exists(root):
      os.mkdir(root)
     if not os.path.exists(path):
      r = requests.get(url)
      with open(path,'wb') as f:
       f.write(r.content)
       f.close()
       print("文件保存成功")
     else:
      print("文件已存在")
    except:
     print("爬取失败")
    

    5、IP地址归属地的自动查询

    www.ip138.com IP查询

    import requests
    url = "http://m.ip138.com/ip.asp?ip="
    ip = "220.204.80.112"
    try:
     r = requests.get(url   ip)
     r.raise_for_status()
     r.encoding = r.apparent_encoding
     print(r.text[1900:])
    except:
     print("爬取失败")
    
    # 使用IDLE
    >>> import requests
    >>> url ="http://m.ip138.com/ip.asp?ip="
    >>> ip = "220.204.80.112"
    >>> r = requests.get(url   ip)
    >>> r.status_code
    >>> r.text
    

    以上这篇Python网络爬虫与信息提取(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持帮客之家。

    课程体系结构: 1、Requests框架:自动爬取HTML页面与自动网络请求提交 2、robots.txt:网络...

    慕课链接:】

    Requests is an elegant and simple HTTP library for Python, built for human beings.


    1.安装

    一、python爬虫的思路

    pip install requests
    

    爬虫是指根据一定规则(如页面HTML结构)可以在网络页面上获取大量数据的代码或程序。python语言提供了很多适合编写爬虫的库。

    安装小测

    python爬虫有很多种思路,这里使用3个python库搭建:Requests、BeautifulSoup、Re。

    >>> import requests
    >>> r=requests.get("http://www.baidu.com")
    >>> print(r.status_code)
    200
    >>> r.text
    '<!DOCTYPE html>rn<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>çx99¾åº¦ä¸x80ä¸x8bï¼x8cä½xa0å°±çx9f¥éx81x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus><input type=submit id=su value=çx99¾åº¦ä¸x80ä¸x8b class="bg s_btn"> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æx96°éx97»</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>åx9c°åx9b¾</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§x86é¢x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´åx90§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http://www.baidu.com/?bdorz_come=1 name=tj_login class=lb>çx99»å½x95</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='  encodeURIComponent(window.location.href  (window.location.search === "" ? "?" : "&")  "bdorz_come=1")  '" name="tj_login" class="lb">çx99»å½x95</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æx9b´å¤x9a产åx93x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>åx85³äºx8eçx99¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使çx94¨çx99¾åº¦åx89x8då¿x85读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>æx84x8fè§x81åx8fx8dé¦x88</a>&nbsp;京ICPè¯x81030173åx8f·&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>rn'
    

    Requests库提供了方法获取HTML页面,相当于把网页抓取到了一个变量中,再使用这个变量进行后续处理。更多信息请查看官方文档:。

    2.requests库的八个方法

    BeautifulSoup库提供了方法解析抓取下来的HTML页面。它根据HTML页面的DOM(Document Object Model)结构,解析我们真正感兴趣的内容。BeautifulSopu(美味汤),就像是Requests库提供了丰富但是杂乱的食材,而BeautifulSoup库知道哪些食材可以用,并用这些食材做成了一锅美味的汤。更多信息请查看官方文档:。

    requests.request() 构造一个请求,支撑以下各方法的基础方法
    requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
    requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
    requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POS
    requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
    requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
    requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE
    requests.options(url, **kwargs)
    

    Re库提供了使用正则表达式(Regular Expression)的方法。正则表达式是多个字符串的概括表示,有点像模糊匹配。使用正则表达式,可以更好地匹配HTML的DOM结构。更多信息请查看官方文档:。

    3 requests库的两个重要对象:request和response(包含爬虫返回的内容)

    使用Requests、BeautifulSoup、Re库搭建python爬虫的思路是:Requests库获取页面内容,BeautifulSoup库解析页面内容,Re库辅助匹配字符串。这3个库都比较简洁,语法也不是很复杂,适合构建中小型的爬虫。

    response = requests.get(url) 

     

    构造一个向服务器请求**资源的Request对象**

    二、Requests库基本使用

    *返回一个包含服务器**资源的Response对象 ***

    1.Requests库的安装

    *∙ url : 拟获取页面的url链接
    ∙ params : url中的额外参数,字典或字节流格式,可选
    ∙ **kwargs: 12个控制访问的参数 *

    ①python的正确安装

    Response对象包含服务器返回的所有信息,也包含请求的Request信息

    在python官网下载python3.x版本,python官网:。

    >>> import requests
    >>> r=requests.get("http://www.baidu.com")
    >>> print(r.status_code)
    200
    >>> type(r)
    <class 'requests.models.Response'>
    >>> r.headers
    {'Server': 'bfe/1.0.8.18', 'Date': 'Fri, 17 Nov 2017 02:24:03 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:28 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Pragma': 'no-cache', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Content-Encoding': 'gzip'}
    >>>
    

    python语言有两个版本同步更新:2.x系列和3.x系列。当前最新版本是2.7和3.7。2.x版本是之前的版本,各种库比较丰富。3.x版本是2009年开始开发的,相比较于2.x版本语法有很大的变化。两个版本是不兼容的。发展到现在,3.x系列已经有很多成熟的第三方库了,官方也在支持3.x系列版本的开发。除此之外,BeautifulSoup库对3.x版本也有优化。

    4 Response对象的属性

    下载并安装python后,需要配置计算机环境变量,为了在使用CMD命令窗口时可以正确找到所需工具的位置。(pip工具)

    r.status_code HTTP      请求的返回状态,200表示连接成功,404表示失败
    r.text HTTP                  响应内容的字符串形式,即,url对应的页面内容
    r.encoding                   从HTTP header中猜测的响应内容编码方式
    apparent_encoding     从内容中分析出的响应内容编码方式(备选编码方式)
    r.content HTTP           响应内容的二进制形式

    新葡亰496net 4  新葡亰496net 5

    与安装小测比较

    右键计算机属性-高级系统设置-环境变量。在用户变量列表中,找到Path变量,点击编辑。新建两个变量,目录是python安装目录下python.exe和pip.exe所在位置。

    >>> r.encoding
    'ISO-8859-1'
    >>> r.apparent_encoding
    'utf-8'
    >>> r.encoding="utf-8"
    >>> r.text
    '<!DOCTYPE html>rn<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus><input type=submit id=su value=百度一下 class="bg s_btn"> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http://www.baidu.com/?bdorz_come=1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='  encodeURIComponent(window.location.href  (window.location.search === "" ? "?" : "&")  "bdorz_come=1")  '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>rn'
    

    新葡亰496net 6  新葡亰496net 7

    r.encoding 从HTTP header中猜测的响应内容编码方式
    r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)

    打开CMD(command,命令提示符),输入python以测试环境变量是否配置成功。若输出python版本信息,则说明配置成功。

    r.encoding:如果header中不存在charset,则认为编码为ISO‐8859‐1   r.text根据r.encoding显示网页内容

    新葡亰496net 8

    r.apparent_encoding:根据网页内容分析出的编码方式,可以看作是r.encoding的备选

     

    5. requests异常

    ②Requests库的安装

    1 异常 说明
    2 requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
    3 requests.HTTPError          HTTP错误异常
    4 requests.URLRequired           URL缺失异常
    5 requests.TooManyRedirects     超过最大重定向次数,产生重定向异常
    6 requests.ConnectTimeout         连接远程服务器超时异常
    7 requests.Timeout             请求URL超时,产生超时异常
    

    以管理员身份启动CMD(右键CMD即可,这里不确定直接运行CMD是否可以安装成功),输入pip install requests即可从网络上下载并安装requests库。pip是python库的管理工具,可以对大部分库进行下载、安装、更新、卸载等。但是也有部分库是使用pip工具安装不了的。如果提示要先更新pip工具,按照指导更新即可。

    6.response异常

    新葡亰496net 9

    r.raise_for_status() 如果不是200,产生异常 requests.HTTPError
    

    注意这里有一个容易犯错的地方,也是很多人不会注意到的。启动CMD后输入完python测试配置环境变量成功后,要把CMD退出去,再启动,输入pip install requests。因为在CMD中输入完python后,CMD就变成了python交互器了。

    r.raise_for_status()在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try‐except进行异常处理 
    7.HTTP**Hypertext Transfer Protocol,超文本传输协议**
    HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
    HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
    ]
    host: 合法的Internet主机域名或IP地址
    port: 端口号,缺省端口为80
    path: 请求资源的路径

    新葡亰496net 10

    HTTP URL实例:


    HTTP URL的理解:
    URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源 

     

    HTTP协议对资源的操作方法:

     

    1 GET 请求获取URL位置的资源
    2 HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
    3 POST 请求向URL位置的资源后附加新的数据
    4 PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
    5 PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
    6 DELETE 请求删除URL位置存储的资源          
    

    2.Requests库的7个主要方法

    patch与put

    Requests库比较简洁,主要的方法只有7个,分别对应HTTP的功能,这里可以先跳过,不用理解。

    假设URL位置有一组数据UserInfo,包括UserID、 UserName等20个字段
    需求:用户修改了UserName,其他不变
    • 采用PATCH,仅向URL提交UserName的局部更新请求
    • 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
    PATCH的最主要好处:节省网络带宽

    这些方法是:

    head

    requests.get():获取HTML网页的主要方法,对应HTTP的GET

    >>> r=requests.head("http://www.baidu.com")
    >>> r.headers
    {'Server': 'bfe/1.0.8.18', 'Date': 'Fri, 17 Nov 2017 02:51:22 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 13 Jun 2016 02:50:50 GMT', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Pragma': 'no-cache', 'Content-Encoding': 'gzip'}
    >>> r.text
    ''
    

    requests.head():获取HTML网页的头信息,对应HTTP的HEAD

    参数

    requests.post():向HTML网页提交POST请求,对应HTTP的POST

     1 **kwargs: 控制访问的参数,均为可选项
     2 params : 字典或字节序列,作为参数增加到url中
     3 data : 字典、字节序列或文件对象,作为Request的内容
     4 json : JSON格式的数据,作为Request的内容
     5 headers : 字典,HTTP定制头
     6 cookies : 字典或CookieJar,Request中的cookie
     7 auth : 元组,支持HTTP认证功能
     8  files : 字典类型,传输文件
     9 timeout : 设定超时时间,秒为单位
    10 proxies : 字典类型,设定访问代理服务器,可以增加登录认证
    11 allow_redirects : True/False,默认为True,重定向开关
    12 stream : True/False,默认为True,获取内容立即下载开关
    13 verify : True/False,默认为True,认证SSL证书开关
    14 cert : 本地SSL证书路径            
    

    requests.put():向HTML网页提交PUT请求,对应HTTP的PUT

    Robots Exclusion Standard**,网络爬虫排除标准**
    作用:
    网站告知网络爬虫哪些页面可以抓取,哪些不行
    形式:
    在网站根目录下的robots.txt文件 

    requests.patch():向HTML网页提交局部修改请求,对应HTTP的PATCH

    网络爬虫:自动或人工识别robots.txt,再进行内容爬取**

    requests.delete():向HTML网页提交删除请求,对应HTTP的DELETE

    约束性:**Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险 **

    requests.request():构造一个请求,是支撑以上各种方法的基础方法

     

    其中,最重要的,也是用的最多的是requests.get()。

    安装:pip install beautifulsoup4 

     

    Beautiful Soup库,也叫beautifulsoup4 或 bs4
    新葡亰496netPython互联网爬虫与消息提取。约定引用方式如下,即主要是用BeautifulSoup类

    3.Requests库的requests.get()

    from bs4 import BeautifulSoup
    import bs4

    r.requests.get(url)这样一行代码,做的事情其实有很多。requests.get(url)通过get()方法和url构造了一个向网页请求资源的Request对象(注意Request对象的'R'是大写)。而get()方法返回一个Response对象,其中包含了网页所有相关资源(即爬虫返回的全部内容),也包括我们向网页请求访问的Request对象中的相关信息。

    新葡亰496net,Beautiful Soup库解析器 

    这里,Request和Response是两个重要的对象。

    解析器         使用方法             条件
    bs4的HTML解析器     BeautifulSoup(mk,'html.parser')   安装bs4库
    lxml的HTML解析器   BeautifulSoup(mk,'lxml')   pip install lxml
    lxml的XML解析器   BeautifulSoup(mk,'xml')   pip install lxml
    html5lib的解析器   BeautifulSoup(mk,'html5lib')   pip install html5lib

    ①Response对象的重要属性

    BeautifulSoup类的基本元素 

    r.status_code:HTTP请求的返回状态,200表示连接成功,不是200表示连接失败

    Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾,任何存在于HTML语法中的标签都可以用soup.<tag>访问获得,当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个 **

    r.encoding:HTTP头部中猜测的内容字符编码方式

    Name 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name,*每个<tag>都有自己的名字,通过<tag>.name获取,字符串类型 ***

    r.apparent_encoding:从HTTP内容中解析出的最适合该内容的编码方式(与r.encoding的区别会在后面解释)


    r.text:HTTP响应内容的字符串形式,即URL对应的页面内容

    Attributes 标签的属性,字典形式组织,格式:<tag>.attrs,一个<tag>可以有0或多个属性,字典类型

    r.content:HTTP响应内容的二进制形式。如在HTTP中获取的图片、视频等多媒体资源就是用二进制形式存储的


    页面中显示的字符都是有一定要求的。有些页面会在HTTP头部中写入charset字段,来标识该页面中文本字符串的编码方式,但是有些页面的头部中没有charset字段。r.encoding的作用就是查看HTTP头部,以返回charset字段的值;如果没有charset字段,则返回的编码方式是'iso-8859-1'。r.apparent_encoding是实实在在地解析页面的内容,分析其中的字符串的最适合的编码方式,并返回这个编码。所以一般情况下,r.apparent_encoding比r.encoding更合理。一般用get()方法成功获取HTTP相关内容后,将r.apparent_encoding的值赋给r.encoding(即r.encoding=r.apparent_encoding),来根据正确的编码方式显示字符。


     

    NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string,NavigableString可以跨越多个层次

    ②关于get()方法的定义


    新葡亰496net 11


    从图中可以看到,get()方法实际上返回的是一个request()方法构造的对象,即get()方法是request()方法的封装。不光是get()方法,Requests库提供的其他几个方法也都是request()方法的封装。从这个层面上理解,Requests库只有request()这样一个基础的方法。

    Comment 标签内字符串的注释部分,一种特殊的Comment类型,Comment是一种特殊类型

     


    ③get()方法使用的示例

    标签树的下行遍历

     新葡亰496net 12

    .contents 子节点的列表,将<tag>所有儿子节点存入列表
    .children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
    .descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
    

    下面输出Response对象的相关属性信息,并展示错误的编码方式:

    上行遍历

    新葡亰496net 13

    .parent 节点的父亲标签
    .parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
    

    展示get()方法返回的Response对象:

    平行遍历

    新葡亰496net 14

    .next_sibling 返回按照HTML文本顺序的下一个平行节点标签
    .previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
    .next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
    .previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
    

     

    bs4库的prettify()方法
    .prettify()为HTML文本<>及其内容增加更加'n'
    .prettify()可用于标签,方法:<tag>.prettify()

    4.Requests库的异常及通用代码框架

    fiand_all()方法

    ①Requests库使用过程中可能会产生的异常

    <>.find_all(name, attrs, recursive, string, **kwargs)
    ∙ name : 对标签名称的检索字符串
    ∙ attrs: 对标签属性值的检索字符串,可标注属性检索
    ∙ recursive: 是否对子孙全部检索,默认True
    ∙ string: <>…</>中字符串区域的检索字符串
    <tag>(..) 等价于 <tag>.find_all(..)
    soup(..) 等价于 soup.find_all(..) 
    
    <>.find() 搜索且只返回一个结果,同.find_all()参数
    <>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
    <>.find_parent() 在先辈节点中返回一个结果,同.find()参数
    <>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
    <>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
    <>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
    <>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数
    

    r=requests.get(url)这样一行代码是和指定的服务器进行连接,但是在这个过程中可能会产生很多异常。

     

     

    requests.ConnectionError:网络连接错误,如DNS查询失败、服务器防火墙拒绝连接等

    requests.HTTPError:在HTTP协议层面出现的异常

    requests.URLRequired:URL缺失造成的异常

    requests.TooManyRedirects:用户访问URL进行的重定向次数超过了Requests库要求的最大重定向次数产生的异常,如对复杂URL进行访问时引发

    requests.ConnectTimeout:连接远程服务器超时异常

    requests.Timeout:连接至服务器及到获取内容整个过程中产生的超时异常

     

    当发生异常时,Response对象的status_code属性不是200。根据这一点,Requests库提供了r.raise_for_status()方法。如果status_code不是200,则引发HTTPError异常。可以根据这一点使用python语言的try-except异常捕捉机制,编写连接至服务器并获取页面内容的通用代码框架。

     

    ②通用代码框架

     1 import requests  #引入Requests库
     2 
     3 def getHTMLText(url):
     4     try:
     5         r=requests.get(url)
     6         r.raise_for_status()  #如果状态不是200,则产生HTTPError异常
     7         r.encoding=r.apparent_encoding
     8         return r.text
     9     except:
    10         return "产生错误"
    11 
    12 def main():
    13     url="http://www.baidu.com"
    14     print(getHTMLText(url))
    15 
    16 
    17 if __name__=="__main__":
    18     main()
    

    关于python语言的异常处理机制,请查看:。

     

    5.关于HTTP协议

    HTTP(Hypertext Transfer Protocol,超文本传输协议),是一个基于“请求与响应”模式的、无状态的应用层协议。其中,“请求与响应”模式指的是用户发出请求、服务器作出响应;“无状态”指前一次请求与后一次请求之间没有关联,不会相互影响;“应用层协议”指HTTP协议工作在TCP协议之上。

    HTTP协议采用URL(Uniform Resource Locator,统一资源定位符)作为定位网络资源的标识。网络上的每个文件都有一个唯一的URL,它包含文件的位置信息以及浏览器对它的处理信息。URL的格式为

    HTTP协议对资源的操作与Requests库提供的方法是相对应的。这些操作包括:

    GET:请求获取URL位置的资源;HEAD:请求获取位置资源的头部信息;POST:请求向位置资源后附加新的数据;PUT:请求向URL位置存储一个资源,并覆盖原URL位置的资源;PATCH:请求局部更新URL位置资源;DELETE:请求删除URL位置存储的资源。

    HTTP协议通过URL对资源作定位,通过这6个方法对资源进行管理。

     

    6.Requests库的方法

    ①requests.request(method,url,**kwargs)

    Requests库的基础方法,其他方法(如get()方法)都是这个方法的封装。

    method是请求的方式,对应get、head、post、put、patch、delete、options这7种方法。其中options是指与服务器交互时产生的一些参数,和URL的位置资源不直接相关。method参数的含义,以get()方法举例。r=requests.request('get',url),r=requests.request('GET',url),r=requests.get(url)。这3种方法是等价的。注意requests.request()中get是字符串,要加引号。

    url是拟获取资源的链接。

    kwargs是可选参数,这里有13个。分别是:

    params:字典或字节序列,增加到URL中。程序不仅链接到指定的URL,还代入一些参数。服务器根据这些参数筛选部分内容资源返回

    data:字典、字节序列或文件对象,作为Request的内容,增加到URL对应资源的主体内容中

    json:JSON格式的数据,作为Request的内容

    headers:字典,用于定制访问服务器的信息头,可将程序爬取行为模拟成浏览器的访问行为

    cookies:字典或CookieJar,Request中的cookie

    auth:元祖类型,支持HTTP认证功能

    files:字典类型,向服务器传送文件时使用的字段

    timout:设定超时时间,以秒为单位

    proxies:字典类型,设定访问代理服务器,以指定的IP地址访问网络

    allow_redirects:True/False,默认是True,是否可以进行重定向

    stream:True/False,默认是True,是否立即下载获取的内容

    verify:True/False,默认是True,是否认证SSL证书

    cert:保存本体SSL证书路径的相关设置

    Requests库提供的其他几个方法的参数都是上面13种,只是对有些方法来说,对比较常用的参数进行了显式定义,而没有把它们放在可选参数中。

    ②requests.get(url,params=None,**kwargs)

    ③requests.head(url,**kwargs)

    ④requests.post(url,data=None,json=None,**kwargs)

    ⑤requests.put(url,data=None,**kwargs)

    ⑥requests.patch(url,data=None,**kwargs)

    ⑦requests.delete(url,**kwargs)

     

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496netPython互联网爬虫与消息提取

    关键词:

上一篇:python全栈开荒,群集操作

下一篇:没有了