天天看點

了解爬蟲

1 什麼是網際網路

網際網路是由于網絡裝置(網線,路由器,交換機,防火牆等等)和計算機連接配接而成,像一張網一樣。

1.1 網際網路建立的目的?

網際網路的核心價值在于資料的共享和傳遞,資料是放在一台計算機上 的,而将計算機互聯到一起的目的就是為了能夠友善彼此之間資料的共享和傳遞,否則你隻能拿優盤取别人計算機上拷貝資料。

2 什麼是上網?

我們所謂的上網便是由使用者端計算機發送請求給目标計算機,将目标計算機上的書籍下載下傳到本地的過程。

什麼是爬蟲?

爬蟲的定義:向網站發起請求,擷取資源後分析并提取有用資料的程式

使用者擷取網絡資料的方式是:浏覽器送出請求->下載下傳網頁代碼->解析/渲染成頁面。

爬蟲學術概念:爬取資料,爬蟲就是通過編寫程式模拟浏覽器上網,讓其去網際網路上抓取資料的過程。

爬蟲程式要做的就是:

模拟浏覽器發送請求->下載下傳網頁的代碼->隻提取有用的資料->存放與資料庫或者檔案中。

爬蟲程式隻提取網頁代碼中對我們有用的資料。

模拟浏覽器發送請求

為什麼要使用爬蟲技術

requests 子產品底層幫助我們封裝好了socket套接字,我們隻需要關注http協定的通信流程;

普通使用者擷取資料:

​ 打開浏覽器,輸入網址

​ 通路目标網站

​ 目标網站将資料傳回給浏覽器

​ 浏覽器将資料進行渲染

​ 然後可以手動擷取(ctrl+c ctrl + V)

"爬蟲程式"擷取資料:

  1. 模拟浏覽器往目标網站發送請求;
  2. 請求庫:
    • requests子產品
    • selenium子產品
  3. 擷取目标網站傳回的響應資料
  4. 服務端會自動将資料傳回,無需通過代碼實作
  5. 解析并提取有價值的資料
    • 解析子產品
      • re正則子產品
      • BeautifulSoup4解析庫
      • xpath解析文法:通過文檔樹,查找規則
      • selector屬性選擇解析庫:Css
  6. 儲存到資料庫或者本地
    • 存儲庫:
      • MySQL
      • redis
      • mongodb
      • file

爬蟲的全過程

  1. 發送請求(請求體可以攜帶無限的資料)
  2. 擷取響應資料
  3. 解析并且提取資料
  4. 儲存資料

爬蟲三部曲

  1. 發送請求
    • 先分析目标網站的http協定請求流程
    • 編寫代碼
  2. 擷取資料
  3. 儲存資料

爬蟲的價值:

網際網路中最有價值的便是資料,比如天貓商城的商品資訊,鍊家網的租房資訊,雪球網的證券投資資訊等等,這些資料都代表了各個行業的真金白銀,可以說,誰掌握了行業内的第一手資料,誰就成了整個行業的主宰,如果把整個網際網路的資料比喻為一座寶藏,那我們的爬蟲課程就是來教大家如何來高效地挖掘這些寶藏,掌握了爬蟲技能,你就成了所有網際網路資訊公司幕後的老闆,換言之,它們都在免費為你提供有價值的資料。

分析http協定的請求流程

http協定參考連結

  1. 谷歌浏覽器自帶的開發者工具(推薦使用)
  2. fildder(一款軟體,需要下載下傳)
  • GET:
    • 請求url:Request URL: https://www.baidu.com/
    • 請求方式:Request Method: GET
    • 響應頭注意點(請求後,服務端傳回的資料):
      • set-cookies: 服務端告訴浏覽器要儲存cookies
      • Location: 服務端告訴浏覽器需要立馬跳轉的url位址
    • 請求頭注意點(攜帶通路目标服務端的資料):
      • Cookie
      • user-agent: 浏覽器憑證,服務端有可能通過它做反扒
      • Referer: 目前url,上一次通路的url位址;
    • 請求參數:params
      • 可攜帶1KB左右的資料
      • https://www.baidu.com/s?wd=美女 - wd=%E7%BE%8E%E5%A5%B3
  • POST:
    • 請求url:Request URL: https://passport.baidu.com/v2/api/?login
    • 請求方式:Request Method: POST
    • 響應頭注意點(請求後,服務端傳回的資料):
      • set-cookies: 服務端告訴浏覽器要儲存cookies
      • Location: 服務端告訴浏覽器需要立馬跳轉的url位址
    • 請求頭注意點(攜帶通路目标服務端的資料):
      • Cookie
      • user-agent: 浏覽器憑證,服務端有可能通過它做反扒
      • Referer: 目前url,上一次通路的url位址;https://www.baidu.com/s?wd=美女
    • 請求體data:
      • 明文使用者名:
        • 正确使用者名
      • 正确密文pwd:
        • OQUoK471BPXLSQbQ3rKKpbYJZ/x8zgZ91LVs4Bw6sKoNeuJH9KoOkac0mhDiZ/H3n1Adxq1g/tgSD3EEhreqVoxJMO3VxqYH5LDlHR0U0gxeGpeuTaHGKWE4aun6vxVWjYIJcfAmQ3/b2JUqGawYcM9xtJZPrhPU86u/1i7e3DM=

Requests

requests方法總結使用

1、請求方式:

常用的請求方式:GET,POST

其他請求方式:HEAD,PUT,DELETE,OPTHONS

ps:用浏覽器示範get與post的差別,(用登入示範post)

post與get請求最終都會拼接成這種形式:k1=xxx&k2=yyy&k3=zzz
post請求的參數放在請求體内:
    可用浏覽器檢視,存放于form data内
get請求的參數直接放在url後
           

2、請求url

url全稱統一資源定位符,如一個網頁文檔,一張圖檔

一個視訊等都可以用url唯一來确定

url編碼
https://www.baidu.com/s?wd=圖檔
圖檔會被編碼(看示例代碼)
           
網頁的加載過程是:
加載一個網頁,通常都是先加載document文檔,
在解析document文檔的時候,遇到連結,則針對超連結發起下載下傳圖檔的請求
           

3、請求頭

User-agent:請求頭中如果沒有user-agent用戶端配置,

服務端可能将你當做一個非法使用者

host

cookies:cookie用來儲存登入資訊

一般做爬蟲都會加上請求頭
           

4、請求體

如果是get方式,請求體沒有内容

如果是post方式,請求體是format data

ps:
1、登入視窗,檔案上傳等,資訊都會被附加到請求體内
2、登入,輸入錯誤的使用者名密碼,然後送出,就可以看到post,正确登入後頁面通常會跳轉,無法捕捉到post 
           

爬取百度圖檔

from urllib.parse import urlencode
import requests

headers = {
    \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36\',
    \'Accept\': \'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\'
}

# https://www.baidu.com/s?wd=美女
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
reponse.encoding = \'utf8\'
print(response.text)
           

代理IP

https://www.xicidaili.com/wt/

https://www.kuaidaili.com/free/

http://www.xiladaili.com/

proxies=proxies

import requests
from bs4 import BeautifulSoup
header={\'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\'}
proxies = {\'http\': \'120.236.128.201:8060\',
 \'https\': \'120.236.128.201:8060\'
 }
url="http://www.overlove.xin/html/"
header={\'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\'}
req=requests.get(url,headers=header,proxies=proxies,timeout=5)
html=req.text
soup=BeautifulSoup(html,\'lxml\')
print(soup.text)
           
了解爬蟲