自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一日一技:拼接個(gè)URL你也能搞錯(cuò),還寫(xiě)個(gè)爬蟲(chóng)

網(wǎng)絡(luò) 通信技術(shù)
如果你不知道這一點(diǎn)的話(huà),你的爬蟲(chóng)在拼接子頁(yè)面URL的時(shí)候可能就會(huì)出問(wèn)題。網(wǎng)站也可以使用這個(gè)機(jī)制構(gòu)造出一個(gè)蜜罐,根據(jù)標(biāo)簽拼出來(lái)的URL才是真正的子頁(yè)面地址,而用當(dāng)前頁(yè)面URL去拼接的URL是蜜罐地址,爬蟲(chóng)訪(fǎng)問(wèn)進(jìn)去以后,就會(huì)抓到假數(shù)據(jù),或者被立即屏蔽。

在寫(xiě)爬蟲(chóng)的過(guò)程中,我們經(jīng)常需要解析網(wǎng)站的列表頁(yè)。例如下面這個(gè)例子:

 

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

 

運(yùn)行效果如下圖所示:

這種情況下,我想獲取每一項(xiàng)的URL非常簡(jiǎn)單,直接寫(xiě)一個(gè)XPath就可以了,如下圖所示:

仔細(xì)觀察你會(huì)發(fā)現(xiàn),每一個(gè)連接的URL都是以http://127.0.0.1:8000開(kāi)頭的。而當(dāng)前列表頁(yè)的地址也是http://127.0.0.1:8000。所以為了簡(jiǎn)單起見(jiàn),標(biāo)簽里面可以使用相對(duì)路徑:

 

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

 

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

但是瀏覽器可以正確識(shí)別這樣的相對(duì)地址,并且當(dāng)你點(diǎn)擊的時(shí)候,它能自動(dòng)跳轉(zhuǎn)到正確的地址:

相對(duì)路徑如果是以/開(kāi)頭,那么就會(huì)在相對(duì)路徑前面拼接上網(wǎng)站的主域名。

但如果當(dāng)前列表頁(yè)的地址跟鏈接的相對(duì)路徑有一部分重疊怎么辦?如下圖所示:

當(dāng)前頁(yè)面的地址是http://127.0.0.1:8000/book。而相對(duì)地址是/book/1.html。這種情況下,還可以進(jìn)一步簡(jiǎn)化,在相對(duì)路徑的前面不要加斜杠,把HTML改成:

 

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

 

運(yùn)行效果如下圖所示:

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

瀏覽器知道,如果相對(duì)路徑?jīng)]有用/開(kāi)頭,那么它就會(huì)把當(dāng)前頁(yè)面的URL與相對(duì)路徑拼接起來(lái)。但需要注意的是,在拼接的時(shí)候,會(huì)取最右側(cè)斜杠左邊的部分。而右邊的部分會(huì)丟棄。就相當(dāng)于拼接文件地址的時(shí)候,用這個(gè)文件所在的文件夾來(lái)拼接新的地址。如下圖所示:

如果你記不住怎么區(qū)分的話(huà),你可以使用Python自帶的urllib.parse.urljoin來(lái)連接,如下圖所示:

看到這里,你可能覺(jué)得我今天又水了一篇文章。這么簡(jiǎn)單的東西也值得寫(xiě)一篇文章來(lái)講?

那么我們來(lái)看下面這個(gè)例子:

域名是http://127.0.0.1:8000/book/index.html,相對(duì)域名是1.html,但為什么瀏覽器自動(dòng)識(shí)別出來(lái)的URL是www.kingname.info/1.html?

這個(gè)問(wèn)題的關(guān)鍵,在于源代碼里面的標(biāo)簽:

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

如果HTML代碼頭部有標(biāo)簽,那么,它的href屬性的值,會(huì)被用來(lái)跟相對(duì)路徑拼接出一個(gè)絕對(duì)路徑,而不會(huì)再用當(dāng)前頁(yè)面的URL來(lái)拼接。

如果你不知道這一點(diǎn)的話(huà),你的爬蟲(chóng)在拼接子頁(yè)面URL的時(shí)候可能就會(huì)出問(wèn)題。網(wǎng)站也可以使用這個(gè)機(jī)制構(gòu)造出一個(gè)蜜罐,根據(jù)標(biāo)簽拼出來(lái)的URL才是真正的子頁(yè)面地址,而用當(dāng)前頁(yè)面URL去拼接的URL是蜜罐地址,爬蟲(chóng)訪(fǎng)問(wèn)進(jìn)去以后,就會(huì)抓到假數(shù)據(jù),或者被立即屏蔽。

關(guān)于標(biāo)簽的詳細(xì)說(shuō)明,大家可以閱讀:: The Document Base URL element[1]。

參考文獻(xiàn)

 

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

 

責(zé)任編輯:武曉燕 來(lái)源: 未聞Code
相關(guān)推薦

2023-10-28 12:14:35

爬蟲(chóng)JavaScriptObject

2024-10-16 21:47:15

2022-01-26 07:35:10

爬蟲(chóng)Requestsgzip

2021-09-26 05:01:55

Scrapy項(xiàng)目爬蟲(chóng)

2021-06-08 21:36:24

PyCharm爬蟲(chóng)Scrapy

2021-10-15 21:08:31

PandasExcel對(duì)象

2021-04-27 22:15:02

Selenium瀏覽器爬蟲(chóng)

2021-12-15 22:04:11

瀏覽器重復(fù)登錄

2020-12-04 06:39:25

爬蟲(chóng)網(wǎng)頁(yè)

2021-04-12 21:19:01

PythonMakefile項(xiàng)目

2021-03-18 23:28:45

Python反斜杠字符串

2021-03-12 21:19:15

Python鏈?zhǔn)?/a>調(diào)用

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2021-09-13 20:38:47

Python鏈?zhǔn)?/a>調(diào)用

2021-04-05 14:47:55

Python多線(xiàn)程事件監(jiān)控

2024-11-13 09:18:09

2022-03-12 20:38:14

網(wǎng)頁(yè)Python測(cè)試

2021-04-19 23:29:44

MakefilemacOSLinux

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代碼工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)