Python爬蟲學習(一)使用requests庫和robots協議


(一)爬蟲需要的庫和框架:

       

  

(二)爬蟲的限制:

  

 

      1,Robots協議概述:

    網站擁有者可以在網站根目錄下建立robots.txt文件,User-agent:定義不能訪問者;Disallow定義不可以爬取的目錄

    例如:http://www.baidu.com/robots.txt的部分內容:     

 //不允許Baiduspider訪問如下目錄
User-agent: Baiduspider 
Disallow: /baidu
Disallow: /s?
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
//不允許Googlebot訪問如下目錄
User-agent: Googlebot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh

  2,Robots協議的使用:爬蟲要求,類人行為爬蟲可以不用遵守robots協議

    

 

     

 

 

(三)使用Requests庫:

  1,安裝命令:pip install requests

  2,測試

import requests;
r=requests.get("http://www.baidu.com")
print(r.status_code)
#如果requests庫安裝成功,則打印200
r.encoding='utf-8'
r.text #打印網頁內容

  常見方法: 

    

 

 

     1,requests.request()方法:

      

 

 

       

 

 

       

      

 

 

       

 

 

       

      

 

 

       

 

 

       

 

 

       

 

 

       

 

 

       

 

 

       

 

 

 

      1, 第三個參數使用params=xx,將數據添加到url后面

       2,第三個參數使用data=xxx,將數據賦值到內容

       3,第三個參數使用json=xx,將內容賦值到json

       4,第三個參數使用headers=字典類型數據;可以修改網頁headers的屬性值

      5,第三個參數使用timeout=n,設置訪問時間,當訪問超時則報異常

      6,第三個參數使用proxies=xx,設置訪問的代理服務器(xx為字典數據,可以存放http或https代理),可以有效隱藏爬蟲原IP,可以有效防止爬蟲逆追蹤

       例一:

        

 

 

     例二:第三參數使用data=xxx,將數據賦值到內容   

import requests;
from _socket import timeout
#from aifc import data               
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)  
        r.raise_for_status()           #如果連接狀態不是200,則引發HTTPError異常
        r.encoding=r.apparent_encoding #使返回的編碼正常
        print("連接成功")
        return r.status_code
    except:
        print("連接異常")
        return r.status_code

url="http://httpbin.org/"
if getHTMLText(url)==200:
    payData={'name;':'zs',"sex":"man"};
    r=requests.request("POST",url+"post",data=payData)  #第一個參數賦什么值,第二個參數在url后就添加什么參數
    print(r.text)
    

      運行截圖:

        

    2,requests.get()方法:**kwargs是request方法中除了params外的其他12個參數(最常用的方法)

      

 

 

       

 

 

       

 

 

       r.encoding:當連接的網頁的<head>標簽沒有charset屬性,則認為編碼為ISO-8859-1

      當連接失敗時:

      

 

      拋出異常方法:

 

       

#判斷url是否可以正常連接的通用方法:
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)  
        r.raise_for_status()           #如果連接狀態不是200,則引發HTTPError異常
        r.encoding=r.apparent_encoding #使返回的編碼正常
        return r.text
    except:
        return "連接異常"

    3,requests.head()方法:

    

 

 

    4,requests.post()方法:

    

    

 

 

    5,requests.put()方法:

    

 

 

    6,requests.patch()方法:

    

 

 

   7,requests.delete()方法:

    

 

 

  8,HTTP協議: 

    

    

(四)爬取網站數據案例;

  例一:爬取起點某小說某章節

import requests;
from _socket import timeout
#from aifc import data
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)  
        r.raise_for_status()           #如果連接狀態不是200,則引發HTTPError異常
        r.encoding=r.apparent_encoding #使返回的編碼正常
        print("連接成功")
        return r.status_code
    except:
        print("連接異常")
        return r.status_code

url="https://read.qidian.com/chapter/z4HnwebpkxdqqtWmhQLkJA2/pYlct39tiiVOBDFlr9quQA2"
access={"user-agent":"Mozilla/5.0"}              #設置訪問網站為瀏覽器Mozilla5.0
if getHTMLText(url)==200:
    #pst={"http":"http://user:pass@10.10.10.1:1234","https":"https://10.10.10.1:4321"} #設置代理
    r=requests.get(url,headers=access)   #訪問網站設置代理服務器
    #r.encoding="utf-8"
    print(r.request.headers)            #獲取頭部信息
  print(r.text[2050:3000])

  截圖:

    

 

         

 

  例二:保存網上各種格式文件到本地:

import os
import requests
url="http://a3.att.hudong.com/53/88/01200000023787136831885695277.jpg"  #可以是圖片,音樂,視頻等的網上地址
access={"user-agent":"Mozilla/5.0"}
file="D://picture//"      #定義圖片保存的本地文件
path=file+url.split("/")[-1]
print(path)
try:
    if not os.path.exists(file):          #如果不存在目錄D://picture就新建
        os.mkdir(file)
    if not os.path.exists(path):
        r=requests.get(url,headers=access)
        with open(path,"wb") as f:         #打開文件path作為f;
            f.write(r.content)              #r.content:爬取的文件的二進制形式
            f.close()
            print("圖片保存成功")
    else:
        print("文件已保存")
except:
    print("爬取失敗")

  例三:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM