python實戰——網絡爬蟲之request

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()
相關文章
相關標籤/搜索