1. 程式人生 > >python進階一(簡易爬蟲一)

python進階一(簡易爬蟲一)

一、爬蟲的基本知識:

1、爬蟲的理解:

         (1)網路爬蟲,即Web Spider,網路蜘蛛是通過網頁的連結地址來尋找網頁的。

2、爬蟲的設計過程:

         根據網頁的三大特徵(框架、樣式、行為), 傳送請求獲取資料,篩選資料儲存,資料有url地址,繼續(傳送請求獲取數                       據)。 

3、爬蟲的分類:

        通用爬蟲:目標、流程(爬取網頁 - 儲存資料 - 內容處理 - 提供檢索/排名服務)、遵循Robots協議。

         聚焦爬蟲:與通用搜索引擎爬蟲的區別在於: 聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,                儘量保證只抓取與需求相關的網頁資訊。

二、傳送請求獲取資料(requests包):

                         requests.get(url,params=None,**kwargs) 、reguests.post(url,date=None,json=None,**kwargs)

          幫助傳送請求,這個作為入門的工具還是不錯的,對了解一些爬蟲的基本理念,掌握爬蟲爬取的流程有所幫助。

1、requests安裝:

                cmd安裝:

                

          anacanda安裝:

                

2、基本請求get/post:

                      注意:(1)url是必須的引數,http協議必須要寫。

                                 (2). text  得到的是 str 型別。

import requests
url2 = 'http://httpbin.org/get'
url3 = 'http://httpbin.org/post'
r = requests.get(url2)
print(r.text)

print(type(r.text))                       <class 'str'>   .text是字串型別。

r1 = requests.post(url2)
print(r1.text)
import requests
url2 = 'http://www.ibeifeng.com'
#
r = requests.get(url2)
print(r)     # <Response [200]>   得到響應物件, 200表示成功
print(type(r))      #   <class 'requests.models.Response'>  檢視返回型別
print(r.status_code)      # 檢視響應碼    200
#1. 正在請求
#2. 請求成功
#3. 重定向
#4. 客戶端有問題
#5. 伺服器的問題
print(r.encoding)          # gbk 檢視編碼方式
print(r.cookies)
print(r.text)   #編碼是gbk沒有亂碼,以字串形式顯示,如果是json檔案,需要loads後才可以使用字典。

                 .text 亂碼時的處理方法。
url3 = 'https://www.woyaogexing.com/'
r2 = requests.get(url3)
print(r2.text)         #亂碼。
print(r2.content.decode('utf-8'))   # 以位元組形式展示並用utf-8解碼得到正常結果。

3、基本請求get傳遞引數:

                         get傳遞引數用 params ,post 傳遞引數用 data

import requests
url = 'http://httpbin.org/get'
pay = {'name':'yangmi','age':'30'}            # 用字典的格式。相當於將兩個鍵值對傳到args對應的value中。
r = requests.get(url,params=pay)      # 傳遞引數
print(r.text)
print(r.url)             #結果:  http://httpbin.org/get?name=yangmi&age=30 

                                                        

4、基本請求get偽裝瀏覽器:

import requests
url = 'https://www.zhihu.com'
r = requests.get(url)
print(r.text)                   # 被阻攔

dict1 = {
    'name':'zhangsan',
    'age':'20'
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}         # get 訪問新增標頭檔案仿照 瀏覽器。
r1 = requests.get(url,params=dict1,headers=headers)       # params 新增引數,headers 設定標頭檔案。
print(r1.text)        # 訪問成功
print(r1.url)      # 結果:https://www.zhihu.com/signup?next=%2F%3Fname%3Dzhangsan%26age%3D20

5、get請求解析json資料(附加模組json的用法):

import json
 
data = {
    'name' : 'ACME',
    'shares' : 100,
    'price' : 542.23
}
 
json_str = json.dumps(data)   將python字典物件轉化為json字串。



data = json.loads(json_str)  將json字串轉化為python字典物件

方法一:

import requests
url = 'https://github.com/time.json'
r = requests.get(url)
print(r.text)
print(r.text['message'])           # 報錯
print(r.json())             # requests 內部有一個json解碼器,可以將 json 字串格式轉化為 python的物件。
print(r.json()['message'])  # 可以獲取字典的values

方法二:

利用插入json模組的方法:

import requests
import json           # 插入json模組
url = 'https://github.com/time.json'
r = requests.get(url)
dict1 = json.loads(r)        # 錯誤,因為 r 是響應物件,而不是json字串。
dict2 = json.loads(r.text)   # 將json字串轉化為python字典物件。
print(dict2['message'])

6、利用get下載 音訊、圖片:

                     爬取圖片
import requests
url = 'http://wx4.sinaimg.cn/large/67b2eab9ly1flwuchb5vlj20dw0dwdi1.jpg'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
text = requests.get(url,headers=headers,stream=True)
with open('1.jpg','wb') as file:
    for i in text.iter_content(1024):
        file.write(i)
                    爬取音訊
import requests
url = 'https://m10.music.126.net/20181112201426/6a0a71e1afe74bf40d48a2598c4cead9/ymusic/3020/0523/bdb1/9b15432eb04a5b4ba66c64409da4b27d.mp3'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
text = requests.get(url,headers=headers,stream=True)
with open('1.mp3','wb') as file:
    for i in text.iter_content(1024):
        file.write(i)

7、獲取網頁的cookie:

                   獲取 cookie
import requests
url= 'http://www.ibeifeng.com'
a = requests.get(url)
print(a.cookies)

                    向網站傳送cookie
import requests
url= 'http://httpbin.org/get'
a = requests.get(url)
print(a.text)
                  第一種
a1 = requests.get(url,cookies={'name':'yangmi'})
print(a1.text)
                   第二種 cookies可以放在hearders中。
a1 = requests.get(url,cookies={'name':'yangmi'})
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'cookies':"{'name':'yangmi'}"     # 注意,headers是 str 型別,因此 {'name':'yangmi'} 要加 “”。
}
print(a1.text)

三、post請求:

1、post請求新增引數(data =):

                            post訪問新增引數為data,get是params

                  

2、post請求傳送cookie(cookies =):

                             

3、post請求,傳送檔案(files =)到伺服器中:

with open('post_111.txt','wb') as file:
    pass
import requests
url= 'http://httpbin.org/post'
files = {'file': open('post_111.txt','rb')}
a = requests.post(url,files=files)
print(a.text)

                                                    

4、post請求,傳送json資料:

                                       

5、請求超時與異常處理:

(1)超時設定timeout:

                    你可以告訴 requests 在經過以 timeout 引數設定的秒數時間之後停止等待響應。基本上所有的生產程式碼都應該使用                      這一引數。如果不使用,你的程式可能會永遠失去響應:                     

r = requests.get('http://github.com', timeout=0.1) # 超時設定
print(r.text)

(2)異常處理:

                 異常處理:
list1=[1,5]
list1[3] = 10
try:
    print(list2)
    print(list1)                
except IndexError as e:          # 索引錯誤 跳過
    print(e)
except NameError as e:    # 變數未定義錯誤 跳過
    print(e)
except BaseException as e:    # try程式碼塊錯誤跳過。
    print(e)

print('a')
print('a')
print('a')