天天看点

Python网络爬虫与信息提取——网络爬虫规则(Requests篇)

第二章 网络爬虫之规则(Requests篇)

●Requests库入门

  • 特点:简单、简洁,一行代码即可从网站上获取资源。
  • 安装方法:CMD窗口->pip install requests
  • Requests库的主要方法:
    Python网络爬虫与信息提取——网络爬虫规则(Requests篇)

    1、requsets.request()方法

      使用格式:requests. request(method, url, **kwargs)

               -method:请求方式,对应HTTP协议GET PUT/POST等7种请求功能

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

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

      **kwargs参数:

    1)params:字典或字节序列,作为参数增加到url中,带入参数访问url;

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

  2)data:字典、字节序列或文件对象,作为 Request的内容,向服务器提供、提交资源时使用;

>>> kv ={'key1':'valuel','key2':'value2'}
  		>>> r=requests.request('POST','http://python123.io/ws',data=kv)
  		>>> body = '主题内容'
  		>>> r=requests.request('POST','http://python123.io/ws',data=body)
           

  3)json:JSON格式的数据,作为Request的內容;

>>> kv ={'key1':'valuel','key2':'value2'}
		>>> r=requests.request('POST','http://python123.io/ws',json=kv)
           

  4)headers:字典,HTTP定制头,访问HTTP协议头;

>>> hd={'user-agent':'Chrome/10'}
		>>> r=requests.request('POST','http://python123.io/ws',headers=hd)
           

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

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

  7)files:字典类型,传输文件,向链接提交文件;

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

  8)timeout:设定超时时间,秒为单位,时间内请求内容未反馈,生成timeout异常;

  9)proxies:字典类型,设定访问代理服务器,可以增加登录认证,有效隐藏爬取网站原IP,防止逆追踪;

>>>pxs={'http':'http://user:[email protected]:1234'
                'https':'https://10.10.10.1:4321'} 
        >>> r=requests.request('GET','http://python123.io/ws',proxies=pxs)                 
           

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

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

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

  13)cert:本地SSL证书路径。

  2、requests.get()方法

    使用格式:requests.get(url, params=None, **kwargs)

           -url:拟获取页面的ur链接

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

           -kwargs:12个控制访问的参数,除params

    实现原理:get(url)构造一个向服务器请求资源的Request对象,返回一个包含服务器资源的Response对象,即Response对象包含爬虫返回的内容。

  Response对象属性:

Python网络爬虫与信息提取——网络爬虫规则(Requests篇)

    r.apparent_encoding的编码比r.encoding更加准确。

   ‘utf-8’编码方式可解析中文,ISO-8859-1编码方式不可解析中文。

  3、requests.head()方法

   使用格式:requests.head(url, **kwargs)

           -url:拟获取页面的ur链接

           -kwargs:13个控制访问的参数

  4、requests.post()方法

    使用格式:requests.post(url, data=None,json=None,**kwargs)

           -url:拟更新页面的ur链接

           -data:字典、字节序列或文件, Request的内容

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

           -kwargs:11个控制访问的参数,除data、json

  5、requests.put()方法

    使用格式:requests.put(url, data=None,**kwargs)

           -url:拟更新页面的ur链接

           -data:字典、字节序列或文件, Request的内容

           -kwargs:12个控制访问的参数,除data

  6、requests.patch()方法

    使用格式:requests.patch(url, data=None,**kwargs)

           -url:拟更新页面的ur链接

           -data:字典、字节序列或文件, Request的内容

           -kwargs:12个控制访问的参数,除data

  7、requests.delete()方法

    使用格式:requests.delete(url, **kwargs)

           -url:拟删除页面的ur链接

           -kwargs:13个控制访问的参数

  • 爬取网页的通用代码框架:

      1、Requests库的异常:

    Python网络爬虫与信息提取——网络爬虫规则(Requests篇)

       处理异常方法:r.raise_for_status() —如果不是200,产生异常 requests.HTTPError

      2、爬取网页的通用代码框架:

    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协议:

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

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

       -“请求与响应”模式:用户发送请求,服务器做相关响应

        -无状态:第一次请求与第二次请求之间无关联

       -应用层:该协议工作在TCP协议之上

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

       1) URL格式:http://host[:port][path]

                   -host:合法的Internet主机域名或IP地址

                   -port:端口号,缺省端口为80

                   -path:请求资源的路径

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

     4、HTTP协议对资源的操作:

    Python网络爬虫与信息提取——网络爬虫规则(Requests篇)

       1)PUT与PATCH区别:

         采用PATCH,仅向URL提交局部数据更新请求,可节省网络带宽。

         采用PUT,必须将所以数据一并提交到URL,未提交数据被删除。

       2)HEAD方法用很少的网络流量,获取网络资源的概要信息。

       3)POST方法向服务器提交新增数据,向URL POST一个字典、键值对自动编码为form(表单)。

●网络爬虫的盗亦有道

  • 网络爬虫的尺寸
    规模 特点 开发 应用范围
    小规模 数据量小,爬取速度不敏感 Requests库 爬取网页,玩转网页
    中规模 数据规模较大,爬取速度敏感 Scrapy库 爬取网页,爬取系列网站
    大规模 搜索引擎,爬取速度关键 定制开发 爬取全网
  • 爬虫引起的问题

      1)网络爬虫的“骚扰”:受限于编写水平和目的,网络爬虫将会为web服务器带来巨大的资源开销;

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

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

  • 网络爬虫的限制

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

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

      2)发布公告: Robots协议

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

        Robots协议(Robots exclusion standard网络爬虫排除标准):

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

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

        基本语法: User-agent:*

               Disallow:/

               #注释,*代表所有,/代表根目录

        使用:

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

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

    访问量很小:可以遵守;访问量较大:建议遵守 非商业且偶尔:建议遵守;商业利益:必须遵守 必须遵守
    爬取网页,玩转网页 爬取网页,爬取系列网站 爬取全网

●Requests库网络爬虫实战

  • 京东商品信息获取:
    Python网络爬虫与信息提取——网络爬虫规则(Requests篇)
    import requests
    			url="https://item.jd.com/2967929.html"
    			try:
    			    r = requests.get(url)
    			    r.raise_for_status()
    			    r.encoding=r.apparent_encoding
    			    print(r.text[: 1000])
    			except:
    			    print("爬取失败")
               
  • 亚马逊商品信息获取(通过判断对网站访问的App头部headers,对网络爬虫限制):
    Python网络爬虫与信息提取——网络爬虫规则(Requests篇)
    import requests
    			url="https://www.amazoncn/gp/product/bo1m8l5z3y"
    			try:
    			    kv = {'user-agent':'Mozilla/5.0'}
    			    r = requests.get(url, headers=kv)
    			    r.raise_for_status()
    			    r.encoding = r.apparent_encoding
    			    print(r.text[1000: 2000])
    			except:
    			    print("爬取失败")
               
  • 百度、360搜索关键词提交:

     搜索引擎关键词提交接口,修改keyword向搜索引擎提交关键词

      百度的关键词接口:

        http://www.baidu.com/s?wd=keyword

      360的关键词接囗:

        http://www.so.com/s?q=keyword

    import requests
    			keyword ="Python"
    			try:
    			    kv ={'wd': keyword}
    			    r = requests.get("http://www.baiducom/s",params=kv)
    			    print(r.request.url)
    			    r.raise_for_status()
    			    print (len(r.text))
    			except:
    		    	print("爬取失败")	
               
  • 网络图片爬取:

      网络图片链接的格式:http://www.example.com/picture.jpg

    import requests
    			import os
    			url="https://up.enterdesk.com/edpic_360_360/5c/d8/1e/5cd81eca3361148bdf4a528964a4ff9f.jpg"
    			path = "F:\\"+url.split('/')[-1]
    			print(path)
    			try:
    			    if not os.path.exists(path):
    			        r = requests.get(url)
    			        print(r)
    			        with open(path, 'wb')as f:
    			            f.write(r.content)
    			            print("文件保存成功")
    			            f.close()
    			    else:
    			        print("文件已存在")
    			except:
    			    print("爬取失败")
               
  • IP地址归属地的自动查询:

      python不具有查询IP地址归属地的功能库,通过网络资源实现。比如:http://m.ip138.com

    Python网络爬虫与信息提取——网络爬虫规则(Requests篇)
    import requests
    url="http://m.ip138.com/ip.asp?ip="
    try:
        r = requests.get(url+'202.204.80.112')
        r.raise_for_status()
        r.ncoding =r.apparent_encoding
        print(r.text[-500:])
    except:
        print("爬取失败")