爬蟲基本原理

閱讀目錄

一 爬蟲是什麼

1. 爬蟲介紹  php

複製代碼
'''
    近年來,隨着網絡應用的逐漸擴展和深刻,如何高效的獲取網上數據成爲了無數公司和我的的追求,在大數據時代,誰掌握了更多的數據,誰就能夠得到更高的利益,而網絡爬蟲是其中最爲經常使用的一種從網上爬取數據的手段。
    網絡爬蟲,即Web Spider,是一個很形象的名字。若是把互聯網比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。網絡蜘蛛是經過網頁的連接地址來尋找網頁的。網站某一個頁面(一般是首頁)開始,讀取網頁的內容,找到在網頁中的其它連接地址,而後經過這些連接地址尋找下一個網頁,這樣一直循環下去,直到把這個網站全部的網頁都抓取完爲止。若是把整個互聯網當成一個網站,那麼網絡蜘蛛就能夠用這個原理把互聯網上全部的網頁都抓取下來。
'''
複製代碼
複製代碼
# 一、什麼是互聯網?
    互聯網是由網絡設備(網線,路由器,交換機,防火牆等等)和一臺臺計算機鏈接而成,像一張網同樣。

# 二、互聯網創建的目的?
    互聯網的核心價值在於數據的共享/傳遞:數據是存放於一臺臺計算機上的,而將計算機互聯到一塊兒的目的就是爲了可以方便彼此之間的數據共享/傳遞,不然你只能拿U盤去別人的計算機上拷貝數據了。

# 三、什麼是上網?爬蟲要作的是什麼?
    咱們所謂的上網即是由用戶端計算機發送請求給目標計算機,將目標計算機的數據下載到本地的過程。
    # 3.1 只不過,用戶獲取網絡數據的方式是:
      瀏覽器提交請求->下載網頁代碼->解析/渲染成頁面。

    # 3.2 而爬蟲程序要作的就是:
      模擬瀏覽器發送請求->下載網頁代碼->只提取有用的數據->存放於數據庫或文件中
 
    # 3.1與3.2的區別在於:
      咱們的爬蟲程序只提取網頁代碼中對咱們有用的數據

# 四、總結爬蟲
    # 4.1 爬蟲的比喻:
      若是咱們把互聯網比做一張大的蜘蛛網,那一臺計算機上的數據即是蜘蛛網上的一個獵物,而爬蟲程序就是一隻小蜘蛛,沿着蜘蛛網抓取本身想要的獵物/數據

    # 4.2 爬蟲的定義:
      向網站發起請求,獲取資源後分析並提取有用數據的程序 

    # 4.3 爬蟲的價值:
      互聯網中最有價值的即是數據,好比天貓商城的商品信息,鏈家網的租房信息,雪球網的證券投資信息等等,這些數據都表明了各個行業的真金白銀,能夠說,誰
掌握了行業內的第一手數據,誰就成了整個行業的主宰,若是把整個互聯網的數據比喻爲一座寶藏,那咱們的爬蟲課程就是來教你們如何來高效地挖掘這些寶藏,掌握了爬
蟲技能,你就成了全部互聯網信息公司幕後的老闆,換言之,它們都在免費爲你提供有價值的數據。
複製代碼

 

 

2. 哪些語言能夠實現爬蟲css

 

複製代碼
# 1.php:
    能夠實現爬蟲。php被號稱是全世界最優美的語言(固然是其本身號稱的,就是王婆賣瓜的意思),可是php在實現爬蟲中支持多線程和多進程方面作的很差。

# 2.java:
    能夠實現爬蟲。java能夠很是好的處理和實現爬蟲,是惟一能夠與python並駕齊驅且是python的頭號勁敵。可是java實現爬蟲代碼較爲臃腫,重構成本較大。

# 3.c、c++:
    能夠實現爬蟲。可是使用這種方式實現爬蟲純粹是是某些人(大佬們)能力的體現,卻不是明智和合理的選擇。

# 4.python:
    能夠實現爬蟲。python實現和處理爬蟲語法簡單,代碼優美,支持的模塊繁多,學習成本低,具備很是強大的框架(scrapy等)且一句難以言表的好!沒有可是!
複製代碼

 

 

4.爬蟲的應用html

複製代碼
# 1.通用爬蟲:通用爬蟲是搜索引擎(Baidu、Google、Yahoo等)「抓取系統」的重要組成部分。主要目的是將互聯網上的網頁下載到本地,造成一個互聯網內容的鏡像備份。
  1)搜索引擎如何抓取互聯網上的網站數據?
     a)門戶網站主動向搜索引擎公司提供其網站的url
     b)搜索引擎公司與DNS服務商合做,獲取網站的url
     c)門戶網站主動掛靠在一些知名網站的友情連接中

# 2.聚焦爬蟲:聚焦爬蟲是根據指定的需求抓取網絡上指定的數據。
  例如:
     獲取豆瓣上電影的名稱和影評,而不是獲取整張頁面中全部的數據值。
複製代碼

 


二 爬蟲的基本流程

複製代碼
 
  tip1: 發送請求的就是模擬瀏覽器發送請求,闡述底層如何走的。請求須要使用請求庫,請求庫幫咱們實現了什麼功能。
 
# 一、發起請求: 
  使用http庫向目標站點發起請求,即發送一個Request
  Request包含:請求頭、請求體等

# 二、獲取響應內容
  若是服務器能正常響應,則會獲得一個Response
  Response包含:html,json,圖片,視頻等

# 三、解析內容
  解析html數據:正則表達式,第三方解析庫如Beautifulsoup,pyquery等
  解析json數據:json模塊
  解析二進制數據:以b的方式寫入文件

# 四、保存數據
  數據庫
  文件
複製代碼

 

三 請求與響應

複製代碼
 tip2: 使用瀏覽器訪問百度講解。

# URL:即統一資源定位符,也就是咱們說的網址,統一資源定位符是對能夠從互聯網上獲得的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。
互聯網上的每一個文件都有一個惟一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎麼處理它
# URL的格式由三部分組成: ①第一部分是協議(或稱爲服務方式)。 ②第二部分是存有該資源的主機IP地址(有時也包括端口號)。 ③第三部分是主機資源的具體地址,如目錄和文件名等 # http協議: https://www.cnblogs.com/kermitjam/p/10432198.html # robots協議: https://www.cnblogs.com/kermitjam/articles/9692568.html # Request:   用戶將本身的信息經過瀏覽器(socket client)發送給服務器(socket server) # Response:   服務器接收請求,分析用戶發來的請求信息,而後返回數據(返回的數據中可能包含其餘連接,如:圖片,js,css等) # ps:   瀏覽器在接收Response後,會解析其內容來顯示給用戶,而爬蟲程序在模擬瀏覽器發送請求而後接收Response後,是要提取其中的有用數據。
複製代碼

 

四 Request

複製代碼
 
#一、請求方式:
 經常使用的請求方式:
    GET,POST
其餘請求方式:
    HEAD,PUT,DELETE,OPTHONS ps:用瀏覽器演示get與post的區別,(用登陸演示post) post與get請求最終都會拼接成這種形式:
    k1
=xxx&k2=yyy&k3=zzz
post請求的參數放在請求體內: 可用瀏覽器查看,存放於form data內
    get請求的參數直接放在url後
#二、請求url url全稱統一資源定位符,如一個網頁文檔,一張圖片 一個視頻等均可以用url惟一來肯定 url編碼:   https://www.baidu.com/s?wd=圖片   圖片會被編碼(看示例代碼) 網頁的加載過程是:   加載一個網頁,一般都是先加載document文檔,在解析document文檔的時候,遇到連接,則針對超連接發起下載圖片的請求。 #三、請求頭 User-agent:
    請求頭中若是沒有user-agent客戶端配置,服務端可能將你當作一個非法用戶。
     Cookies:
    cookie用來保存登陸信息。
   Referer:
    
瀏覽器上次訪問的網頁url
   通常作爬蟲都會加上請求頭
#四、請求體
    若是是get方式,請求體沒有內容
    若是是post方式,請求體是format data

  ps: 1、登陸窗口,文件上傳等,信息都會被附加到請求體內
    二、登陸,輸入錯誤的用戶名密碼,而後提交,就能夠看到post,正確登陸後頁面一般會跳轉,沒法捕捉到post 
 
複製代碼
from urllib.parse import urlencode
import requests

headers={
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Cookie':'H_WISE_SIDS=101556_115474_115442_114743_108373_100099_115725_106201_107320_115339_114797_115553_116093_115546_115625_115446_114329_115350_114275_116040_110085; PSTM=1494300712; BAIDUID=42FE2934E37AF7AD1FA31D8CC7006D45:FG=1; BIDUPSID=2996557DB2710279BD865C50F9A68615; MCITY=-%3A; __cfduid=da9f97dea6458ca26aa4278280752ebb01508939712; BDSFRCVID=PGLsJeCCxG3wt_3ZUrBLDfv2D_qBZSjAgcEe3J; H_BDCLCKID_SF=tJAOoCLytI03qn5zq4Oh-4oHhxoJq5QxbT7Z0l8KtfcNVJQs-lCMhbtp-l3GJPoLWK6hBKQmWIQHDnbsbq0M2tcQXR5-WROCte74KKJx-4PWeIJo5tKh04JbhUJiB5OLBan7Lq7xfDDbbDtmej_3-PC3ql6354Rj2C_X3b7EfKjIOtO_bfbT2MbyeqrNQlTkLIvXoITJQD_bEP3Fbfj2DPQ3KabZqjDjJbue_I05f-oqebT4btbMqRtthf5KeJ3KaKrKW5rJabC3hPJeKU6qLT5Xjh6B5qDfyDoAbKOt-IOjhb5hMpnx-p0njxQyaR3RL2Kj0p_EWpcxsCQqLUonDh8L3H7MJUntKjnRonTO5hvvhb6O3M7-XpOhDG0fJjtJJbksQJ5e24oqHP-kKPrV-4oH5MQy5toyHD7yWCvjWlT5OR5Jj6KMjMkb3xbz2fcpMIrjob8M5CQESInv3MA--fcLD2ch5-3eQgTI3fbIJJjWsq0x0-jle-bQypoa-U0j2COMahkMal7xO-QO05CaD53yDNDqtjn-5TIX_CjJbnA_Hn7zepoxebtpbt-qJJjzMerW_Mc8QUJBH4tR-T3keh-83xbnBT5KaKO2-RnPXbcWjt_lWh_bLf_kQN3TbxuO5bRiL66I0h6jDn3oyT3VXp0n54nTqjDHfRuDVItXf-L_qtDk-PnVeUP3DhbZKxtqtDKjXJ7X2fclHJ7z-R3IBPCD0tjk-6JnWncKaRcI3poiqKtmjJb6XJkl2HQ405OT-6-O0KJcbRodobAwhPJvyT8DXnO7-fRTfJuJ_DDMJDD3fP36q4QV-JIehmT22jnT32JeaJ5n0-nnhP3mBTbA3JDYX-Oh-jjRX56GhfO_0R3jsJKRy66jK4JKjHKet6vP; ispeed_lsm=0; H_PS_PSSID=1421_24558_21120_17001_24880_22072; BD_UPN=123253; H_PS_645EC=44be6I1wqYYVvyugm2gc3PK9PoSa26pxhzOVbeQrn2rRadHvKoI%2BCbN5K%2Bg; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598',
'Host':'www.baidu.com',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}

# response=requests.get('https://www.baidu.com/s?'+urlencode({'wd':'美女'}),headers=headers)
response=requests.get('https://www.baidu.com/s',params={'wd':'美女'},headers=headers) #params內部就是調用urlencode
print(response.text)
View Code
 Cookie

```
Cookie: "......"
一樣是一個比較關鍵的字段,Cookie是 client 請求 服務器時,服務器會返回一個鍵值對樣的數據給瀏覽器,下一次瀏覽器再訪問這個域名下的網頁時,就須要攜帶這些鍵值對數據在 Cookie中,用來跟蹤瀏覽器用戶的訪問先後路徑。 
在爬蟲時,我會根據前次訪問獲得 cookie數據,而後添加到下一次的訪問請求頭中。
```

- User-Agent

```
中文名用戶代理,服務器今後處知道客戶端的 操做系統類型和版本,電腦CPU類型,瀏覽器種類版本,瀏覽器渲染引擎,等等。這是爬蟲當中最最重要的一個請求頭參數,因此必定要僞造,甚至多個。若是不進行僞造,而直接使用各類爬蟲框架中自定義的user-agent,很容易被封禁。舉例:
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
網上有不少的用戶代理大全,用戶代理大全越多越好,用以僞造多個請求頭。
```
- Referer
```
瀏覽器上次訪問的網頁url,uri。因爲http協議的無記憶性,服務器可從這裏瞭解到客戶端訪問的先後路徑,並作一些判斷,若是後一次訪問的 url 不能從前一次訪問的頁面上跳轉得到,在必定程度上說明了請求頭有可能僞造。 
我在爬蟲時,起始入口我會給一個隨意的百度搜索地址,而後,在爬取過程當中,不斷將索引頁面的url添加在僞造請求頭中。
Referer: https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3&rsv_spt=1&rsv_iqid=0xce19ceff0002f196&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&oq=%25E7%25BE%258E%25E5%25A5%25B3&inputT=4&rsv_t=46216vF7O9LH18hEfGKnjaFukwpJdM3UIwrvEb6LkFIXOIsDt2OQf5Ocfy%2F5LJsCTnkJ&rsv_sug3=9&rsv_sug1=6&rsv_sug7=100&rsv_sug2=0&rsv_pq=e4b29f73000184eb&rsv_sug4=596&rsv_sug=1
```

- Accept:
```
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

指定客戶端能夠接受的內容類型,好比文本,圖片,應用等等,內容的前後排序表示客戶端接收的前後次序,每種類型之間用逗號隔開。 
其中,對於每一種內容類型,分號 ; 後面會加一個 q=0.6 這樣的 q 值,表示該種類型被客戶端喜歡接受的程度,若是沒有表示 q=1,數值越高,客戶端越喜歡這種類型。 
爬蟲的時候,我通常會僞造若干,將想要找的文字,圖片放在前面,其餘的放在後面,最後必定加上*/*;q=0.8。

好比Accept: image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*

text/xml,text/shtml:文本類型,斜槓後表示文檔的類型,xml,或者shtml
application/xml,application/xhtml+xml:應用類型,後面表示文檔類型,好比 flash動畫,excel表格等等
image/gif,image/x-xbitmap:圖片類型,表示接收何種類型的圖片
```

- Accept-Language
```
客戶端能夠接受的語言類型,參數值規範和 accept的很像。通常就接收中文和英文,有其餘語言需求自行添加。好比:

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
zh-CN:中文簡體大陸?
zh:其餘中文
en-US:英語美語
en:其餘英語

Accept-Language: zh-CN,zh;q=0.9
```

- Accept-Encoding: 
```
客戶端接收編碼類型,一些網絡壓縮格式。我看了不少常見的請求頭,基本上都不變,就是以下:

Accept-Encoding: gzip, deflate, sdch。相對來講,deflate是一種過期的壓縮格式,如今經常使用的是gzip
```
- Cache-Control
```
Cache-Control: no-cache
指定了服務器和客戶端在交互時遵循的緩存機制,便是否要留下緩存頁面數據。 
通常在使用瀏覽器訪問時,都會在計算機本地留下緩存頁面,至關因而瀏覽器中的頁面保存和下載選項。可是爬蟲就是爲了從網絡上爬取數據,因此幾乎不會從緩存中讀取數據。因此在設置的時候要側重從服務器請求數據而非加載緩存。

no-cache:客戶端告訴服務器,本身不要讀取緩存,要向服務器發起請求
no-store:同時也是響應頭的參數,請求和響應都禁止緩存,即不存儲
max-age=0:表示當訪問過此網頁後的多少秒內再次訪問,只加載緩存,而不去服務器請求,在爬蟲時通常就寫0秒
通常爬蟲就使用以上幾個參數,其餘的參數都是接受緩存的,因此就不列出了。

```

- Connection
```
Connection: keep-alive
請求頭的 header字段指的是當 client 瀏覽器和 server 通訊時對於長連接如何處理。因爲http請求是無記憶性的,長鏈接指的是在 client 和server 之間創建一個通道,方便二者之間進行屢次數據傳輸,而不用來回傳輸數據。有 close,keep-alive 等幾種賦值,close表示不想創建長鏈接在操做完成後關閉連接,而keep-alive 表示但願保持暢通來回傳輸數據。

此外,connection還能夠存放一些自定義聲明,好比:

Connection: my-header, close
My-Header: xxx
其中,my-header指的是當前訪問請求中使用的請求頭,close表示數據傳輸完畢後不保持暢通,關閉連接。

在爬蟲時我通常都創建一個長連接。
```


- Host
```
Host:www.baidu.com
訪問的服務器主機名,好比百度的 www.baidu.com。這個值在爬蟲時能夠從 訪問的 URI 中得到
```

- Pragma
```
Pragma: no-cache
和 cache-control相似的一個字段,可是具體什麼含義我尚未查清楚,通常爬蟲時我都寫成 no-cache。
```

- Proxy-Connection
```
當使用代理服務器的時候,這個就指明瞭代理服務器是否使用長連接。可是,數據在從client 到代理服務器,和從代理服務器到被請求的服務器之間若是存在信息差別的話,會形成信息請求不到,可是在大多數狀況下,都仍是可以成立的。
```

- Accept-Charset
```
指的是規定好服務器處理表單數據所接受的字符集,也就是說,客戶端瀏覽器告訴服務器本身的表單數據的字符集類型,用以正確接收。若沒有定義,則默認值爲「unknown」。若是服務器沒有包含此種字符集,就沒法正確接收。通常狀況下,在爬蟲時我不定義該屬性,若是定義,例子以下:
Accept-Charset:gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7
```

- Upgrade-Insecure-Requests
```
自動將不安全的訪問請求轉換成安全的請求 request。賦值數字1表示能夠,0就表示不能夠。
```
- Range
```
瀏覽器告訴 WEB 服務器本身想取對象的哪部分。這個在爬蟲時我接觸比較少,通常都是爬取整個頁面,而後再作分析處理。
```
- If-Modified-Since
```
只有當所請求的內容在指定的日期以後又通過修改才返回它,不然返回304。其目的是爲了提升訪問效率。可是在爬蟲時,不設置這個值,而在增量爬取時才設置一個這樣的值,用以更新信息。
```
請求參數詳解
# PC端

# Opera
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60
Opera/8.0 (Windows NT 5.1; U; en)
Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50
 
# Firefox
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10
 
# Safari
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
 
# chrome
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16
 
# 360
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
 
 
# 淘寶瀏覽器
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11
 
# 獵豹瀏覽器
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER) 
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)"

# QQ瀏覽器
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)

# sogou瀏覽器
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)

# maxthon瀏覽器
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36

# UC瀏覽器
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36


# 手機端: 

# IPhone
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
 
# IPod
Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
 
# IPAD
Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5
Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
 
# Android
Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
 
# QQ瀏覽器 Android版本
MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
 
# Android Opera Mobile
Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10
 
# Android Pad Moto Xoom
Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
 
# BlackBerry
Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+
 
# WebOS HP Touchpad
Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0
 
# Nokia N97
Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124
 
# Windows Phone Mango
Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)
 
# UC瀏覽器
UCWEB7.0.2.37/28/999

# NOKIA5700
NOKIA5700/ UCWEB7.0.2.37/28/999
 
# UCOpenwave
Openwave/ UCWEB7.0.2.37/28/999
 
# UC Opera
Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999
User-Agent大全

 

五 Response

複製代碼
 
# 一、響應狀態: 
    200:表明成功
    301:表明跳轉
    404:文件不存在
    403:權限
    502:服務器錯誤

# 二、響應頭: Respone header
    set-cookie:可能有多個,是來告訴瀏覽器,把cookie保存下來。
    
# 三、網頁源代碼: preview
    最主要的部分,包含了請求資源的內容,如網頁html、圖片和二進制數據等。
 
複製代碼

 

六 總結

複製代碼
 
# 一、總結爬蟲流程:
    爬取--->解析--->存儲

# 二、爬蟲所需工具:
    請求庫:requests,selenium
    解析庫:正則,beautifulsoup,pyquery
    存儲庫:文件,MySQL,Mongodb,Redis

# 三、爬蟲經常使用框架:
    scrapy
 
複製代碼
import requests
import re
import time
import hashlib

def get_page(url):
    print('GET %s' %url)
    try:
        response=requests.get(url)
        if response.status_code == 200:
            return response.content
    except Exception:
        pass

def parse_index(res):
    obj=re.compile('class="items.*?<a href="(.*?)"',re.S)
    detail_urls=obj.findall(res.decode('gbk'))
    for detail_url in detail_urls:
        if not detail_url.startswith('http'):
            detail_url='http://www.xiaohuar.com'+detail_url
        yield detail_url

def parse_detail(res):
    obj=re.compile('id="media".*?src="(.*?)"',re.S)
    res=obj.findall(res.decode('gbk'))
    if len(res) > 0:
        movie_url=res[0]
        return movie_url


def save(movie_url):
    response=requests.get(movie_url,stream=False)
    if response.status_code == 200:
        m=hashlib.md5()
        m.update(('%s%s.mp4' %(movie_url,time.time())).encode('utf-8'))
        filename=m.hexdigest()
        with open(r'./movies/%s.mp4' %filename,'wb') as f:
            f.write(response.content)
            f.flush()


def main():
    index_url='http://www.xiaohuar.com/list-3-{0}.html'
    for i in range(5):
        print('*'*50,i)
        #爬取主頁面
        index_page=get_page(index_url.format(i,))
        #解析主頁面,拿到視頻所在的地址列表
        detail_urls=parse_index(index_page)
        #循環爬取視頻頁
        for detail_url in detail_urls:
            #爬取視頻頁
            detail_page=get_page(detail_url)
            #拿到視頻的url
            movie_url=parse_detail(detail_page)
            if movie_url:
                #保存視頻
                save(movie_url)


if __name__ == '__main__':
    main()


#併發爬取
from concurrent.futures import ThreadPoolExecutor
import queue
import requests
import re
import time
import hashlib
from threading import current_thread

p=ThreadPoolExecutor(50)

def get_page(url):
    print('%s GET %s' %(current_thread().getName(),url))
    try:
        response=requests.get(url)
        if response.status_code == 200:
            return response.content
    except Exception as e:
        print(e)

def parse_index(res):
    print('%s parse index ' %current_thread().getName())
    res=res.result()
    obj=re.compile('class="items.*?<a href="(.*?)"',re.S)
    detail_urls=obj.findall(res.decode('gbk'))
    for detail_url in detail_urls:
        if not detail_url.startswith('http'):
            detail_url='http://www.xiaohuar.com'+detail_url
        p.submit(get_page,detail_url).add_done_callback(parse_detail)

def parse_detail(res):
    print('%s parse detail ' %current_thread().getName())
    res=res.result()
    obj=re.compile('id="media".*?src="(.*?)"',re.S)
    res=obj.findall(res.decode('gbk'))
    if len(res) > 0:
        movie_url=res[0]
        print('MOVIE_URL: ',movie_url)
        with open('db.txt','a') as f:
            f.write('%s\n' %movie_url)
        # save(movie_url)
        p.submit(save,movie_url)
        print('%s下載任務已經提交' %movie_url)
def save(movie_url):
    print('%s SAVE: %s' %(current_thread().getName(),movie_url))
    try:
        response=requests.get(movie_url,stream=False)
        if response.status_code == 200:
            m=hashlib.md5()
            m.update(('%s%s.mp4' %(movie_url,time.time())).encode('utf-8'))
            filename=m.hexdigest()
            with open(r'./movies/%s.mp4' %filename,'wb') as f:
                f.write(response.content)
                f.flush()
    except Exception as e:
        print(e)

def main():
    index_url='http://www.xiaohuar.com/list-3-{0}.html'
    for i in range(5):
        p.submit(get_page,index_url.format(i,)).add_done_callback(parse_index)


if __name__ == '__main__':
    main()
爬取校花網視頻
相關文章
相關標籤/搜索