python—【爬蟲】學習_1(基本知識篇)
首先介紹下urllib的用法
urllib提供了一系列用於操作URL的功能。
常用的模組:
urllib.request 請求模組
urllib.error 異常處理模組
urllib.parse url解析模組
request()
urllib的ruquest
模組可以非常方便地抓取URL內容,也就是傳送一個GET請求到指定的頁面,然後返回HTTP的響應:
from urllib import request
response = request.urlopen("https://www.baidu.com/")
.read() 每次讀取整個檔案,它通常用於將檔案內容放到一個字串變數中。
html =response.read()
然而這是遠遠不夠的,因為返回值是以二進位制儲存的,一般網頁原碼都是用utf-8表示,所以一般還有一個decode()的過程。
html =html.decode("utf-8")
print(html)
得到以下輸出:
<html> <head> <script> location.replace(location.href.replace("https://","http://")); </script> </head> <body> <noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript> </body> </html>
具體例子1:(下載一隻小貓)來源網站:placekitten.com
code如下:
from urllib import request as re
response =re.urlopen("http://placekitten.com/g/500/600")
cat_img = response.read()
with open("D:\\實驗樓\cat_500_600.jpg", 'wb')as f:
f.write(cat_img)
.Parse()
這裡就用到urllib.parse,通過bytes(urllib.parse.urlencode())可以將post資料進行轉換放到urllib.request.urlopen的data引數中。這樣就完成了一次post請求。
所以如果我們新增data引數的時候就是以post請求方式請求,如果沒有data引數就是get請求方式。
具體例子2:使用有道翻譯進行翻譯.
from urllib import request
from urllib import parse
import json
content = input("請輸入需要翻譯的內容")
url ="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
head ={ }
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
data ={}
data["from"]="AUTO"
data["to"]="AUTO"
data["i"]= content
data["client"]="fanyideskweb"
data["sign"]="c8f3a6d3a2e68a5ba21a0c36de9ed9cd"
data["salt"]="1539962031171"
data["smartresult"]="dict"
data["doctype"]="json"
data["version"]= 2.1
data["keyfrom"]="fanyi.web"
data["action"]="FY_BY_REALTIME"
data["typoResult"]= "false"
data = parse.urlencode(data).encode("utf-8")
##是將一個utf-8型別的字串url,解碼成ascii格式的方法
#urllib.parse.urlencode()
#只將連線中utf-8編碼不在ascii表中的字元翻譯成帶百分號的ascii表示形式
#>>>params = {'query':'中文','submit':'search'}
#>>>data = urllib.parse.urlencode(params)
#>>>data
#'query=%E4%B8%AD%E6%96%87&submit=search'
req = request.Request(url, data , head)
response = request.urlopen(req)
# or 刪去Request中的head
# + req.add_header(“User-Agent”,'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
html = response.read().decode('utf-8')
target = json.loads(html)
#json.loads 用於解碼 JSON 資料。該函式返回 Python 欄位的資料型別。
res= target['translateResult'][0][0]['tgt']
print ("翻譯結果為:",res)
代理ip的使用方法:
1、build_opener 和urlopen的區別和優點?
答:要爬取的各種各樣的網頁,它們有一部填寫需要驗證碼,有的需要小餅乾(cookie),還有更多許多高階的功能,它們會阻礙你爬,而我對於urlopen單純地理解就是開啟網頁。urlopen開啟一個網址,它可以是一個字串或者是一個request物件。而build_opener就是多了handler,處理問題更專業,更個性化。
2、使用預設的handlers應該怎麼寫?
例子1:
ProHandler=
request = urllib.request.Request(url,data, headers or {})
iplist =['119.6.144.73:81',...........]
proxy_support =urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener = urllib.request.build_opener(support)
例子2:
opener1 = urllib.request.install_opener(opener)