第一課:網絡爬蟲準備

1、本課知識路線

  一、Requests框架:自動爬取HTML頁面與自動網絡請求提交html

  二、robots.txt:網絡爬蟲排除標準python

  三、BeautifulSoup框架:解析HTML頁面json

  四、Re框架:正則框架,提取頁面關鍵信息小程序

  五、Scrapy框架:網絡爬蟲原理介紹,專業爬蟲框架介紹服務器

#抓取百度頁面
import requests

r = requests.get('http://www.baidu.com')
print(r.status_code)   #狀態碼,抓取成功200
r.encoding = 'utf-8'  #把編碼改成utf-8
print(r.text)          #輸出抓取內容

2、Requests庫的七個主要方法

一、requests.request(method,url,**kwargs):構造一個請求,支持如下方法的基礎方法

  method:請求方式,對應GET\POST\PUT\HEAD\PATCH\delete\OPTIONS7種cookie

  url:獲取的頁面的URL鏈接網絡

  **kwargs:控制訪問的參數,共13個(可選):app

  一、params:字典或字節序列,做爲參數增長到url中框架

import requests

url = 'http://httpbin.org/post'

payload = {'key1':'value1','key2':'value2'}

r = requests.get(url, params = payload)

print(r.url) #http://httpbin.org/post?key1=value1&key2=value2

  二、data:字典、字節序列或文件對象,做爲Request的內容函數

  三、json:JSON格式數據,做爲Request的內容

  四、headers:字典,HTTP定製頭

import requests

url = 'http://httpbin.org/post'

payload = {'user-agent':'Chrome/10'}

r = requests.request('POST',url,headers=payload)  #修改agent

  五、cookies:字典或CookieJar,Request中的cookie

  六、auth:元組,支持HTTP認證功能

  七、files:字典類型,傳輸文件

import requests

url = 'http://httpbin.org/post'

fs = {'file':open('data.xls','rb')}

r = requests.request('POST',url,files=fs) #向頁面傳輸文件

  八、timeout:設定超時時間,秒爲單位

import requests

url = 'http://httpbin.org/post'


r = requests.request('GET',url,timeout = 10)

  九、proxies:字典類型,設定訪問代理服務器,能夠增長登陸認證

import requests

url = 'http://httpbin.org/post'
pxs = {'http':'http://user:pass@10.10.10.1:1234','http':'http://10.10.10.1:1234'} #設置兩個代理服務器

r = requests.request('GET',url,proxies=pxs)

  十、allow_redirects:True/False,默認爲True,重定向開關

  十一、stream:True/False,默認爲True,獲取內容當即下載開關

  十二、verify:True/False,默認爲True,認證SSL證書開關

  1三、cert:本在SSL證書路徑

二、requests.get(url,params=None,**kwargs):獲取HTML頁面的主要方法,對應HTTP的GET

  url:獲取頁面的url連接

  params:url中額外參數,字典或字節流格式,可選

  **kwargs:12控制訪問參數,可選

 

  一、構造一個向服務器請求資源的Request對象

  二、函數返回一個包含服務器資源的Response對象

  說明:Response對象

import requests

response = requests.get('http://www.baidu.com')

print(response.status_code)   #200

print(response.encoding)     #ISO-8859-1

print(response.apparent_encoding)    #utf-8

response.encoding = response.apparent_encoding
print(response.headers)

  Response對象屬性

  一、r.status_code:HTTP請求的返回狀態,200表示鏈接成功,404表示失敗或者其餘

  二、r.text:HTTP響應內容的字符串形式,即url對應的頁面內容

  三、r.encoding:從HTTP header中猜想的響應內容編碼方式

  四、r.apparent_encoding:從內容中分析出的響應內容編碼方式(備選編碼方式)

  五、r.content:HTTP響應內容的二進制形式

   

三、requests.head(url,**kwargs(13個參數)):獲取HTML頁面的頭部信息方法,對應HTTP的HEAD

import requests

url = 'http://www.baidu.com'

r = requests.head(url)

print(r.headers)

print(r.text) #無輸出內容

四、requests.post(url,data=None,json=None,**kwargs(11個可選參數)):向HTML頁面提交POST請求方法,對應HTTP的POST

import requests

url = 'http://httpbin.org/post'

payload = {'key1':'value1','key2':'value2'}

r = requests.post(url, data = payload) #向URL POST一個字典,自動編碼爲form表單

print(r.text)

import requests

url = 'http://httpbin.org/post'

r = requests.post(url, data = 'abc') #向URL POST一個字符串,自動編碼爲data
print(r.text)

五、requests.put(url,data=None,**kwargs(12可選參數)):向HTML頁面提交PUT請求方法,對應HTTP的PUT

  put方法與post方法同樣,區別在於put方法會把原有數據覆蓋

六、requests.patch(url,data=None,**kwargs(12可選參數)):向HTML頁面提交局部修改請求方法,對應HTTP的PATCH

七、requests.delete(url,**kwargs(13個可選參數)):向HTML頁面提交刪除請求方法,對應HTTP的DELETE

3、Requests庫的異常

異常 說明
requests.ConnectionError 網絡鏈接錯誤異常,如DNS查詢失敗、拒絕鏈接等
requests.HTTPError HTTP錯誤異常
requests.URLRequired URL缺失異常
requests.TooManyRedirects 超過最大重定向次數,產生重定向異常
requests.ConnectTimeout 鏈接運程服務超時異常
requests.Timeout 請滶URL起時,產生超時異常

 

 

 

 

 

 

r.raise_for_status():Requests異常方法,返回200則抓取正常,若是不是200,產生異常requests.HTTPError

4、爬蟲網頁的通用代碼框架

import requests
def getHTMLText(url):
    try:
        response = requests.get(url,timeout=30) #返回Response對象
        response.raise_for_status() #若是狀態不是200,則產生HTTPError異常,跳轉運行except處代碼
        response.encoding = response.apparent_encoding  #保證頁面編碼正確
        return response.text  #返回抓取內容
    except:
        return '產生異常!'

if __name__ == '__main__':
    url = 'http://www.baidu.com'
    print(getHTMLText(url))

5、HTTP協議:Hypertext Transfer Protocol,超文本傳輸協議

 HTTP是一個基於'請求與響應'模式的、無狀態的應用層協議;通常採用URL用爲定位網絡資源的標識。

 URL格式: http:host[:port][path]

  host:合法的Internet主機域名或IP地址

  port:端口號,可省略,默認爲80

  path:請求資源的路徑

 HTTP協議對資源的操做方法

方法 說明
GET 請求獲取URL位置資源
HEAD 請求獲取URL位置資源的頭部信息
POST 請求向URL位置資源後附加新的數據
PUT 請求向URL位置存儲一個資源,覆蓋原URL位置資源
PATCH 請求局部更新URL位置資源
DELETE 請求刪除URL位置存儲的資源

 

 

 

 

 

 

 6、做業:Requests庫的爬取性能分析

儘管Requests庫功能很友好、開發簡單(其實除了import外只需一行主要代碼),但其性能與專業爬蟲相比仍是有必定差距的。請編寫一個小程序,「任意」找個url,測試一下成功爬取100次網頁的時間。(某些網站對於連續爬取頁面將採起屏蔽IP的策略,因此,要避開這類網站。)

import requests
import time
def getHTMLText(url):
    try:
        r = requests.get(url, timeout = 10)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return 'Error'

if __name__ == '__main__': url = 'http://www.bilibili.com' print('start the test:') start_time = time.clock() for i in range(100): getHTMLText(url) end_time = time.clock() print('Total runing time:%s' %(end_time-start_time)) #Total runing time:114.73649717934875

 

#做業
#一、爬蟲京東
import requests
url = 'https://item.jd.com/2357091.html'
try:
    r = requests.get(url)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000])
    print(r.request.headers) #{'User-Agent': 'python-requests/2.13.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
except:
    print('Error')


#二、爬蟲amzon
import requests

url = 'https://www.amazon.cn/dp/B004DCV1FO'

try:
    kv = {'User-Agent':'Mozilla/5.0'}
    r = requests.get(url)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.status_code)
    print(r.request.headers)
    r = requests.get(url,headers = kv)
    print(r.status_code)
    print(r.request.headers)
except:
    print(r.status_code)
/*
200
{'User-Agent': 'python-requests/2.13.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
200
{'User-Agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
*/

#三、向百度與其360提交搜索關鍵字
import requests

try:
    r = requests.get('http://www.baidu.com/s',params={'wd':'Python'})
    print(r.request.url) #http://www.baidu.com/s?wd=Python
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(len(r.text))
except:
    print('Error')


import requests

try:
    keyword = 'Python'
    kv = {'q':keyword}
    r = requests.get('https://www.so.com/s',params=kv)
    print(r.request.url) #https://www.so.com/s?q=Python
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(len(r.text))
except:
    print('error')

#做業5查ip歸屬
import requests

url = 'http://www.ip138.com/ips138.asp?ip='

try:
    r = requests.get(url + '114.116.113.46')
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text)
except:
    print('error')

 

#4爬取保存圖片
import requests
import os

url = 'http://p1.so.qhimgs1.com/bdr/326__/t01d9dff613f7d05381.jpg'
root = 'D://pics//'
path = root + os.path.basename(url) #os.path.basename(path)  返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
#path = root + url.split('/')[-1]
try:
    if not os.path.exists(root): #os.path.exists(path)  若是path存在,返回True;若是path不存在,返回False
        os.mkdir(root)
    if not os.path.exists(path):
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        with open(path,'wb') as f:
            f.write(r.content)
            print('文件保存成功')
    else:
        print('文件存在')
except:
    print('爬取失敗')
相關文章
相關標籤/搜索