requests 自动化爬虫

153 阅读6分钟

爬虫程序开发环境

1 安装Requests库

1. 管理员权限打开命令行 
执行 pip install requests
2. pycharm下载

2 HTTP与Requests

2.1 了解HTTP协议

1. HTTP,Hypertext Transfer Protocol,超文本传输协议
2. HTTPrequ是一个基于“请求与响应”模式的,无状态的应用层协议
3. URL格式 http://host[:port][path]
    host:   合法的internet主机域名或IP地址
    port:   端口号,缺省端口号为 80
    path:   请求资源的路径
    如:
       http://www.bit.edu,cn
       http://220.182.111.188 
  URL是通过HTTP协议存取资源的internet路径,一个URL对应一个数据资源
4. HTTP协议对资源的操作
    GET             请求获取URL的资源
    HEAD            请求获取url位置资源的响应消息报告,即获取该资源的头部信息
    POST            请求向URL位置的资源后附加新的定向
    PUT             请求向URL位置储存一个资源,覆盖原URL位置的资源
    PATCH           请求局部更新URL位置的资源,即改变该处资源的部分内容
    DELETE          请求删除URL位置储存的资源
    options

2.2 Requests的主要方法

1. requests.request()   构造一个请求,是支撑以下各方法的基础方法,以下方法基于此方法封装
2. requests.get()       获取HTML网页的主要方法,对应于HTTP的GET
3. requests.head()      获取HTML网页头信息的方法,对应于HTTP的HEAD
4. requests.post()      向HTML网页提交POST请求的方法,对应于HTTP的POST
5. requests.put()       向HTML网页提交PUT请求的方法,对应于HTTP的PUT
6. requests.patch()     向HTML网页提交局部修改请求,对应于HTTP的PATCH
7. requests.delete()    向HTML网页提交删除请求,对应于HTTP的DELETE

2.3 Requests的主要方法使用

 1. request(method,url,**kwargs)
    method:             请求方式,对应get/put/post/head/patch/delete/options等
    url:                拟获取页面的url链接
    **kwargs:           控制访问的参数,共131.1 **kwargs:控制访问参数,均为可选项
    (1*)params   :字典或字节序列,作为参数增加到url中
        如: 
            payload = {'key1':'valuse1','key2':'value2'}
            r = requests.post('GET',url,data = payload)
            print(r.url)
            #打印 url?key1=value1&key2=value2 等同于ajax.get2*)data:    字典,字节序列或文件对象,作为Request的内容
        如:
            payload = {'key1':'valuse1','key2':'value2'}
            r = requests.post('POST',url,data = payload)
            body = '主题内容'
            r = requests.post('POST',url,data = body)
                --向url提交普通数据时自动放入form同级位
    (3*)json:    json格式的数据,作为Request的内容
        如:
            payload = {'key1':'valuse1','key2':'value2'}
            r = requests.post('POST',url,json = payload)
    (4*)headers: 字典,HTTP定制头
        如:
            hd = {'user-agent':'chrome/10'}
            r = requests.request('POST',url,headers=hd)
                #模拟浏览器向服务器发出访问
    (5)cookies: 字典或CookieJar,Request中的cookie
    (6)auth:    元组,支持HTTP认证功能
    (7)files:   字典类型,传输文件
        如:
            fs = {'file':open('data.xls','rd')}
            r = requests.request('POST',url,files=fs)
            # 向某个链接提交文件
    (8)timeout: 设定超时时间,单位秒
        如:
            r = requests.request('GET',url,timeout=30)
            # 30s内没有返回则产生timeout异常
    (9)proxies: 字典类型,设定访问代理服务器,可以增加登陆认证
        如:
            pxs = {'http':'http://user:pass@10.10.10.1.1234'
                   'https':'https://10.10.10.1.4321'}
            r = requests.request('GET',url,proxies=pxs)
            # 爬虫访问服务器时使用的ip地址就是代理服务器的ip地址,隐藏用户爬取网页原的ip地址,
            # 可以有效防止对爬虫的逆追踪
    (10)allow_redirects:    True/false,默认为True,重定向开关(表示是否允许对url进行重定向)
    (11)stream: True/'False,默认为True,获取内容立即下载开关(表示是否对获取的内容立即下载)
    (12)verify: True/False,默认为true,认证 SSL证书开关()
    (13)cert:   本地SSL证书路径
    
 2. head(url,**kwargs)方法
    **kwargs(同1.1)
    r = requests.head(url)
    r.headers
        #打印 {'Date': 'Fri, 16 Sep 2022 08:12:14 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Accept-Encoding', 'X5-Punish-Cache': 'miss', 'Cache-Control': 'no-store', 'Access-Control-Allow-Credentials': 'true', 'Set-Cookie': 'x5secdata=xb386181bd8f562f516314096dc617c13d1663315934a-717315356a471530493abaad2aaa__bx__p4psearch.1688.com%3A443%2Fp4p114%2Fp4psearch%2Foffer2.htm; Max-Age=20; Expires=Fri, 16-Sep-2022 08:12:34 GMT; Domain=1688.com; Path=/', 'bxpunish': '1', 'Server': 'Tengine/Aserver', 'EagleEye-TraceId': '2147b46e16633159345622664ebc78', 'Strict-Transport-Security': 'max-age=31536000', 'Timing-Allow-Origin': '*', 'Content-Encoding': 'gzip'}
    r.text
        #打印 ''<- 没错就是空的,不是我没写
    #优点,节省网络带宽
 3. post(url,data=None,json=None,**kwargs)方法
    data(同1.1的data访问控制参数)
    json(同1.1json访问控制参数)
    **kwargs(同1.1,data,json除外)
    
    payload = {'key1':'valuse1','key2':'value2'}
    r = requests.post(url,data = payload)
    print(r.text)
        #打印{
            ...
            "form":{
            'key1':'valuse1',
            'key2':'value2'
            },
        }
        # 向url提交键值对时自动放入form下
    r = requests.post(url,data = 'abc')
        #打印{
            ...
            "data":'abc',
            "form":{
            },
        }
        # 向url提交普通数据时自动放入form同级位置
 4. put(url,data=None,**kwargs)方法
    data(同1.1data访问控制参数)
    **kwargs(同1.1,data除外)
    
    与post()方法类似,会替换相应位置的原有数据
 5. get(url,params=None,**kwargs)方法
    params(同1.1的params访问控制参数)
    **kwargs(同1.1,params除外)
 6. delete(url,**kwargs)
    **kwargs(同1.1)

3. Requests的get方法

使用 r = requests.get(url,params=None,**kwargs)
    url:拟获取页面的url链接
    params:url中的额外参数,字典或字节流格式(可选)
    **kwargs:12个控制访问的参数(可选)

4. Response对象的属性

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

5. Requests使用的基本流程


1. 使用r.status_code      检查访问状态
2. 如果r.status_code=200  则使用 r.text,r.encoding,r.apparent_encoding,r.content解析
3. 如果r.status_code=404  本次访问出错

6. Requests库的异常


1. requests.ConnectionError     网络连接错误异常,如DNS查询失败/服务器的防火墙拒绝连接
2. requests.HTTPError           HTTP错误异常
3. requests.URLRequired         URL缺失异常
4. requests.TooManyRedirects    超出最大重定向次数,产生重定向异常
5. requests.ConnectTimeout      连接远程服务器超时异常(从连接远程服务器时开始的时间)
6. requests.Timeout             请求URL超时时,产生超时异常(全过程的总时间)

7. 爬取网页的通用代码框架

import requests

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

8. 网络爬虫的限制

1.来源审查: 判断User-Agent进行限制
    ·检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫的访问
    ·属于技术限制
2.发布公告: Robots协议
    ·告知所有爬虫网站的爬取策略,要求爬虫遵守
    ·是否遵守有爬虫自身来决定
    ·属于道德限制
3. Robots协议
    全称 Robots Exclusion Standard 网络爬虫排除标准
    作用 网站告知所有爬虫那些页面可以抓取,那些不行
    形式 在网站根目录下的robots.txt
    例如:
        user-agent:*                    * 表示所有的爬虫
        Disallow:/?*                    表示不能访问以?开头的路径  
        Disallow:/pop/*.html            表示不能访问符合/pop/*.html的页面
        Disallow:/pinpai/*.html?*       表示不能访问符合/pinpai/*.html?*的页面
        
        user-agent:HuihuiSpider         表示HuihuiSpider爬虫
        Disallow:/                      表示不允许爬取网站的任何资源
        user-agent:GwdangSpider
        Disallow:/
        user-agent:WochachSpider
        Disallow:/