python3爬蟲入門(urllib和requests簡單使用)
阿新 • • 發佈:2018-11-12
- 知道python有強大的的爬蟲庫,但是對於我們普通小白來說,寫一個完整的爬蟲需要知道什麼甚至瞭解什麼都是很重要的。掌握了這些基本點,才能夠熟悉爬蟲的構成和獲取有用的資訊。
- 編寫一個小爬蟲個人感覺可以分為三個階段:
- 1:請求,這個就是使用urlib2或者requests傳送http請求。要掌握期中一些用法以及一些常用的請求方式。
- 2:解析,當得到一個網頁的html,我們要用一些工具解析檔案,獲得我們需要的資訊。常見是beautifulsoup解析大部分加部分正則。
- 3:儲存:將資訊寫入mysql或本地。(mysql,file檔案傳輸讀寫)
-當然,面對更大的爬蟲,可能有更多的步驟,比如函式建模,去重,等等。
本文主要記錄在學習請求部分的過程!
urllib板塊:
python內建urllib版塊,支援header,cookie,ip代理池等操作,但是比較麻煩的就是每次都要處理編碼解碼問題,搞得有點繁瑣。 - urllib2 在 python3.x 中被改為urllib.request,一般為了使用習慣,匯入時命名為urllib2:import urllib.request as urllib2。
get請求
一個基本的百度請求的程式碼如下:
import urllib.request as urllib2
header={"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;" }#模仿瀏覽器
request = urllib2.Request('http://www.baidu.com',headers=header)
response = urllib2.urlopen(request)
buff = response.read()
html = buff.decode()
print(html)
對於有url拼湊的地址:例如有
- 這樣就要新增data資訊(或者你直接拼湊url)
比如我要請求這個頁面,就要在data字典組新增對應的查詢頭資訊,並且還需要url編碼轉換成瀏覽器能夠標識的字串。
編碼工作使用urllib.parse的urlencode()函式,幫我們將key:value這樣的鍵值對轉換成"key=value"這樣的字串,解碼工作可以使用urllib的unquote()函式。(注意,不是urllib.urlencode())
程式碼為:
import urllib.request as urllib2
import urllib.parse
url = "http://tieba.baidu.com/f"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0"}
formdata = {
"ie":"utf-8",
"kw":"江蘇科技大學",
"fr":"search"
}
data = urllib.parse.urlencode(formdata)#要轉換成url編碼
newurl=url+'?'+data
print(data)
request = urllib2.Request(newurl, headers = headers)
response = urllib2.urlopen(request)
html=response.read().decode("utf-8")
print( html)
可以看到,這樣已經請求成功了呢。
post請求:post請求和get請求的不同之處在於傳遞引數的方式,get通過url拼湊進行不同的請求,而post請求則是將data放進請求列中進行模擬類似表單的請求。
import urllib.request as urllib2
import urllib.parse
url = "http://tieba.baidu.com/f"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0"}
formdata = {
"ie":"utf-8",
"kw":"江蘇科技大學",
"fr":"search"
}
data = urllib.parse.urlencode(formdata).encode('utf-8')#要轉換成url編碼
print(data)
request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)
html=response.read().decode("utf-8")
print( html)
這大概就是常用的urllib的使用方式了,期中感覺請求步驟和編碼問題都比較麻煩。requests很好的解決了這個問題。
requests(如果沒有安裝在teminal控制檯pip install requests即可)
對於requests的一個最基本的請求流程為
import requests
url = "https://www.neihan8.com/article/list_5_" + "1" + ".html"
userangert = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
header = {'User-Agent': userangert}
req = requests.get(url, headers=header)
#亂碼問題的解決方案油兩個
req.encoding='gbk'
print(req.text)
#html = req.content#contenet是流內容,可以獲得圖片等資訊。
#print(html.decode('gbk'))
注意如果輸出亂碼要注意解決。同樣,如果是post請求,直接request.post即可,同時requests是從urllib編寫而來,支援urllib的絕大部分操作。比如cookie管理,ip代理等等。
- 作為爬蟲,經常會通過抓包找到資料來源的json檔案,如果是直接返回response.json()。
下面通過程式碼給出區別:
import requests
formdata = {
"type":"AUTO",
"i":"i love python",
"doctype":"json",
"xmlVersion":"1.8",
"keyfrom":"fanyi.web",
"ue":"UTF-8",
"action":"FY_BY_ENTER",
"typoResult":"true"
}
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
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"}
response = requests.post(url, data = formdata, headers = headers)
print (response.text)
# 如果是json檔案可以直接顯示
print (response.json())
輸出為:
至於這個請求錯誤,原因是我的請求頭不夠完善,模擬不夠好,可以通過抓包近似完全模擬請求。有興趣的可以試試。
寫的並不是很好,本人也是初學者,希望可以一起交流經驗。總的來說requests效率更高更便捷,還是推薦使用requests!