爬蟲入門的一點筆記

8月13號開始,用了六天學習了來自傳智播客的“六節(jié)課掌握爬蟲入門”課程,對python爬蟲技術(shù)有了初步的了解,能夠用爬蟲的原理寫基本的小程序,通過對樣例對人人網(wǎng)、豆瓣電影以及糗事百科的爬取,了解了html,xpath等知識。寫下總結(jié),以防忘記。視頻來源:http://yun.itheima.com/course/368.html

第一課:爬蟲基礎知識和軟件準備

什么是爬蟲:

  • 爬蟲就是指模擬客戶端(瀏覽器)發(fā)送網(wǎng)絡請求獲取響應,按規(guī)則提取數(shù)據(jù)的程序
  • 模擬客戶端(瀏覽器)發(fā)送網(wǎng)絡請求:和瀏覽器發(fā)送一模一樣的數(shù)據(jù)

爬蟲獲取的數(shù)據(jù)去了哪里:

  • 1.可以通過處理或者直接呈現(xiàn)出來,獲取我們想要的數(shù)據(jù);
  • 2.可以進一步分析,機器學習領域等。

需要的軟件和環(huán)境:

  • python版本:python3.6.5(3.x即可)
  • python IDE:我選擇的是pycharm,當然也可以用VS code,甚至有些大神會選擇用python自帶的IDLE,順手就好。
  • 瀏覽器:我選的是我常用的一款瀏覽器Google的Chrome瀏覽器,功能比較強大,擴展性能好。選擇自己順手的就好,不必苛求,當然,不建議用IE和某些不知名的瀏覽器,會出各種奇奇怪怪的東西,國產(chǎn)瀏覽器的話,360,QQ還是不錯的。
  • 需要導入的包:requests(獲取響應),json(獲取網(wǎng)頁內(nèi)容,Python自帶),lxml(寫xpath,獲取網(wǎng)頁內(nèi)容),retrying(提高容錯性)
  • 前期準備:要了解python的基本語法,熟悉列表,字典,函數(shù)(函數(shù)的創(chuàng)建和調(diào)用),以及自定義類的用法,需要一部分html的知識。

瀏覽器的請求

  • URL(統(tǒng)一資源定位符):
    • 在chrome瀏覽器中“右鍵”→“檢查”點擊選項卡“network”
    • URL = 請求的協(xié)議(http/https)+網(wǎng)站域名+資源的路徑+url地址參數(shù)(對方服務器解析)
    • URL地址中如果出現(xiàn)百分號,亂碼等,可以用相關(guān)工具進行解碼。
  • 瀏覽器請求URL地址:
    • 當前URL的響應+js+css+圖片-->elements中的內(nèi)容
  • 爬蟲請求URL地址:
    • 僅包含當前URL的響應
  • elements的內(nèi)容和爬蟲獲取到的URL地址的響應不同:
    • 所以需要爬蟲以當前對應的URL地址的響應為準提取數(shù)據(jù)
    • 當前URL地址的響應,在network里Response里可以查看,也可以打開網(wǎng)頁原碼進行查看

以上兩個的區(qū)別,比如我們請求一個JS文件的URL,大家都知道,js文件是用來規(guī)范網(wǎng)頁顯示格式的一種程序,如果我們用瀏覽器請求,那我們可以看到它正常的顯示效果,但當我們用爬蟲去請求時,只會拿到一堆字符串,無法執(zhí)行。

第二課:認識HTTP、HTTPS和requests模塊

認識HTTP、HTTPS

  • HTTP:超文本傳輸協(xié)議
    • 以明文形式傳輸,效率高,不安全
  • HTTPS:HTTP+SSL(安全套接字層)
    • 傳輸數(shù)據(jù)前先加密,接收數(shù)據(jù)后解密獲取內(nèi)容,效率低,更安全。
    • GET請求和POST請求的區(qū)別:
      • GET請求無請求體,POST請求有請求體。
      • POST請求常用于登錄、注冊,傳輸大文本等(因為POST請求可以攜帶比GET更大的數(shù)據(jù)量),例如翻譯網(wǎng)頁等。
  • HTTP協(xié)議之請求
    • 1.請求行
    • 2.請求頭
      • User-Agent(用戶代理):對方服務器通過user-agent知道請求對方資源的是什么瀏覽器,或者說是不是瀏覽器,通過chrome可以模仿(模擬)手機版的網(wǎng)頁瀏覽,模仿時候,user-agent是改成手機版的。
      • Accept:告訴服務端,我想接受什么數(shù)據(jù)
      • Accept-Encoding:告訴服務端我可以接受什么編碼方式的數(shù)據(jù)。
      • Accept-Language:告訴服務端我們希望接受什么語言的數(shù)據(jù)。
      • Cookie:用來存儲用戶信息的,每次請求都會被帶上發(fā)送給對方的瀏覽器。
        • 要獲取登陸后才能訪問的頁面的內(nèi)容
        • 對方的服務器會通過cookie來判斷爬蟲

      我們已經(jīng)了解過了,爬蟲就是用來模擬瀏覽器發(fā)送請求,怎樣才能模擬的像呢?我們可以看一下瀏覽器里面的Request Header 發(fā)現(xiàn)里面有許多參數(shù),上面羅列的這幾項也包含在這里面,所以,如果想要模擬的像,就可以把這些參數(shù)全部帶上。特別是,當我們發(fā)現(xiàn)只帶User-Agent不行時,就需要帶上一些別的字段,如host等。

    • 3.請求體:攜帶數(shù)據(jù)
    • GET請求:沒有請求體
    • POST請求:有請求體
  • HTTP協(xié)議之響應:
    • 1.響應頭
      • Set-Cookie:通過這個鍵,對方服務器可以向本地設置Cookie(Response Cookie)
    • 2.響應體
      • URL地址對應的響應

requests模塊

  • 安裝requests模塊:
    • requests模塊是一個第三方模塊
      • pip install requests
      • 或者在你的IDE中直接加載配置(建議)
  • requests模塊的使用
    • 首先,像許多別的python第三方模塊一樣,用之前,我們需要
    import request
    
    • 發(fā)送GET、POST請求,獲取響應
    response1 = requests.get(url)   #get請求,獲取響應
    response2 = requests.post(url,data = {請求體的字典})    #post請求,需要請求體
    
    這個時候,當我們直接print(response1)或者print(response2)的話,會得到一個<Response [200]> 其中200是狀態(tài)碼,如果學過HTTP知識的話,我們知道,這是一個代表正常訪問(200 OK)的狀態(tài)碼(關(guān)于狀態(tài)碼的詳細可以百度百科,我們常見的404NotFound就屬于狀態(tài)碼)

response的方法:

  • 1.response.content.decode()

此方法是把響應的二進制字節(jié)流轉(zhuǎn)化為字符串類型

  • 2.response.text

該方法獲取網(wǎng)頁內(nèi)容時往往會出現(xiàn)亂碼,所以要在此前加上一個response.encoding = "utf-8"

  • 3.response.request.url

獲取發(fā)送請求的url地址

  • 4.response.url

獲取響應的url地址

  • 5.response.request.headers

請求頭

  • 6.requests.headers

響應頭

獲取網(wǎng)頁原碼的方式:

  • 1.response.content.decode()
  • 2.response.content.decode("gbk")

某些網(wǎng)站的 編碼方式不是使用的"utf-8"而是"gbk"

  • 3.response.text 》

因為.text方法是根據(jù)響應頭部的編碼進行推測,所以放到最后使用,有時候也會推測正確

當我們拿到一個網(wǎng)頁,用以上三種方式,一定可以獲取到網(wǎng)頁正確解碼方式的字符串

攜帶header的請求

  • 為了模擬瀏覽器(更像)獲得和瀏覽器一模一樣的內(nèi)容。
headers = {
"User-Agent","Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1"
,"Referer":"https://www.baidu.com/link?url=2AZ4aoeuSBsv_DIT2glxe8YKtzrFnpjE6gE0kBfZAIYHR68fCE_qEqJHAwCGLxwZ9EgAWJ1VlgWpsc2AP0w9h8HCCYyk76C4ZkZ31Kkx6Oa&wd=&eqid=b52b5e950002d7ea000000045b7ab019"
,"Cookie":"__cfduid=d1980ca26bf900a830b821bbeb347e14e1524844627; BDUSS=ZZTlpUbjFKSWlzNWd3MFBJTnA2OXRTfjVRM2JtQjExVlNxbXVwRmFuOWhRcGRiQVFBQUFBJCQAAAAAAAAAAAEAAADfpd0Tz8q9o8bvz7rXqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGG1b1thtW9bbF; BIDUPSID=64317FC091E534AA95A51E108E720B05; PSTM=1534572862; BAIDUID=64317FC091E534AA9D2CA222BE99583F:FG=1; PSINO=5; pgv_pvi=8543101952; pgv_si=s5921124352; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; H_PS_PSSID=1441_21124_26350_26921_20929; Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1534689869,1534750696,1534750859,1534767134; Hm_lpvt_55b574651fcae74b0a9f1cf9c8d7c93a=1534767134; BKWPF=3"
,"Host":"baike.baidu.com"
}

當我們只帶header不夠的時候,可以帶點別的東西進去,比如Referer,Host,還有最重要的Cookie

例子是百度百科“HTTP狀態(tài)碼”詞條,代理用的是IPad

注意,這些全部都是放在header里面的,當現(xiàn)實狀態(tài)碼為200時,但沒有反應,就是缺Header

第三課:retrying模塊的使用和攜帶cookie的請求

超時參數(shù)的使用

  • requests.get(url,headers = headers, timeout = 3)#timeout 就是我們所說的超時參數(shù),設置為3,是指3秒如果還鏈接不到(沒有返回響應)的話,就報錯。

retrying模塊的使用

  • retrying模塊是一個第三方模塊,我們在此使用這個模塊的目的是防止網(wǎng)站請求超時
  • 舉個例子

假設我們要獲取一批url地址,其中某一個地址處于某種原因,鏈接失敗,當我一般碰到鏈接失敗的時候,一般會選擇刷新網(wǎng)頁,但如果我們發(fā)現(xiàn)刷新幾次都沒有反應,我們就不必在這個地方糾結(jié),直接爬取下一個網(wǎng)頁就好了,retrying模塊就是起到這個目的。

  • 首先 pip install retrying
form retrying import retry

@retry(stop_max_attempt_time = 3)
def func1():
    print("~~~~~~~~~")
    raise ValueError("error!")

上面函數(shù)用retry修飾,函數(shù)反復執(zhí)行三次,如果三次全報錯,則報錯,如果三次中有一次正常運行,則程序繼續(xù)走。“stop_max_attemp_time”參賽可以更改。

requests模塊處理cookie相關(guān)請求:

  • 直接攜帶cookie請求url地址:
    • 直接把cookie放在requests的方法的headers參數(shù)里(抓包獲取cookie)

    • cookie字典:獲取cookie字典,然后放在cookie參數(shù)里

    cookie = "anonymid=jktqcaaz-yc3q1e; depovince=SD; jebecookies=24118536-4dae-4958-ac10-cdf927806f0c|||||; _r01_=1; JSESSIONID=abcWx0fQyxjZQayV6K4uw; ick_login=74306d5d-341d-4ff8-8f3c-5d386dc971cd; _de=FF874E9B1254101280671A4BC2EEBA1B; p=e33464b788d6245684e63870b87557347; first_login_flag=1; ln_uact=15062181376; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=74d612143be059c7c0a75fd5433c1dc87; societyguester=74d612143be059c7c0a75fd5433c1dc87; id=568207047; xnsid=c76bfd9c; loginfrom=syshome; wp_fold=0"
    cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split(";")}  
    
  • 發(fā)送post請求獲取cookie
      1. session = requests.session()#session的方法和requests一樣
      1. session.post(url, data, headers)#服務器設置的cookie會保存在session中
      1. session.get(url)#會帶上之前保存在session中的cookie

第四課:數(shù)據(jù)提取方法之json

json

  • 數(shù)據(jù)交換格式,看起來像python類型(列表,字典)的字符串
  • 哪里會返回json的數(shù)據(jù)
    • 瀏覽器切換到手機版,并不是每個頁面都會返回json數(shù)據(jù)
    • 抓包的軟件和app
  • json.loads()
    • 把json字符串轉(zhuǎn)換為python類型
    • json.loads('json字符串')#如果保存,一般由于不是json字符串導致的
  • json.dumps(
    • 把python類型轉(zhuǎn)化為json字符串
    • json.dumps({'1':"hello",'2':'world'},ensure_ascii = False, indent = 2)
      • ensure_ascii = False #能夠讓中文顯示
      • indent = 2 #上一行和下一行直接回車空格

      注意一點,當URL中帶有callback=???時,直接刪掉即可,沒有什么用,帶著還不能構(gòu)造json字符串

第五課:xpath和lxml模塊

xpath

  • 一門從html提取數(shù)據(jù)的語言

xpath語法

  • xpath helper插件:幫助我們從elements中定位數(shù)據(jù)
    • 1.“/”選擇節(jié)點(標簽):
      • '/html/head/meta':能夠選擇html head中所有meta標簽
    • 2.“//”從任意節(jié)點開始選擇
      • “//li”選擇頁面上所有l(wèi)i標簽
      • “/html/head//link”選擇head下所有的link標簽
    • 3."@"符號的用途
      • 選擇具體的某個元素:“//div[@class = 'content']/ul/li”

        選擇class = 'content' 的div下的ul的li
        - “/a/@href”獲取選擇的a的href的值

    • 4.獲取文本
      • /a/text():獲取a的文本
      • /a//text():獲取a下所有的文本
    • 5.“./a”當前節(jié)點下的a標簽

lxml模塊

安裝lxml

  • pip install lxml
  • 在IDE中直接配置安裝(推薦)

使用

from lxml import etree
elements = etree.HTML('html字符串')
elements.xpath('xpath語句')

第六課:實戰(zhàn)訓練案例/爬蟲流程概念

基礎知識補充

  • 列表推導式

    • 幫助我們迅速生成列表
      [i for i in range(1,10)]
    

    生成一個[1,2,3,4,5,6,7,8,9,10]列表

      [i+10 for i in range(10)]
    

    生成[10,12,13……18,19]列表

  • 字典推導式

    • 幫助我們快速生成字典
       {i+10: i for i in range(10)}
    

    生成的字典為{10:0,11:1,12:2……18:8,19:9}

  • 三元運算符

    a = 10 if 3<4 else 20
    

    a = 10 因為3<4成立

    a = 10 if 3>4 else 20
    

    a = 20 因為3>4不成立

    -若if后面條件成立,則把if前面的值賦給變量,若不成立,則把后面的值付給變量。

一個爬蟲的基本流程(討論)

  • 1.URL:
    • 知道URL地址的規(guī)律和需要爬取的數(shù)量,構(gòu)造URL地址列表,可以用python字符串的方法,比如format,strip等。
    • start_url 初始字符串
  • 2.發(fā)送請求,獲取響應
    • requests方法,get或者post請求
  • 3.提取數(shù)據(jù)
    • 返回json字符串:json模塊
    • 若返回html字符串:lxml模塊
  • 4.保存數(shù)據(jù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • HTTP基本原理 URI、URL、URN(Uninform Resource) URI(Identifier):統(tǒng)...
    GHope閱讀 2,280評論 2 26
  • scrapy學習筆記(有示例版) 我的博客 scrapy學習筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 13,073評論 4 46
  • Python學習網(wǎng)絡爬蟲主要分3個大的版塊:抓取,分析,存儲 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細...
    楚江數(shù)據(jù)閱讀 1,525評論 0 6
  • Python入門網(wǎng)絡爬蟲之精華版 網(wǎng)址: https://github.com/lining0806/Python...
    ZHANG_GO閱讀 741評論 0 2

友情鏈接更多精彩內(nèi)容