Python爬蟲基礎-01-帶有請求引數的爬蟲

CycloneKid-blogs發表於2018-06-06

在上一篇文章Python爬蟲入門中,Python爬蟲程式爬取了指定網頁的資訊,爬蟲發出的請求是一個固定的URL和部分請求資訊,並沒有請求引數,但是爬蟲工作過程中發出的請求一般都需要加上請求引數,以完成對指定內容的爬取

HTTP請求分為POST請求和GET請求,在Python爬蟲中,這兩種請求因其結構不同,所以新增請求引數的方式也不同,下面將分別介紹使用POST請求和GET請求的Python爬蟲

GET請求

使用GET請求的Python爬蟲比較簡單,由於GET請求的請求引數包含在URL地址中,所以只需要先確定請求引數,然後將請求引數拼接到URL中即可,即 URL + 請求引數(字串拼接)

使用GET請求的Python爬蟲案例

首先,一個使用GET請求訪問網頁的例子。如下圖所示,使用百度,以“爬蟲”為關鍵字進行查詢,可以看到,位址列的URL為:https://www.baidu.com/s?word=爬蟲。我們可以使用這個URL地址利用爬蟲爬取該網頁
這裡寫圖片描述
我們寫一個可以使用和上面一樣的GET請求的Python爬蟲程式,需要用到urlllib2包

# coding=utf-8

import urllib2

url = "http://www.baidu.com/s"
word = {"wd":"爬蟲"}
# url首個分隔符是 ?
newurl = url + "?" + word     

# 新增User-Agent,完善請求資訊
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

request = urllib2.Request(newurl, headers=headers)

response = urllib2.urlopen(request)

print response.read()

程式寫好後,直接執行會報錯,這是因為請求引數需要進行編碼轉換,在使用瀏覽器訪問時,這個轉換是瀏覽器自動完成的。但是在Python爬蟲程式中,這一步就需要程式設計師自己來完成了。編碼轉換需要使用urllib包

# coding=utf-8

import urllib      #負責url編碼處理
import urllib2

url = "http://www.baidu.com/s"
word = {"wd":"爬蟲"}
# 將請求引數轉換成url編碼格式(字串)
word = urllib.urlencode(word) 
# url首個分隔符是 ?
newurl = url + "?" + word     

# 新增User-Agent,完善請求資訊
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

request = urllib2.Request(newurl, headers=headers)

response = urllib2.urlopen(request)

print response.read()

執行程式,控制檯列印的資訊如下,爬取成功
這裡寫圖片描述

使用GET請求的Python爬蟲的應用

在使用Python爬蟲爬取一個有分頁的網站時,各個頁面的URL非常接近,唯一的不同就是頁碼數字不同,這是使用GET請求能非常簡單方便的將該網站的各個頁面爬取下來
這裡寫圖片描述
如下圖,Python吧的第一頁的URL地址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0
第二頁的URL地址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50
第三頁的URL地址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100
可以看出URL中只有pn引數在變化,它控制著到底訪問該吧的那一頁,發現了這個規律後,就可以通過一個迴圈,切換URL地址中的引數從而將整個貼吧中所有頁面的內容都爬取下來
這裡寫圖片描述

# coding=utf-8

import urllib     
import urllib2

url = "http://tieba.baidu.com/f?kw=python&ie=utf-8&pn="

i = 0
while i<1000:
    i = i +50

    newurl = url + i   

    # 新增User-Agent,完善請求資訊
    headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

    request = urllib2.Request(newurl, headers=headers)

    response = urllib2.urlopen(request)

    print response.read()

POST請求

GET請求的請求引數是直接包含在URL中了,而POST請求的請求引數則不會出現在URL中,而是要經過單獨的封裝處理。所以,如果爬蟲需要使用POST請求,就不能直接通過 URL + 請求引數 字串拼接這種簡單粗暴的方式了

使用POST請求的Python爬蟲案例

訪問百度貼吧的請求是GET型別的,而訪問有道翻譯的請求則是POST型別的。如下圖所示,輸入我在學習,點選翻譯,位址列中的URL沒有變化,說明點選翻譯後傳送的請求是POST型別的,即無法再URL中看到引數
這裡寫圖片描述
下面就是使用POST請求的Python爬蟲程式,通過一個formdata 字典作為引數,當呼叫urllib2.Request類時,使用三個引數,即urllib2.Request(url, data = data, headers = headers),Python爬蟲傳送POST請求,使用兩個引數urllib2.Request(newurl, headers=headers),Python爬蟲傳送GET請求

# coding=utf-8

import urllib
import urllib2

# POST請求的目標URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

# 新增User-Agent,完善請求資訊
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

formdata = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyfrom":"fanyi.web",
    "ue":"UTF-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}

data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)
print response.read()

相關文章