所謂網頁抓取,就是把URL位址中指定的網路資源從網路流讀取出來,儲存到本地。在Python中有很多函式庫可以用來抓取網頁,我們先學習urllib.request。 (在python2.x中為urllib2)
我們先閱讀以下程式碼:
#!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' # 导入urllib.request库 import urllib.request # 向指定的url发送请求,并返回服务器响应的类文件对象 response = urllib.request.urlopen("http://www.baidu.com/") # 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串 html = response.read() # 打印字符串 print(html)
實際上,如果我們在瀏覽器上打開百度主頁,右鍵選擇“查看原始程式碼”,你會發現,跟我們執行上面的程式輸出的結果是一模一樣的。也就是說,上面的幾行程式碼就已經幫我們把百度的主頁的全部程式碼爬了下來。
在上面的範例裡,urlopen()的參數就是一個url位址。
但是如果需要執行更複雜的操作,例如增加HTTP標頭,則必須建立一個Request實例來作為urlopen()的參數,而需要存取的url位址則作為Request實例的參數。
#!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' # 导入urllib.request库 import urllib.request # url 作为Request()方法的参数,构造并返回一个Request对象 request = urllib.request.Request("http://www.baidu.com/") # 向服务器发送这个请求 response = urllib.request.urlopen(request) html = response.read() print(html)
運行結果是完全一樣的:
新建的Request實例,除了必須要有url參數之外,還可以設定另外兩個參數:
1.data(預設為空):是伴隨url提交的資料(例如post的資料),同時HTTP請求將從「GET」方式改為「POST」方式。
2.headers(預設為空):是一個字典,包含了需要傳送的HTTP標頭的鍵值對。
如果我們希望我們的爬蟲程式更像一個真實用戶,那們我們第一步,就是需要偽裝成一個被公認的瀏覽器。用不同的瀏覽器在發送請求的時候,會有不同的User-Agent頭。 urllib.request預設的User-Agent頭為:Python-urllib/x.y(x和y是Python主版本和次版本號,例如Python-urllib/3.5)
#!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' # 导入urllib.request库 import urllib.request # chrome 的 User-Agent,包含在 header里 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} # url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent request = urllib.request.Request("http://www.baidu.com/", headers = header) # 向服务器发送这个请求 response = urllib.request.urlopen(request) html = response.read() print(html)
在HTTP Request中加入特定的Header,來建構一個完整的HTTP請求訊息。
可以通过调用Request.add_header() 添加/修改一个特定的header 也可以通过调用Request.get_header()来查看已有的header。
新增一個特定的header
#!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' # 导入urllib.request库 import urllib.request # chrome 的 User-Agent,包含在 header里 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} # url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent request = urllib.request.Request("http://www.baidu.com/", headers = header) # 也可以通过调用Request.add_header() 添加/修改一个特定的header request.add_header("Connection", "keep-alive") # 向服务器发送这个请求 response = urllib.request.urlopen(request) html = response.read() print(html)
#
以上是urllib.request函式庫的使用基礎的詳細內容。更多資訊請關注PHP中文網其他相關文章!