Python 爬蟲|深入請求(二):URL
大家好!我是廈門大學王亞南經濟研究院的大一學生,今天將由我來為大家介紹URL的結構與構造。
註:非商業轉載註明作者即可,商業轉載請聯繫作者授權並支付稿費。本人已授權「維權騎士」網站(http://rightknights.com)對我在知乎發布文章的版權侵權行為進行追究與維權。
--------------------------------------我是萌噠噠的分割線-------------------------------------------------------
首先先讓我們來看一看什麼是URL( the full name of URL is uniform resource locator)。每個網頁就像一個商店,網頁上的每個信息(稱為一種資源)就像商店中的一種商品一般。就像每種商品都擁有自己的編號一般,這些資源也擁有自己的編號—那便是URL。
首先讓我們通過具體例子了解下URL的具體結構:
http://channel.jd.com/1713-3258.html(這是京東書城的URL)
nn例子中URL的第一部分(http) 是 URL scheme. 常見的有http, https兩種協議方式
nn URL的第二部分 (http://channel.jd.com) 是伺服器的位置. This tells the webnclient where the resource is hosted.
nn 第三部分(/1713-3258.html) 是具體資源的路徑。它告訴我們將請求哪些具體的資源
第一部分和第二部分用「://」符號隔開,
第二部分和第三部分用「/」符號隔開。 第一部分和第二部分是不可缺少的,第三部分有時可以省略在URL中不同的參數使用&進行連接。
一般來說,URL通常由以下幾個主要部分構成:
nnnn<scheme>://<host>:<port>/<path>;<params>?<query>#<frag>
scheme用來表示協議的方式一般為http或https。
host以及port用來表示欲連接伺服器的位置
nnpath用來表示具體資源的路徑名,params 用來表示請求中一些具體的參數,是爬蟲中需要構造的部分,通常與頁數或者你請求資源的名稱相關。
query則表示查詢 (例如:https://www.zhihu.com/search?type=content&q=python在知乎上搜索python)
URL編碼是一種瀏覽器用來打包表單輸入的格式。在python中我們可以調用 urllib 模塊。
urllib.quote(urldata)將獲取的數據編碼從而適用於字元串中。
urllib.quote_plus()除了實現上述功能之外還可以將kong
現在讓我們具體看下URL的構造:
(1)URL是有規律的,例如說:
第二頁:http://www.texindex.com.cn/news/jghq/index2.html
第三頁:http://www.texindex.com.cn/news/jghq/index3.html
第四頁:http://www.texindex.com.cn/news/jghq/index4.html
可以十分容易地看出這些URL中變化的僅僅是index之後的參數。因此可以考慮使用字元串的拼接(join或者直接用+)以及for循環(找好starting以及ending point)來構造出相應的URL,分布進行請求。
(2)構造複雜的URL:例如在京東頁面上搜索「醬油」,他的URL是這樣的:
http://search.jd.com/Search?keyword=%E9%85%B1%E6%B2%B9&enc=utf-8&wq=%E9%85%B1%E6%B2%B9&pvid=gxsqs7qi.8lr938#keyword=%E9%85%B1%E6%B2%B9&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&offset=3&page=3&s=58&click=0
首先進行URL轉碼,轉碼之後的結果是:
http://search.jd.com/Search?keyword=醬油&enc=utf-8&wq=醬油&pvid=gxsqs7qi.8lr938#keyword=醬油&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&offset=3&page=3&s=58&click=0
page之後的參數控制頁數keyword里的參數控制種類,對於其他參數有沒有,可以通過字元串拼接的方式,逐個去除一些參數在進行requests請求(在python中進行)以確定最終的URL結構。
(3)URL是沒有太多規律的:
比如說我們想抓取上圖中所有二級鏈接的具體信息:
nn但這些URL後面的參數卻是難以構造的,甚至是毫無規律的。這時候我們可以考慮先用一個爬蟲抓完所有的 URL,生成一個list之後再對 list 中所有的URL進行遍歷進行requests請求,即可實現。
當然實際情況下 URL 的構造生成方法還有很多,這裡僅例舉幾種比較常見的方法。
--------------------------------------我是萌噠噠的分割線-------------------------------------------------------
更多項目介紹,請關注我們的項目專欄:Chinas Prices Project - 知乎專欄
項目聯繫方式:
- 項目郵箱(@iGuo 的郵箱):zhangguocpp@163.com
- 申請加入項目,請聯繫人事負責人@Suri :liuxiaomancpp@163.com
- 知乎:@iGuo@Suri(項目負責人) @林行健@Dementia (技術負責人)@張土不 (財務負責人)@好大一棵樹(運維負責人)
推薦閱讀:
※那些年我們寫過的爬蟲
※從零開始寫Python爬蟲 --- 2.4 爬蟲實踐:代理的爬取和驗證
TAG:爬虫 |