• 第一课:网络爬虫准备


    一、本课知识路线

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

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

      3、BeautifulSoup框架:解析HTML页面

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

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

    #抓取百度页面
    import requests
    
    r = requests.get('http://www.baidu.com')
    print(r.status_code)   #状态码,抓取成功200
    r.encoding = 'utf-8'  #把编码改为utf-8
    print(r.text)          #输出抓取内容

    二、Requests库的七个主要方法

    1、requests.request(method,url,**kwargs):构造一个请求,支持以下方法的基础方法

      method:请求方式,对应GETPOSTPUTHEADPATCHdeleteOPTIONS7种

      url:获取的页面的URL连接

      **kwargs:控制访问的参数,共13个(可选):

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

    import requests
    
    url = 'http://httpbin.org/post'
    
    payload = {'key1':'value1','key2':'value2'}
    
    r = requests.get(url, params = payload)
    
    print(r.url) #http://httpbin.org/post?key1=value1&key2=value2

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

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

      4、headers:字典,HTTP定制头

    import requests
    
    url = 'http://httpbin.org/post'
    
    payload = {'user-agent':'Chrome/10'}
    
    r = requests.request('POST',url,headers=payload)  #修改agent

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

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

      7、files:字典类型,传输文件

    import requests
    
    url = 'http://httpbin.org/post'
    
    fs = {'file':open('data.xls','rb')}
    
    r = requests.request('POST',url,files=fs) #向页面传输文件

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

    import requests
    
    url = 'http://httpbin.org/post'
    
    
    r = requests.request('GET',url,timeout = 10)

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

    import requests
    
    url = 'http://httpbin.org/post'
    pxs = {'http':'http://user:pass@10.10.10.1:1234','http':'http://10.10.10.1:1234'} #设置两个代理服务器
    
    r = requests.request('GET',url,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(url,params=None,**kwargs):获取HTML页面的主要方法,对应HTTP的GET

      url:获取页面的url链接

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

      **kwargs:12控制访问参数,可选

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

      2、函数返回一个包含服务器资源的Response对象

      说明:Response对象

    import requests
    
    response = requests.get('http://www.baidu.com')
    
    print(response.status_code)   #200
    
    print(response.encoding)     #ISO-8859-1
    
    print(response.apparent_encoding)    #utf-8
    
    response.encoding = response.apparent_encoding
    print(response.headers)

      Response对象属性

      1、r.status_code:HTTP请求的返回状态,200表示连接成功,404表示失败或者其他

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

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

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

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

       

    3、requests.head(url,**kwargs(13个参数)):获取HTML页面的头部信息方法,对应HTTP的HEAD

    import requests
    
    url = 'http://www.baidu.com'
    
    r = requests.head(url)
    
    print(r.headers)
    
    print(r.text) #无输出内容

    4、requests.post(url,data=None,json=None,**kwargs(11个可选参数)):向HTML页面提交POST请求方法,对应HTTP的POST

    import requests
    
    url = 'http://httpbin.org/post'
    
    payload = {'key1':'value1','key2':'value2'}
    
    r = requests.post(url, data = payload) #向URL POST一个字典,自动编码为form表单
    
    print(r.text)

    import requests
    
    url = 'http://httpbin.org/post'
    
    r = requests.post(url, data = 'abc') #向URL POST一个字符串,自动编码为data
    print(r.text)

    5、requests.put(url,data=None,**kwargs(12可选参数)):向HTML页面提交PUT请求方法,对应HTTP的PUT

      put方法与post方法一样,区别在于put方法会把原有数据覆盖

    6、requests.patch(url,data=None,**kwargs(12可选参数)):向HTML页面提交局部修改请求方法,对应HTTP的PATCH

    7、requests.delete(url,**kwargs(13个可选参数)):向HTML页面提交删除请求方法,对应HTTP的DELETE

    三、Requests库的异常

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

     

     

     

     

    r.raise_for_status():Requests异常方法,返回200则抓取正常,如果不是200,产生异常requests.HTTPError

    四、爬虫网页的通用代码框架

    import requests
    def getHTMLText(url):
        try:
            response = requests.get(url,timeout=30) #返回Response对象
            response.raise_for_status() #如果状态不是200,则产生HTTPError异常,跳转运行except处代码
            response.encoding = response.apparent_encoding  #保证页面编码正确
            return response.text  #返回抓取内容
        except:
            return '产生异常!'
    
    if __name__ == '__main__':
        url = 'http://www.baidu.com'
        print(getHTMLText(url))

    五、HTTP协议:Hypertext Transfer Protocol,超文本传输协议

     HTTP是一个基于'请求与响应'模式的、无状态的应用层协议;一般采用URL用为定位网络资源的标识。

     URL格式: http:host[:port][path]

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

      port:端口号,可省略,默认为80

      path:请求资源的路径

     HTTP协议对资源的操作方法

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

     六、作业:Requests库的爬取性能分析

    尽管Requests库功能很友好、开发简单(其实除了import外只需一行主要代码),但其性能与专业爬虫相比还是有一定差距的。请编写一个小程序,“任意”找个url,测试一下成功爬取100次网页的时间。(某些网站对于连续爬取页面将采取屏蔽IP的策略,所以,要避开这类网站。)

    import requests
    import time
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout = 10)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return 'Error'

    if __name__ == '__main__': url = 'http://www.bilibili.com' print('start the test:') start_time = time.clock() for i in range(100): getHTMLText(url) end_time = time.clock() print('Total runing time:%s' %(end_time-start_time)) #Total runing time:114.73649717934875
    #作业
    #1、爬虫京东
    import requests
    url = 'https://item.jd.com/2357091.html'
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(r.text[:1000])
        print(r.request.headers) #{'User-Agent': 'python-requests/2.13.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
    except:
        print('Error')
    
    
    #2、爬虫amzon
    import requests
    
    url = 'https://www.amazon.cn/dp/B004DCV1FO'
    
    try:
        kv = {'User-Agent':'Mozilla/5.0'}
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(r.status_code)
        print(r.request.headers)
        r = requests.get(url,headers = kv)
        print(r.status_code)
        print(r.request.headers)
    except:
        print(r.status_code)
    /*
    200
    {'User-Agent': 'python-requests/2.13.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
    200
    {'User-Agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
    */
    
    #3、向百度与其360提交搜索关键字
    import requests
    
    try:
        r = requests.get('http://www.baidu.com/s',params={'wd':'Python'})
        print(r.request.url) #http://www.baidu.com/s?wd=Python
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(len(r.text))
    except:
        print('Error')
    
    
    import requests
    
    try:
        keyword = 'Python'
        kv = {'q':keyword}
        r = requests.get('https://www.so.com/s',params=kv)
        print(r.request.url) #https://www.so.com/s?q=Python
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(len(r.text))
    except:
        print('error')
    
    
    #作业5查ip归属
    import requests
    
    url = 'http://www.ip138.com/ips138.asp?ip='
    
    try:
        r = requests.get(url + '114.116.113.46')
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(r.text)
    except:
        print('error')
    #4爬取保存图片
    import requests
    import os
    
    url = 'http://p1.so.qhimgs1.com/bdr/326__/t01d9dff613f7d05381.jpg'
    root = 'D://pics//'
    path = root + os.path.basename(url) #os.path.basename(path)  返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    #path = root + url.split('/')[-1]
    try:
        if not os.path.exists(root): #os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
            os.mkdir(root)
        if not os.path.exists(path):
            r = requests.get(url)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            with open(path,'wb') as f:
                f.write(r.content)
                print('文件保存成功')
        else:
            print('文件存在')
    except:
        print('爬取失败')
  • 相关阅读:
    PGsql 基本用户权限操作
    Node.js版本管理工具 nvm
    js 数字前面自动补零
    浮点数向偶数舍入的问题 Round-to-Even for Floating Point
    Linux 目录下属性查看操作
    C语言之Bit-wise Operation和Logical Operation
    (转)SqlBulkCopy批量复制数据
    (转)VS2010启动调试时老是提示正在下载公共符号
    转 SVN 在vs中的使用
    (转)关于 HTTP meta 的 IE=edge 说明
  • 原文地址:https://www.cnblogs.com/jp-mao/p/6673393.html
Copyright © 2020-2023  润新知