Urllib庫是python中的一個功能強大的,用於操作URL,並在作爬蟲的時候常常要用到的庫,在python2中,分爲Urllib和Urllib2兩個庫,在python3以後就將兩個庫合併到Urllib庫中,使用方法有所不一樣,我使用的是python3。php
第一步,先導入Urllib庫對應的模塊,import urllib.request 或者直接導入request模塊 from urllib import requesthtml
from urllib import request file = request.urlopen("http://www.baidu.com") #urlopen打開並爬取一個頁面,並將值賦給file,以百度爲例 data = file.read() #read()讀取所有能容 dataline = file.readline() #readline()只讀取一行 # 分別打印兩個值 print(dataline) print(data)
打印結果:python
這樣就將獲取的網頁的HTML代碼爬取下來了瀏覽器
爬取到數據以後咱們怎麼將爬取的網頁以網頁的形式進行保存緩存
from urllib import request file = request.urlopen("http://www.baidu.com") data = file.read() fhandle = open("F:/爬蟲/1.html","wb") #經過open()函數打開該文件,「wb」以二進制寫入形式打開,不會的話能夠學習一下以前的python的文件寫入操做。 #文件目錄本身先建立 fhandle.write(data) #將data數據寫入到 fhandle.close() #將文件關閉
而後找到該文件,用瀏覽器打開網絡
圖片信息還未爬取,但至此咱們已經網頁爬取並保存。函數
還有一種直接使用request模塊中的urlretrieve函數直接寫入post
格式:urlretrieve(url,filename=本地地址)學習
from urllib import request filename=request.urlretrieve("http://www.qq.com",filename="F:/爬蟲/2.html" )
而後查看保存的路徑下的文件,打開以後網站
使用urlretrieve執行的過程當中會產生一些緩存,可使用函數urlcleanup()進行清除
還有寫其餘的經常使用的方法以下:
返回與當前環境有關的信息 info()
獲取當前爬取網頁的狀態碼 getcode()
獲取當前爬取網頁的URL地址 geturl()
因爲URL標準中之容許一部分的ASCII字符,好比數字,字母,部分表單符號等,其餘不符合標準的要進行編碼,使用quote()
編碼以後進行解碼 unquote()
固然不是全部的網站均可以這麼輕鬆的獲取到,不少網站都進行了反爬蟲設置,用瀏覽器能夠打開但用爬蟲爬不到,此時咱們就須要設置一些headers信息,模擬成瀏覽器去訪問這些網站。
首先打開瀏覽器,輸入www.baidu.com 而後按F12 在刷新一下網頁
點擊網絡就能夠看到上面的圖了,而後點擊第一個和右邊的按鈕
你就能夠看到這樣的
右邊的標頭就是headers,而後找到User-Agent,這個就是咱們要用到的模擬瀏覽器的信息,將其複製下來
咱們能夠獲得該信息 「User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36」
這樣咱們就能夠修改報頭,其中request()下的build_opener()和request.Request()下的add_header()均可以進行操做,以下:
from urllib import request url = "www.baidu.com" #僅僅是個例子 headers = ("User-Agent","User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36") opener = request.build_opener() opener.addheaders=[headers] data = opener.open(url).read() print(data)
還有一種方法是經過request.Request(url)方式進行操做以下:
from urllib import request urll = "http://www.baidu.com" req = request.Request(urll) req.add_header("User-Agent","User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36") #這裏的鍵值對不止這一個,你也能夠把全部的都寫上,好比Cookie、host均可以 data = request.urlopen(req).read() fhandle = open("F:/爬蟲/1.html","wb") fhandle.write(data) fhandle.close()
HTTP請求之GET請求
當咱們用百度進行搜索時會看到網絡請求用的時get請求
能夠看出搜索詞的關鍵字時wd,這樣咱們能夠經過構造相似的網址進行網絡請求,而後再將請求的網址保存
from urllib import request keywd = "中國是一個偉大的國家" key_code = request.quote(keywd) #漢字要編碼, urll = "http://www.baidu.com/s?wd="+key_code #拼接字符串 req = request.Request(urll) data = request.urlopen(req).read() fhandle = open("F:/爬蟲/3.html","wb") fhandle.write(data) fhandle.close()
而後打開本地保存的文件
從上面的示例中能夠總結出,使用GET請求的思路以下:
1.構造對應的URL地址,該URL地址包含GET請求的字段名和字段內容的信息,而且URL知足GET請求的格式,即 「http://網址?字段1=字段內容1&字段2=字段內容2」。
2.以頂印度額URL爲參數,構建Request對象。
3.經過urlopen()打開構建的Request對象。
4.按需求進行後續處理的操做,好比讀取網頁的內容、將內容寫入文件等。
HTTP請求之POST請求
在註冊和登錄網站是咱們基本上都會遇到post請求,下面舉個例子,這個是本身搭建的post請求網頁,很粗糙的一個,只是將post請求的用戶名個密碼提交以後打印在了頁面上。源碼以下:
<form action="<?=$_SERVER['PHP_SELF'] ?>" method="POST"> 用戶名<input type="text" name="username"><br> 密碼<input type="password" name="passwd"><br> <input type="submit" name="submit" value="提交"> </form> <?php if (isset($_POST['submit'])) { echo "<br>"; echo '用戶名:'.$_POST['username']."<br>"; echo "密碼:".$_POST['passwd'].'<br>'; } ?>
原始的頁面是
填寫用戶名和密碼以後的頁面
怎麼構建post請求,通常的思路以下:
1.設置好URL網址
2.構建表單數據,並使用urllib.parse.urlencode對數據進行編碼處理
3.建立Request對象,參數包括URL地址和要傳遞的編碼處理
4.使用add_header()添加頭部信息,模擬瀏覽器進行爬取
5.使用urllib.request.urlopen()打開對應的Request對象,完成信息的傳遞
6.讀取或者寫入等操做
如今咱們去爬一下上面的網站:http://192.168.199.247/mytest/index.php
至於構建表單數據,咱們須要看一下源碼,打開網頁,按F12,找到from表單的部分。
從上面咱們能夠看出須要提交表單的兩個字段分別是:username、passwd。這樣咱們就能夠構造數據,POST請求時的數據構造都要是以字典的形式進行因此咱們構造的函數爲:
{"username":"root","passwd":"root"},咱們將用戶名和密碼都設置爲root,這隻完以後咱們進行編碼。而後建立Request對象以後就按着思路往下走就能夠了
代碼:
from urllib import request from urllib import parse #編碼時須要用到的庫 url = "http://192.168.199.247/mytest/index.php" postdata = parse.urlencode({ "username":"root", "passwd":"root" }).encode("utf-8") #設置編碼格式爲utf-8 req = request.Request(url,postdata) #在Request以後能夠直接設置傳遞的數據 Request(url地址,傳遞的數據) req.add_header("User-Agent","User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36") data = request.urlopen(req).read() fhandle = open("F:/爬蟲/1.html","wb") fhandle.write(data) fhandle.close()