[Python][爬蟲]不同的 Content-Type (multipart/form-data)

這次要爬的目標是台灣精品獎得獎名單

我想要爬取的條件是, 擷取.PNG

這時候會猜測這應該是個post的requests。

果然,在按下查詢後,
出現了一個cross_list的可疑人物,
擷取.PNG

因為是post,
所以會期望在headers裡找到 “Form Data”,
這裡面應會藏著post需要的參數。

但不幸的是,什麼也沒有,
只找到長得像這樣的”Request Payload”
payload.PNG

然後Content-Type是multipart/form-data
content-type.PNG

其實,我們平常需要的data form裡的資料就藏在Request Payload裡。
抓取的方式是,
payload.PNG

以這行為例,

------WebKitFormBoundaryTaDJAA82fTd3ug3W
Content-Disposition: form-data; name="awards[]"

1

name後的 “award[]” 就會是dictionary的key, 底下的 1 ,就會是value, 所以就會變成

{
"awards[]" = "1"
}

所以就把Request Payload所有的資訊寫成

payload = {
	"keyword":"",
	"awards[]":"1",
	"awards[]":"2",
	"awards[]":"3",
	"years[]":"2017",
	"years[]":"2016",
	"industry[]":"A",
	"industry[]":"B",
	"industry[]":"C",
	"industry[]":"D",
	"industry[]":"E",
	"industry[]":"F",
	"industry[]":"G",
	"industry[]":"H",
	"industry[]":"I",
	"industry[]":"J",
	"industry[]":"K",
	"industry[]":"L",
	"industry[]":"Z"
}

但這樣寫完會覺得非常不合理,
因為會有一堆同樣的key但給予不同的value,
也就是說會key會一直被新的value取代。

我當時的想法是,
看到 [] 就會很想要在裡面塞數字順位,
果然,從0開始,將相同的key編號,
就成功了。

所以這樣送出requests,

# -*- coding: utf-8 -*-
#爬取台灣精品得獎名單http://www.taiwanexcellence.org/index.php/awards/now/cross_list/1/2017/2/1
from bs4 import BeautifulSoup
import requests
import math


url = "http://www.taiwanexcellence.org/index.php/awards/now/send_search/1/2017/2/1/cross_list"

payload = {
	"keyword":"",
	"awards[0]":"1",
	"awards[1]":"2",
	"awards[2]":"3",
	"years[0]":"2017",
	"years[1]":"2016",
	"industry[0]":"A",
	"industry[1]":"B",
	"industry[2]":"C",
	"industry[3]":"D",
	"industry[4]":"E",
	"industry[5]":"F",
	"industry[6]":"G",
	"industry[7]":"H",
	"industry[8]":"I",
	"industry[9]":"J",
	"industry[10]":"K",
	"industry[11]":"L",
	"industry[12]":"Z"
}

s = requests.Session()
res = s.post(url, data = payload)

完整的程式碼