成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:拼接個URL你也能搞錯,還寫個爬蟲

網絡 通信技術
如果你不知道這一點的話,你的爬蟲在拼接子頁面URL的時候可能就會出問題。網站也可以使用這個機制構造出一個蜜罐,根據標簽拼出來的URL才是真正的子頁面地址,而用當前頁面URL去拼接的URL是蜜罐地址,爬蟲訪問進去以后,就會抓到假數據,或者被立即屏蔽。

在寫爬蟲的過程中,我們經常需要解析網站的列表頁。例如下面這個例子:

 

  1. <html> 
  2.     <head> 
  3.         <meta charset="utf-8"
  4.         <title>測試相對路徑</title> 
  5.     </head> 
  6.     <body> 
  7.         <div> 
  8.             <h1>書籍列表</h1> 
  9.             <ul> 
  10.                 <li><a href="http://127.0.0.1:8000/book/1.html">第一本書</a></li> 
  11.                 <li><a href="http://127.0.0.1:8000/book/2.html">第二本書</a></li> 
  12.                 <li><a href="http://127.0.0.1:8000/book/3.html">第三本書</a></li> 
  13.                 <li><a href="http://127.0.0.1:8000/book/4.html">第四本書</a></li> 
  14.                 <li><a href="http://127.0.0.1:8000/book/5.html">第五本書</a></li> 
  15.             </ul> 
  16.         </div> 
  17.     </body> 
  18. </html> 

 

運行效果如下圖所示:

這種情況下,我想獲取每一項的URL非常簡單,直接寫一個XPath就可以了,如下圖所示:

仔細觀察你會發現,每一個連接的URL都是以http://127.0.0.1:8000開頭的。而當前列表頁的地址也是http://127.0.0.1:8000。所以為了簡單起見,標簽里面可以使用相對路徑:

 

  1. <html> 
  2.     <head> 
  3.         <meta charset="utf-8"
  4.         <title>測試相對路徑</title> 
  5.     </head> 
  6.     <body> 
  7.         <div> 
  8.             <h1>書籍列表</h1> 
  9.             <ul> 
  10.                 <li><a href="/book/1.html">第一本書</a></li> 
  11.                 <li><a href="/book/2.html">第二本書</a></li> 
  12.                 <li><a href="/book/3.html">第三本書</a></li> 
  13.                 <li><a href="/book/4.html">第四本書</a></li> 
  14.                 <li><a href="/book/5.html">第五本書</a></li> 
  15.             </ul> 
  16.         </div> 
  17.     </body> 
  18. </html> 

 

運行效果如下圖所示,用XPath只能提取到半截URL:

但是瀏覽器可以正確識別這樣的相對地址,并且當你點擊的時候,它能自動跳轉到正確的地址:

相對路徑如果是以/開頭,那么就會在相對路徑前面拼接上網站的主域名。

但如果當前列表頁的地址跟鏈接的相對路徑有一部分重疊怎么辦?如下圖所示:

當前頁面的地址是http://127.0.0.1:8000/book。而相對地址是/book/1.html。這種情況下,還可以進一步簡化,在相對路徑的前面不要加斜杠,把HTML改成:

 

  1. <html> 
  2.     <head> 
  3.         <meta charset="utf-8"
  4.         <title>測試相對路徑</title> 
  5.     </head> 
  6.     <body> 
  7.         <div> 
  8.             <h1>書籍列表</h1> 
  9.             <ul> 
  10.                 <li><a href="1.html">第一本書</a></li> 
  11.                 <li><a href="2.html">第二本書</a></li> 
  12.                 <li><a href="3.html">第三本書</a></li> 
  13.                 <li><a href="4.html">第四本書</a></li> 
  14.                 <li><a href="5.html">第五本書</a></li> 
  15.             </ul> 
  16.         </div> 
  17.     </body> 
  18. </html> 

 

運行效果如下圖所示:

這種情況下,瀏覽器依然能給正確識別,如下圖所示:

瀏覽器知道,如果相對路徑沒有用/開頭,那么它就會把當前頁面的URL與相對路徑拼接起來。但需要注意的是,在拼接的時候,會取最右側斜杠左邊的部分。而右邊的部分會丟棄。就相當于拼接文件地址的時候,用這個文件所在的文件夾來拼接新的地址。如下圖所示:

如果你記不住怎么區分的話,你可以使用Python自帶的urllib.parse.urljoin來連接,如下圖所示:

看到這里,你可能覺得我今天又水了一篇文章。這么簡單的東西也值得寫一篇文章來講?

那么我們來看下面這個例子:

域名是http://127.0.0.1:8000/book/index.html,相對域名是1.html,但為什么瀏覽器自動識別出來的URL是www.kingname.info/1.html?

這個問題的關鍵,在于源代碼里面的標簽:

  1. <html> 
  2.     <head> 
  3.         <meta charset="utf-8"
  4.         <title>測試相對路徑</title> 
  5.         <base href="http://www.kingname.info"
  6.     </head> 
  7.     <body> 
  8.         <div> 
  9.             <h1>書籍列表</h1> 
  10.             <ul> 
  11.                 <li><a href="1.html">第一本書</a></li> 
  12.                 <li><a href="2.html">第二本書</a></li> 
  13.                 <li><a href="3.html">第三本書</a></li> 
  14.                 <li><a href="4.html">第四本書</a></li> 
  15.                 <li><a href="5.html">第五本書</a></li> 
  16.             </ul> 
  17.         </div> 
  18.     </body> 
  19. </html> 

如果HTML代碼頭部有標簽,那么,它的href屬性的值,會被用來跟相對路徑拼接出一個絕對路徑,而不會再用當前頁面的URL來拼接。

如果你不知道這一點的話,你的爬蟲在拼接子頁面URL的時候可能就會出問題。網站也可以使用這個機制構造出一個蜜罐,根據標簽拼出來的URL才是真正的子頁面地址,而用當前頁面URL去拼接的URL是蜜罐地址,爬蟲訪問進去以后,就會抓到假數據,或者被立即屏蔽。

關于標簽的詳細說明,大家可以閱讀:: The Document Base URL element[1]。

參考文獻

 

[1] The Document Base URL element: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2023-10-28 12:14:35

爬蟲JavaScriptObject

2024-10-16 21:47:15

2022-01-26 07:35:10

爬蟲Requestsgzip

2021-06-08 21:36:24

PyCharm爬蟲Scrapy

2021-09-26 05:01:55

Scrapy項目爬蟲

2021-10-15 21:08:31

PandasExcel對象

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2025-05-28 03:15:00

Scrapy數據sleep

2021-04-12 21:19:01

PythonMakefile項目

2021-12-15 22:04:11

瀏覽器重復登錄

2020-12-04 06:39:25

爬蟲網頁

2021-03-18 23:28:45

Python反斜杠字符串

2022-06-28 09:31:44

LinuxmacOS系統

2021-09-13 20:38:47

Python鏈式調用

2024-11-13 09:18:09

2021-03-12 21:19:15

Python鏈式調用

2021-04-05 14:47:55

Python多線程事件監控

2021-04-19 23:29:44

MakefilemacOSLinux

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代碼工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天干天天操天天爽 | 日韩精品一区二区三区在线播放 | 一级a性色生活片久久毛片 午夜精品在线观看 | 久久久久久久久久影视 | 日韩在线视频一区 | 亚洲社区在线 | 欧美一区二区三区在线观看 | av天天干 | 久久精品一 | 成人在线视频免费播放 | 91av免费版| 久久久久久久电影 | 国产一区不卡 | 看片一区 | 91精品www | 中文字幕在线电影观看 | 色天天综合 | 一级在线免费观看 | 亚洲日韩欧美一区二区在线 | 中文字幕精品一区二区三区精品 | 在线视频第一页 | 久久亚洲一区二区三 | 欧美日韩中文在线 | 91在线区 | 欧美黄色片在线观看 | 亚洲欧洲日本国产 | 亚洲一区二区中文字幕 | 亚洲风情在线观看 | 日本三级电影在线观看视频 | 亚洲一区二区三区四区五区午夜 | 亚洲精品久久久蜜桃 | 中文字幕av亚洲精品一部二部 | 成人在线一区二区三区 | 亚洲一区二区三区四区五区中文 | 欧美日韩专区 | 成人av免费在线观看 | 中文字幕精品一区二区三区精品 | 天天综合网天天综合 | 欧美成人在线影院 | 日韩1区 | 国产精品一区二区三区四区 |