1. 程式人生 > 實用技巧 >爬蟲入門一 基礎知識 以及request

爬蟲入門一 基礎知識 以及request


title: 爬蟲入門一 基礎知識 以及request
date: 2020-03-05 14:43:00
categories: python
tags: crawler

爬蟲整體概述,基礎知識。
requests庫的學習

1.request

Requests 是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫
http://docs.python-requests.org/en/latest/

1.1

import requests
                 r=requests.get("http://www.whu.edu.cn/ ")   #返回reponse物件
                 print(r.status_code)   
   返回值為200時,表明執行正常

輸入:r.text  得到網頁內容

HTTP狀態碼

200 成功/正常
404
503
…

1.2 http header

https://www.jianshu.com/p/6f29fcf1a6b3
HTTP(HyperTextTransferProtocol)即超文字傳輸協議,目前網頁傳輸的的通用協議。HTTP協議採用了請求/響應模型,瀏覽器或其他客戶端發出請求,伺服器給與響應。就整個網路資源傳輸而言,包括message-header和message-body兩部分。

根據維基百科對http header內容的組織形式,大體分為Request和Response兩部分。

Header中有charset (字符集,也就是編碼方式)
r.encoding是從HTTP header中猜測的響應內容編碼方式,如果header中不存在charset,則認為編碼為‘ISO-8859-1’(無法解析中文字元)
r.apparent_encoding是requests根據網頁內容分析出來的

輸入“r.encoding ” 檢視該網頁編碼方式為'ISO-8859-1‘
輸入“r.apparent_encoding”檢視網頁編碼為'utf-8‘
輸入“r.encoding=r.apparent_encoding”
再輸入“r.text”,可以發現網頁內容變為可以看懂的字元

1.3 異常

遇到網路問題(如:DNS查詢失敗、拒絕連線等)時,Requests會丟擲一個ConnectionError 異常。
遇到罕見的無效HTTP響應時,Requests則會丟擲一個 HTTPError 異常。
若請求超時,則丟擲一個 Timeout 異常。
若請求超過了設定的最大重定向次數,則會丟擲一個 TooManyRedirects 異常。
所有Requests丟擲的異常都繼承自 requests.exceptions.RequestException 。

1.4 通用框架

注意 
Try
Exception
R.raise_for_status()

def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()  # 如果狀態不是200,引發error異常
        # print("%d\n %s" % (r.status_code, r.text))
        print("%s %s" % (r.encoding, r.apparent_encoding))
        r.encoding=r.apparent_encoding
        print("%s %s" % (r.encoding, r.apparent_encoding))
        #html = r.content  # bytes 型別
        #html_doc = str(html, 'utf-8')  # html_doc=html.decode("utf-8","ignore")
        #print(html_doc)
        return r.text
    except:
        return "產生異常"

1.5 requests的方法 //http的操作

注意method的function的區別


def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30) #reponse   引數 timeout
        r.raise_for_status()  # 如果狀態不是200,引發error異常
        # print("%d\n %s" % (r.status_code, r.text))
        print("%s %s" % (r.encoding, r.apparent_encoding))
        r.encoding=r.apparent_encoding
        print("%s %s" % (r.encoding, r.apparent_encoding))
        #html = r.content  # bytes 型別
        #html_doc = str(html, 'utf-8')  # html_doc=html.decode("utf-8","ignore")
        #print(html_doc)
        print(r.text)
        return r.text
    except:
        return "產生異常"

def head(url):
    r=requests.head(url)
    print(r.headers)    # 注意head headers
    print(r.text)   #空

def post(url): #追加
    r=requests.get("http://httpbin.org/post")
    print(r.text)
    payload = {'name': 'your_name', 'ID': 'your_student number'}
    r = requests.post("http://httpbin.org/post", data=payload)   #引數 data
    print(r.text)

def put(url):   #覆蓋
    r = requests.get("http://httpbin.org/put")
    print(r.text)
    payload = {'name': 'your_name', 'ID': '123456'}
    r = requests.put("http://httpbin.org/put", data=payload)
    print(r.text)

1.6 Request 訪問控制欄位 Requests.request(method,url,**kwargs)

標準格式 Requests.request(method,url,**kwargs)

**kwargs:控制訪問的引數,均為可選項,共計13個
params:  字典或位元組序列,作為引數增加到url中
data:       字典、位元組序列或檔案物件,作為Request的內容
JSON:    JSON格式的資料,作為Request的內容
headers: 字典,HTTP定製頭。可模擬任何瀏覽器向伺服器發起請求
           hd={'user-agent':'Chrome/56.0'}
           r=requests.request('post','https://www.amazon.com/',headers=hd)
Cookies:字典或CookieJar , Request 中 的 cookie 
auth :     元組 ,支援HTTP認證功能 
files :        字典型別,傳輸檔案 
timeout :   設定超時時間,單位為秒 
proxles            :  字典型別 ,設定訪問代理伺服器,可以增加登入認證
Allowredirects: True/Fa1se,預設為True,重定向開關
stream             : True/Fa1se,預設為True,獲取內容立即下載開關
verify              : True/Fa1se,預設為True,認證SSL證書開關
Cert                 :本地SSL證書路徑

1.7 爬蟲尺寸

網頁:requests
網站:scrapy
全網:搜尋引擎

1.8 robots協議

Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網路爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取。

https://www.jd.com/robots.txt

User-agent: * 
Disallow: /?* 
Disallow: /pop/*.html 
Disallow: /pinpai/*.html?* 
User-agent: EtaoSpider 
Disallow: / 
User-agent: HuihuiSpider 
Disallow: / 
User-agent: GwdangSpider 
Disallow: / 
User-agent: WochachaSpider 
Disallow: /

*代表所有,/代表根目錄
User-agent: * 
Disallow: / 
下面四種爬蟲被京東認為惡意爬蟲,拒接其訪問

1.9 chrome 檢視useragent

F12 network name

2.requests的例子

import requests
import os

def amazon():
    #url="https://www.amazon.cn"
    # r=requests.get(url)
    # print(r.status_code)
    #url="https://www.amazon.com"
    #理論上python直接爬,可以看到requests請求很誠實的告訴了網站訪問使用Python發起的,
    # 該網站通過頭資訊判斷該訪問是爬蟲發起的而不是由瀏覽器發起的。amazon會503,使用useragent模擬瀏覽器後沒問題
    #問題是直接10060.
    #url = "https://www.amazon.co.jp"
    # try:
    #      r=requests.get(url)
    #      #r = requests.get(url,timeout=5)
    #       print(r.request.headers)  #頭資訊
    #      #print(r.request.url)
    #      #r.raise_for_status()
    #      print(r.status_code)
    # except:
    #      print("except %s"% r.status_code)
    # print(r.request.headers)  #   注意是request 網站通過頭資訊判斷是python發起,爬蟲,拒絕
    #hd = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
    #r = requests.request('post', url=url, headers=hd)
    #r = requests.get(url, headers=hd)
    #print("final %s"% r.status_code)

    #上面是網路問題導致的amazon訪問不了,我還以為是程式碼問題改了很久...下面這樣做就行 了
    url = "https://www.amazon.com"
    r=requests.get(url)
    print("%s %s"%(r.status_code,r.request.headers))  #注意是request.headers不是requests
    #503 {'User-Agent': 'python-requests/2.21.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
    hd = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
    #r = requests.request('post', url=url, headers=hd) #請求方式是post,返回狀態碼405,後臺不允許post
    r = requests.get(url, headers=hd)
    print("%s %s" % (r.status_code, r.request.headers))  #200


def searchengine():
    keyword = "知乎"
    try:
        kv = {'wd': keyword}
        r = requests.get("http://www.baidu.com/s", params=kv)
        print(r.request.url)
        r.raise_for_status()
        print(r.text[1:1000])
    # 結果太長,列印前1000個字元
    except:
        print("爬取失敗")
    # 百度直接搜尋 武漢大學,華科
    # https: // www.baidu.com / s?wd = 武漢大學 & rsv_spt = 1……
    # https: // www.baidu.com / s?wd = 華中科技大學 & rsv_spt = 1……
    # 所以只需要替換wd即可搜尋
    #

def images():
    #可以通過迴圈語句,批量爬取大量圖片  正則式也可
    url = "https://meowdancing.com/images/timg.jpg"
    root = "F://Pictures//"
    path = root + url.split('/')[-1]  #split 通過 / 分片,取最後一片也就是timg.jpg
    try:
        if not os.path.exists(root):
            os.mkdir(root)  # 用於以數字許可權模式建立目錄
        if not os.path.exists(path):
            r = requests.get(url)
            with open(path, 'wb')as f:
                f.write(r.content)
                f.close()
                print("檔案儲存成功")
        else:  # 寫程式碼時注意縮排
            print("檔案已存在")
    except:
        print("爬取失敗")

def ipaddress():
    url = "http://www.ip138.com/ips138.asp?ip="
    ip="101.24.190.228"
    url=url+ip
    #   +"&action=2" 不加也可以
    hd = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
    print(url)
    try:
        r = requests.get(url,headers=hd)   #不加hd好像不行
        print(r.status_code)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(r.text[-2000:])  # 輸出最後2000個字元
    except:
        print("爬取失敗")

    # 開啟
    # http: // www.ip138.com / 可以通過輸入IP地址查詢地理位置,輸入IP地址後,檢視瀏覽器連結
    # http: // www.ip138.com / ips138.asp?ip = 202.114
    # .66
    # .96 & action = 2
    # 可以看出,查詢連結為
    # http: // www.ip138.com / ips138.asp?ip =“你的IP地址”
    #
    # 通過這個例子我們可以看出,很多人機互動的操作,實際上是通過提交的HTTP連結來完成的,
    # 因此當我門通過簡單的分析,得知HTTP連結與互動資訊的對應關係後,就可以通過Python,爬取我們所需的資源


if __name__ == "__main__":
    #amazon()
    #searchengine()
    #images()
    ipaddress()