• 爬虫基础一


    Requests库

    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的DELETE

    Response对象的属性

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

    理解Requests库的异常

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

    Request类

    属性或方法说明
    .url Request对应的请求url地址
    .method 对应的请求方法,'GET','POST'等
    .headers 字典类型风格的请求头
    .body 请求内容主体,字符串类型
    .meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用
    .copy() 复制该请求

    HTTP协议

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

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

    爬取实例

    import requests
    url = 'https://www.amazon.cn/gp/product/b01MBL5Z3Y'
    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('获取失败')
    View Code

    图片爬取

    import requests
    path = 'D:/图片/abc.jpg'
    kv = {'user-agent':'Mozilla/5.0'}
    url = 'https://inews.gtimg.com/newsapp_bt/0/10881420534/1000'
    r = requests.get(url,headers=kv)
    with open(path,'wb') as f:
        f.write(r.content)
        f.close()
    View Code

    Beautiful Soup库

    Beautiful Soup库解析器

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

    Beautiful Soup类的基本元素

    基本元素说明
    Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
    Name 标签的名字,<p>...</p>的名字是'p',格式:<tag>.name
    Attributes 标签的属性,字典形式组织,格式:<tag>.attrs
    NavigableString 标签内非属性字符串,<>...</>中字符串,格式:<tag>.string
    Comment 标签内字符串的注释部分,一种特殊的Comment类型

    标签树的平行遍历

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

    三种信息标记形式的比较

    • XML:最早的通用信息标记语言,可扩展性好,但繁琐
    • JSON:信息有类型,适合程序处理(js),较XML简洁
    • YAML:信息无类型,文本信息比较比例最高,可读性好

    中国大学排名实例

    import requests
    from bs4 import BeautifulSoup
    import bs4
    
    
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ''
    
    
    def fillUnivList(ulist, html):
        soup = BeautifulSoup(html, 'html.parser')
        for tr in soup.find('tbody').children:
            if isinstance(tr, bs4.element.Tag):
                tds = tr('td')
                ulist.append([tds[0].string, tds[1].string, tds[2].string])
    
    
    def printUnivList(ulist, num):
        print('{:^10}	{:^6}	{:^10}'.format('排名', '学校', '总分',chr(12288)))
        for i in range(num):
            u = ulist[i]
            print('{:^10}	{:^6}	{:^10}'.format(u[0], u[1], u[2]))
    
    
    if __name__ == '__main__':
        uinfo = []
        url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
        html = getHTMLText(url)
        fillUnivList(uinfo,html)
        printUnivList(uinfo,20)
    View Code

    Re库

    正则表达式的常用操作符

    操作符说明实例
    . 表示任何单个字符  
    [] 字符集,对单个字符给出取值范围 [abc]表示a,b,c,[a-z]表示a到z单个字符
    [^] 非字符集,对单个字符给出排除范围 [^abc]表示非a或b或c的单个字符
    * 前一个字符0次或无限次扩展 abc*表示ab,abc,abcc,abccc等
    + 前一个字符1次或无限次扩展 abc+表示abc,abcc,abccc等
    ? 前一个字符0次或1次扩展 abc?表示ab,abc
    | 左右表达式任意一个 abc|def表示abc,def
    {m} 扩展前一个字符m次 ab{2}c表示abbc
    {m,n} 扩展前一个字符m至n次(含n) ab{1,2}c表示abc,abbc
    ^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头
    $ 匹配字符串结尾 abc$表示abc且在一个字符串的结尾
    () 分组标记,内部只能使用|操作符 (abc)表示abc,(abc|def)表示abc,def
    d 数字,等价于[0-9]  
    w 单词字符,等价于[A-Za-z0-9_]  

    正则表达式实例

    ^[A-Za-z]+$ 由26个字母组成的字符串
    ^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串
    ^-?d+$ 整数形式的字符串
    ^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
    [1-9]d{5} 中国境内邮政编码,6位
    [u4e00-u9fa5] 匹配中文字符

    Re库主要功能函数

    函数说明
    re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
    re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
    re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
    re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
    re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
    re.sub 在一个字符串中替换所有匹配正则表达式的字串,返回替换后的字符串

    最小匹配操作符

    操作符说明
    *? 前一个字符0次或无限次扩展,最小匹配
    +? 前一个字符1次或无限次扩展,最小匹配
    ?? 前一个字符0次或1次扩展,最小匹配
    {m,n}? 扩展前一个字符m至n次(含n),最小匹配
  • 相关阅读:
    OpenStack网卡桥接问题
    Linux DD添加swap分区
    OpenStack KVM嵌套虚拟化的配置
    OpenStack KVM嵌套虚拟化的配置
    received packet with own address as source address
    mysql ERROR 1040 (08004): Too many connections
    openstack以其他tenant用户创建实例
    OpenStack Controller HA (3)
    OpenStack Controller HA (2)
    OpenStack controller HA
  • 原文地址:https://www.cnblogs.com/caozhenghua/p/11997150.html
Copyright © 2020-2023  润新知