網絡爬蟲--5.urllib庫的基本使用(1)

文章目錄

  • 一. 前言
  • 二. urlopen
  • 三. Request
  • 四. User-Agent
  • 五. 添加更多的Header信息
    • 1. 添加一個特定的header
    • 2. 隨機添加/修改User-Agent

一. 前言

所謂網頁抓取,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。 在Python中有很多庫可以用來抓取網頁,我們先學習urllib。

二. urlopen

我們先來段代碼:

# 導入urllib.request 庫
import urllib.request# 向指定的url發送請求,并返回服務器響應的類文件對象
response = urllib.request.urlopen("http://www.baidu.com")# 類文件對象支持文件對象的操作方法,如read()方法讀取文件全部內容,返回字符串
html = response.read()# 打印字符串
print ('---------------------')
print (html)
print ('---------------------')

執行寫的python代碼,顯示打印結果。

實際上,如果我們在瀏覽器上打開百度主頁, 右鍵選擇“查看源代碼”,你會發現,跟我們剛才打印出來的是一模一樣。也就是說,上面的4行代碼就已經幫我們把百度的首頁的全部代碼爬了下來。

一個基本的url請求對應的python代碼真的非常簡單。

三. Request

在我們第一個例子里,urlopen()的參數就是一個url地址;

但是如果需要執行更復雜的操作,比如增加HTTP報頭,必須創建一個 Request 實例來作為urlopen()的參數;而需要訪問的url地址則作為 Request 實例的參數。

# urllib_request.pyimport urllib.request# url 作為Request()方法的參數,構造并返回一個Request對象
request = urllib.request.Request("http://www.baidu.com")# Request對象作為urlopen()方法的參數,發送給服務器并接收響應
response = urllib.request.urlopen(request)html = response.read().decode()print (html)

運行結果是完全一樣的:

新建Request實例,除了必須要有 url 參數之外,還可以設置另外兩個參數:

data(默認空):是伴隨 url 提交的數據(比如要post的數據),同時 HTTP 請求將從 "GET"方式 改為 "POST"方式。

headers(默認空):是一個字典,包含了需要發送的HTTP報頭的鍵值對。

這兩個參數下面會說到。

四. User-Agent

但是這樣直接用urllib給一個網站發送請求的話,確實略有些唐突了,就好比,人家每家都有門,你以一個路人的身份直接闖進去顯然不是很禮貌。而且有一些站點不喜歡被程序(非人為訪問)訪問,有可能會拒絕你的訪問請求。

但是如果我們用一個合法的身份去請求別人網站,顯然人家就是歡迎的,所以我們就應該給我們的這個代碼加上一個身份,就是所謂的User-Agent頭。

瀏覽器 就是互聯網世界上公認被允許的身份,如果我們希望我們的爬蟲程序更像一個真實用戶,那我們第一步,就是需要偽裝成一個被公認的瀏覽器。用不同的瀏覽器在發送請求的時候,會有不同的User-Agent頭。 urllib默認的User-Agent頭為:Python-urllib/x.y(x和y是Python主版本和次版本號,例如 Python-urllib/2.7)

import urllib.requesturl = "http://www.itcast.cn"#IE 9.0 的 User-Agent,包含在 ua_header里
ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}#  url 連同 headers,一起構造Request請求,這個請求將附帶 IE9.0 瀏覽器的User-Agent
request = urllib.request.Request(url, headers = ua_header)# 向服務器發送這個請求
response = urllib.request.urlopen(request)html = response.read()
print (html)

五. 添加更多的Header信息

在 HTTP Request 中加入特定的 Header,來構造一個完整的HTTP請求消息。

可以通過調用Request.add_header() 添加/修改一個特定的header,也可以通過調用Request.get_header()來查看已有的header。

1. 添加一個特定的header

import urllib.requesturl = "http://www.itcast.cn"#IE 9.0 的 User-Agent
header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request = urllib.request.Request(url, headers = header)#也可以通過調用Request.add_header() 添加/修改一個特定的header
request.add_header("Connection", "keep-alive")# 也可以通過調用Request.get_header()來查看header信息
# request.get_header(header_name="Connection")response = urllib.request.urlopen(request)print (response.code) #可以查看響應狀態碼
html = response.read().decode()print (html)

2. 隨機添加/修改User-Agent

import urllib
import randomurl = "http://www.itcast.cn"ua_list = ["Mozilla/5.0 (Windows NT 6.1; ) Apple.... ","Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ","Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ","Mozilla/5.0 (Macintosh; Intel Mac OS... "
]user_agent = random.choice(ua_list)request = urllib.request.Request(url)#也可以通過調用Request.add_header() 添加/修改一個特定的header
request.add_header("User-Agent", user_agent)# get_header()的字符串參數,第一個字母大寫,后面的全部小寫
request.get_header("User-agent")response = urllib.request.urlopen(requestr)html = response.read()
print (html)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452073.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高性能計算

信息時代的硬件芯片和存儲器價格以摩爾定律的形式下降,可是現在處理的數據量也越來越大。我們先以cocoa編程為例,然后再結合網格計算、云計算,綜合對最新的高性能計算技術作介紹。 使用 runloop 在cocoa編程如果用NSThread開線程 [NSThread …

混合型面向對象語言和純面向對象語言

20世紀80年代以來,面向對象語言像雨后春筍一樣大量涌現,形成了兩大類面向對象語言。 一類是純面向對象語言,如Smalltalk和Eiffel等語言 另一類是混合型面向對象語言,也就是在過程語言的基礎上增加面向對象機制,如C等…

塊級元素的margin-left和margin-right的用法注意

此時是有效果顯示的因為html文檔流默認是從上往下,從左往右進行顯示的,所以此時是有效果的。那如果此時把#son的塊元素的margin-right:20px; 是沒有效果的此時是沒有效果的,如圖所示:如果此時想要margin-right有效果的話&#xf…

Apache Tiles的基本使用

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1、概述 對于一個新的技術,了解其基本的概念和和原理是學好該技術的基礎。 2、Tiles的概念 Tiles 是復合視圖模式&#xff0…

js--------1.時間

1 //獲取當前時間 yyyy-MM-dd2 function getNowFormatDate() {3 var date new Date();4 var seperator1 "-";5 var seperator2 ":";6 var month date.getMonth() 1;7 var strDate date.getDate();8 if (month > 1 &&…

網絡爬蟲--6.urllib庫的基本使用(2)

文章目錄一. urllib.parse.urlencode()和urllib.parse.unquote()二. Get方式三. 批量爬取百度貼吧數據四.POST方式五.關于CA六.處理HTTPS請求 SSL證書驗證一. urllib.parse.urlencode()和urllib.parse.unquote() 編碼工作使用urllib.parse的urlencode()函數,幫我們…

面向對象語言的技術特點

1.支持類與對象概念的機制 所有面向對象語言都允許用戶動態創建對象,并且可以用指針引用動態創建的對象。允許動態創建對象,就意味著系統必須處理內存管理問題,如果不及時釋放不再需要的對象所占用的內存,動態存儲分配就有可能耗…

INI 文件的操作

在程序中經常要用到設置或者其他少量數據的存盤,以便程序在下一次執行的時候可以使用,比如說保存本次程序執行時窗口的位置、大小、一些用戶設置的數據等等,在 Dos 下編程的時候,我們一般自己產生一個文件,由自己把這些…

摩拜大數據殺熟?官方:老用戶押金的確退款延遲

近日,有媒體曝出摩拜單車一些老用戶出現押金難退現象。有的消費者點擊退款后,系統不斷奔潰;有的申請退款后,賬戶又莫名出現押金,就像未申請一樣;也有人終于提交了退款,等候數日卻遲遲不見到賬。…

Junit Test使用樣例

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 配置: 調用類: import java.util.List;import javax.annotation.Resource;import org.apache.shiro.crypto.Rand…

Django congtent types應用

contenttypes 是Django內置的一個應用,可以追蹤項目中所有app和model的對應關系,并記錄在ContentType表中。 每當我們創建了新的model并執行數據庫遷移后,ContentType表中就會自動新增一條記錄。比如我在應用app01的models.py中創建表class E…

網絡爬蟲--7.Handler處理器 和 自定義Opener

文章目錄一. 引言二. 簡單的自定義opener()三. ProxyHandler處理器(代理設置)四. Cookie1.Cookie原理2.Cookie應用五. cookiejar庫 和 HTTPCookieProcessor處理器1.案例一:獲取Cookie,并保存到CookieJar()對象中2.案例二:利用cook…

如何選擇面向對象語言

開發人員在選擇面向對象語言時,還應該著重考慮以下一些實際因素。 1. 將來能否占主導地位 為了使自己的產品在若干年后仍然具有很強的生命力,人們可能希望采用將來占主導地位的語言編程。 根據目前占有的市場份額,以及專業書刊和學術會議上所…

Unicode編碼及其實現:UTF-16、UTF-8,and more

本文主要討論Unicode的編碼與各種實現,著重討論UTF-16,UTF-8的實現規則,以及Big-endian和Little-Endian的存儲規則。 一、Unicode編碼 Unicode出現之前已經有各種編碼標準:ANSI、ISO8859-1、GB2312、GBK以及BIG-5等。Unicode試圖統…

Apache Tiles的使用 前配置

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用方法見&#xff1a; http://blog.csdn.net/jiangyu1013/article/details/53161580 1.加maven 依賴&#xff1a; <!-- 頁面布局…

day212223:線程、進程、協程

1、程序工作原理 進程的限制&#xff1a;每一個時刻只能有一個線程來工作。多進程的優點&#xff1a;同時利用多個cpu&#xff0c;能夠同時進行多個操作。缺點&#xff1a;對內存消耗比較高當進程數多于cpu數量的時候會導致不能被調用&#xff0c;進程不是越多越好&#xff0c;…

php課程 8-28 php如何繪制生成顯示圖片

php課程 8-28 php如何繪制生成顯示圖片 一、總結 一句話總結&#xff1a;gd庫輕松解決 1、php圖片操作生成的圖的兩種去向是什么&#xff1f; 一種在頁面直接輸出&#xff0c;一種存進本地磁盤 2、php操作圖片的庫有哪些&#xff1f; PHP: Image Processing and Generation - M…

代碼行技術

用代碼行技術估算軟件規模時&#xff0c;當程序較小時常用的單位是代碼行數&#xff08;LOC&#xff09;&#xff0c;當程序較大時常用的單位是千行代碼數&#xff08;KLOC&#xff09;。 代碼行技術的主要優點是&#xff0c;代碼是所有軟件開發項目都有的“產品”&#xff0c;…

網絡爬蟲--8.編碼趣聞

很久很久以前&#xff0c;有一群人&#xff0c;他們決定用8個可以開合的晶體管來組合成不同的狀態&#xff0c;以表示世界上的萬物。他們看到8個開關狀態是好的&#xff0c;于是他們把這稱為"字節"。 再后來&#xff0c;他們又做了一些可以處理這些字節的機器&#…

科技領域的一分鐘

各位果迷是否能想象在一分鐘之內&#xff0c;科技領域都會發生什么事情&#xff1f;——蘋果平均每分鐘賣出81部 iPad&#xff1b;在 iPhone 4S 發布后的第一個周末&#xff0c;每分鐘賣出925部 iPhone 4S&#xff1b;RIM每分鐘賣出103臺黑莓手機&#xff1b;Amazon每分鐘賣出1…