--爬蟲梳理--

1、爬蟲

Python標準庫中提供了:urllib、urllib二、httplib等模塊以供Http請求,可是,它的 API 太渣了。它是爲另外一個時代、另外一個互聯網所建立的。它須要巨量的工做,甚至包括各類方法覆蓋,來完成最簡單的任務。html

Requests 是使用 Apache2 Licensed 許可證的 基於Python開發的HTTP 庫,其在Python內置模塊的基礎上進行了高度的封裝,從而使得Pythoner進行網絡請求時,變得美好了許多,使用Requests能夠垂手可得的完成瀏覽器可有的任何操做。python

2、基本操做requests

經常使用的request請求方式:git

1.GET請求github

方式1、
r1 = requests.get('https://github.com/login') #請求的登陸頁面,

print(r1.text) #經過請求,獲取html頁面,以字符串的方式返回


方式2、

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請求json

# 一、基本POST實例
  
import requests
  
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://httpbin.org/post", data=payload)
  
print ret.text
  
  
# 二、發送請求頭和數據實例
  
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.其餘的請求方式:api

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()

    ### 一、首先登錄任何頁面,獲取cookie

    i1 = session.get(url="http://dig.chouti.com/help/service")

    ### 二、用戶登錄,攜帶上一次的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)

  

 3、BeautifulSoup的基本方法操做

使用示例:cookie

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(標籤屬性)session

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)

  

未完待續.......

相關文章
相關標籤/搜索