• --爬虫梳理--


    一、爬虫

    Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

    Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。

    二、基本操作requests

    常用的request请求方式:

    1.GET请求

    方式一、
    r1 = requests.get('https://github.com/login') #请求的登录页面,
    
    print(r1.text) #通过请求,获取html页面,以字符串的方式返回
    
    
    方式二、
    
    import requests
      
    payload = {'key1': 'value1', 'key2': 'value2'}
    ret = requests.get("http://httpbin.org/get", params=payload)
      
    print(ret.url)#打印请求的url
    print(ret.text)
    

      

    2.POST请求

    # 1、基本POST实例
      
    import requests
      
    payload = {'key1': 'value1', 'key2': 'value2'}
    ret = requests.post("http://httpbin.org/post", data=payload)
      
    print ret.text
      
      
    # 2、发送请求头和数据实例
      
    import requests
    import json
      
    url = 'https://api.github.com/some/endpoint'
    payload = {'some': 'data'}
    headers = {'content-type': 'application/json'}
      
    #请求发送的数据,需加上headers,默认是自带的...
    ret = requests.post(url, data=json.dumps(payload), headers=headers)
      
    print(ret.text)
    print(ret.cookies)#通过cookies再去访问站内其他的页面
    

      

    3.其他的请求方式:

    requests.get(url, params=None, **kwargs)
    requests.post(url, data=None, json=None, **kwargs)
    requests.put(url, data=None, **kwargs)
    requests.head(url, **kwargs)
    requests.delete(url, **kwargs)
    requests.patch(url, data=None, **kwargs)
    requests.options(url, **kwargs)
      
    # 以上方法均是在此方法的基础上构建
    requests.request(method, url, **kwargs)
    

      

    4.其他参数的示例:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import requests
    
    def _method_url():
        '''
        method:请求的类型
        url:请求的路径
        :return:
        '''
        response = requests.request(method='post', url='http://www.baidu.com')
    
    
    def _param():
        # - 可以字典方式
        # - 可以是字符串方式
        # - 可以字节方式
    
        r1 = requests.get(
            url='htpp://www.baidu.com',
            params={"user": "yang", "pwd": "123"}
        )  # - --字典方式
    
        r2 = requests.get(
            url='htpp://www.baidu.com',
            params="user=yang&pwd=123"
        )  # - --字符串方式
    
        r3 = requests.get(
            url='htpp://www.baidu.com',
            params=bytes("user=yang&pwd=123", encoding='utf-8')
        )  # ---字节方式
    
        #编码报错...
        r4 = requests.request(method='get',
        url='http://www.baidu.com',
        params=bytes("k1=v1&k2=水电费&k3=v3&k3=vv3", encoding='utf8'))
    
    
    def _data():
        '''
        post:只有psot发送请求才可data
        :return:
        '''
        # 可以是字典
        # 可以是字符串
        # 可以是字节
        # 可以是文件对象
    
        r1 = requests.post(
            url='htpp://www.baidu.com',
            data={
                "user": "yangxiang",
                "commit": "sing in",
            }
        ) #- --字典方式
    
        r2 = requests.post(
            url='htpp://www.baidu.com',
            data="user=yang;pwd=123"
        ) #- --字符串方式, 以;分割,
    
        r3 = requests.post(
            url='htpp://www.baidu.com',
            data=bytes("user=yang;pwd=123", encoding='utf-8')
        ) #- --字符串方式, 以;分割
    
        r4 = requests.post(
            url='htpp://www.baidu.com',
            data=open('data.file.py', mode='r', encoding='utf-8')  # 文件内容需要是k1=v1;k2=v2;k3=v3;k3=v4
        ) #- --文件传输方式, 以;分割
    
    
    def _json():
        #将json中对应的数据进行序列化成一个字符串,json.dumps(....)
        #然后发送到服务端的body中,并且Content-Type是{'Content-Type': 'application/json'}
        r1 = requests.post(
            url = 'http://www.baidu.com',
            json={'k1':'v1','k2':'v2'},
        )
    
    
    def _headers():
        #发送请求头到服务端
        #请求头的方式Content-Type是{'Content-Type': 'application/x-www-form-urlencoded'}
        r1 = requests.post(
            url='http://www.baidu.com',
            json={'k1': 'v1', 'k2': 'v2'},
            headers={'Content-Type': 'application/x-www-form-urlencoded'}
        )
    
    
    def _cookies():
        #发送cookies到服务端
        r1 = requests.post(
            url='http://www.baidu.com',
            data={
                "user": "yangxiang",
                "commit": "sing in",
            },
            cookies={'cookie':'value'}
        )
    
        #也可以使用cookiesJar(字典形式就是在此基础上封装的)
        from http.cookiejar import CookieJar
        from http.cookiejar import Cookie
    
        obj = CookieJar()
        obj.set_cookie(Cookie(version=0, name='c1', value='v1', port=None, domain='', path='/', secure=False, expires=None,
                              discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False,
                              port_specified=False, domain_specified=False, domain_initial_dot=False, path_specified=False)
                       )
        requests.request(method='POST',
                         url='http://127.0.0.1:8000/test/',
                         data={'k1': 'v1', 'k2': 'v2'},
                         cookies=obj)
    
    
    def _files():
    
        # 发送文件
        file_dict = {
        'f1': open('readme', 'rb')
        }
        requests.request(method='POST',
        url='http://127.0.0.1:8000',
        files=file_dict)
    
        # 发送文件,定制文件名
        file_dict = {
        'f1': ('test.txt', open('readme', 'rb'))
        }
        requests.request(method='POST',
        url='http://127.0.0.1:8000',
        files=file_dict)
    
        # 发送文件,定制文件名
        file_dict = {
        'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf")
        }
        requests.request(method='POST',
        url='http://127.0.0.1:8000',
        files=file_dict)
    
        # 发送文件,定制文件名
        file_dict = {
            'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf", 'application/text', {'k1': '0'})
        }
        requests.request(method='POST',
                         url='http://127.0.0.1:8000',
                         files=file_dict)
    
    
    def _auth():
        '''基本的验证方式'''
        from requests.auth import HTTPBasicAuth,HTTPDigestAuth
    
        res = requests.get('https://api.github.com/user',
                           auth=HTTPBasicAuth('yang','efsdfsadf'))
        print(res.text)
    
        # ret = requests.get('http://192.168.1.1',
        # auth=HTTPBasicAuth('admin', 'admin'))
        # ret.encoding = 'gbk'
        # print(ret.text)
    
        # ret = requests.get('http://httpbin.org/digest-auth/auth/user/pass', auth=HTTPDigestAuth('user', 'pass'))
        # print(ret)
        #
    
    
    def _timeout():
        #访问超时时间
        # res = requests.get('http://www.baidu.com',timeout=2)
        # print(res)
    
        res = requests.get('http://www.baidu.com',timeout=(5,1))
        print(res)
    
    
    def _allow_redirects():
        '''是否允许重定向  allow_redirects=False'''
        ret = requests.get('http://www.baidu.com', allow_redirects=False)
        ret.encoding = ret.apparent_encoding
        print(ret.text)
    
    
    def _proxies():
        '''
        代理,
        通过ip的限制,网站会根据ip访问的次数进行限制登录,
        那么就需要代理,获取和诺ip来进行访问
        '''
        proxies = {
        "http": "61.172.249.96:80",
        "https": "http://61.185.219.126:3128",
        }
    
        proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
    
        ret = requests.get("http://www.proxy360.cn/Proxy", proxies=proxies)
        print(ret.headers)
    
    
        from requests.auth import HTTPProxyAuth
    
        proxyDict = {
        'http': '77.75.105.165',
        'https': '77.75.105.165'
        }
        auth = HTTPProxyAuth('username', 'mypassword')
    
        r = requests.get("http://www.google.com", proxies=proxyDict, auth=auth)
        print(r.text)
    
    
    def _stream():
        #流的方式,超大文件,一点一点的接收
        ret = requests.get('http://127.0.0.1:8000/test/', stream=True)
        #可以打开一个文件,一点一点的写入...
        print(ret.content)
        ret.close()
    
        # 自动关闭上下文..
        from contextlib import closing
        with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
            # 在此处理响应。
            for i in r.iter_content():
                print(i)
    
    
    def _session():
    
        session = requests.Session()
    
        ### 1、首先登陆任何页面,获取cookie
    
        i1 = session.get(url="http://dig.chouti.com/help/service")
    
        ### 2、用户登陆,携带上一次的cookie,后台对cookie中的 gpsd 进行授权
        i2 = session.post(
            url="http://dig.chouti.com/login",
            data={
                'phone': "8615131255089",
                'password': "xxxxxx",
                'oneMonth': ""
            }
        )
    
        i3 = session.post(
            url="http://dig.chouti.com/link/vote?linksId=8589623",
        )
        print(i3.text)
    

      

     三、BeautifulSoup的基本方法操作

    使用示例:

    html_doc = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
        <a href='#' class='c1'>123</a>
    </body>
    </html>
    """
    
    soup = BeautifulSoup(html_doc, features="lxml")

    1. name(标签名称)

    tag = soup.find('a')
    name = tag.name # 获取标签名称
    print(name)
    tag.name = 'span' # 设置标签
    print(soup)
    

      

    2.attr(标签属性)

    tag = soup.find('a')
    attrs = tag.attrs
    print(attrs) #获取标签的属性
    #两种设置标签属性的方式
    tag.attrs = {'id':'i1'}
    tag.attrs['id'] = 'i1'
    print(soup)
    

      

    3.children,所有子标签

    body = soup.find('body')
    v = body.children
    print(v)
    print([ v for i in v])
    

     

    4.children,获取子子孙孙的所有标签

    body = soup.find('body')
    v = body.descendants
    print(v)
    

      

    5.clear,将标签的所有子标签全部清空(保留标签名)

    tag = soup.find('body')
    tag.clear()#清除所有的子标签
    print(soup)
    

      

    6.decpmpose,递归的删除所有的标签

    body = soup.find('body')
    body.decompose()
    print(soup)
    

      

    7.extract,递归的删除所有的标签,并获取删除的标签

    body = soup.find('body')
    v = body.extract()
    print(v) #获取删除的标签
    # print(soup) #删除后的html
    

      

    8.decode,转换为字符串(含当前标签)

    decode_contents(不含当前标签)

    body = soup.find('body')
    v = body.decode()
    print(v)
    v = body.decode_contents()
    print(v)
    

      

    9.encode,转换为字节(含当前标签)

    encode——contents(不含当前标签)

    body = soup.find('body')
    v = body.encode()
    v = body.encode_contents()
    print(v)
    

      

    10.find,获取匹配的第一个标签

    tag = soup.find('a')
    print(tag)
    tag = soup.find(name='a', attrs={'class': 'c1'}, recursive=True, text='123')
    #class_:属性也可以这么的去找。也可通过attrs去查找
    # tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
    print(tag)
    

      

    未完待续.......

  • 相关阅读:
    转载-python生成sjf
    111111111111
    【MySQL】使用硬链接的方式删除大表
    【Python】公共类-获取MySQL数据
    【Python】公共类-logger
    文件IO --- sync、fsync、fdatesync
    【Mongo】安装Mongo并配置副本集
    【MySQL】InnoDB 内存管理机制 --- Buffer Pool
    【MySQL】redo log --- 刷入磁盘过程
    Linux 系统的安装
  • 原文地址:https://www.cnblogs.com/yangxiang1/p/7444301.html
Copyright © 2020-2023  润新知