黑馬爬蟲資料

黑馬爬蟲資料

爬蟲概念、工具和HTTP

1.什麼爬蟲

  • 爬蟲就是模擬客戶端(瀏覽器)發送網絡請求,獲取響應,按照規則提取數據的程序html

  • 模擬客戶端(瀏覽器)發送網絡請求 : 照着瀏覽器發送如出一轍的請求,獲取和瀏覽器如出一轍的數據python

2.爬蟲的數據去哪了

  • 呈現出來:展現在網頁上,或者是展現在app上
  • 進行分析:從數據中尋找一些規律

3.須要的軟件和環境

  • python3
    • 黑馬python基礎班15天視屏:http://yun.itheima.com/course/214.html
    • 基礎語法(字符串,列表,字典,判斷和循環)
    • 函數(函數的建立和調用)
    • 面向對象(如何建立一個類,如何使用這個類)
  • pycharm
    • python編輯器
  • chrome瀏覽器
    • 分析網絡請求用的

4.瀏覽器的請求

  • url
    • 在chrome中點擊檢查,點到network,
    • url = 請求的協議+網站的域名+資源的路徑+參數
  • 瀏覽器請求url地址
    • 當前url對應的響應+js+css+圖片 ---》elements中的內容
  • 爬蟲請求url地址
    • 當前url對應的響應
  • elements的內容和爬蟲獲取到的url地址的響應不一樣,爬蟲中須要以當前url地址對應的響應爲準提取數據chrome

  • 當前url地址對應的響應在哪裏
    • 從network中找到當前的url地址,點擊response
    • 在頁面上右鍵顯示網頁源碼

5.認識HTTP、HTTPS

  • HTTP:超文本傳輸協議
    • 以明文的形式傳輸
    • 效率更高,可是不安全
  • HTTPS:HTTP + SSL(安全套接字層)
    • 傳輸以前數據先加密,以後解密獲取內容
    • 效率較低,可是安全
  • get請求和post請求的區別
    • get請求沒有請求體,post有,get請求把數據放到url地址中
    • post請求經常使用於登陸註冊,
    • post請求攜帶的數據量比get請求大,多,經常使用於傳輸大文本的時候
  • HTTP協議之請求
    • 1.請求行
    • 2.請求頭
      • User-Agent:用戶代理:對方服務器可以經過user_agent知道當前請求對方資源的是什麼瀏覽器
    • 若是咱們須要模擬手機版的瀏覽器發送請求,對應的,就須要把user_agent改爲手機版
      • Cookie:用來存儲用戶信息的,每次請求會被攜帶上發送給對方的瀏覽器
    • 要獲取登陸後才能訪問的頁面
      • 對方的服務器會經過cookie來判斷是咱們是一個爬蟲
    • 3.請求體
      • 攜帶數據
      • get請求沒有請求體
      • post請求有請求體
  • HTTP協議之響應
    • 1.響應頭
      • Set-Cookie:對方該字段設置cookie到本地
    • 2.響應體
      • url地址對應的響應

requests模塊的學習

使用事前

  • pip install reqeusts

發送get,post請求,獲取響應

  • response = requests.get(url) #發送get請求,請求url地址對應的響應
  • response = reqeusts.post(url,data={請求體的字典}) ##發送post請求

response的方法

  • response.text
    • 該方式每每會出現亂碼,出現亂碼使用response.encoding="utf-8"
  • response.content.decode()
    • 把響應的二進制字節流轉化爲str類型
  • resposne.request.url #發送請求的url地址
  • response.url #response響應的url地址
  • resposne.request.headers #請求頭
  • resposne.headers #響應請求

獲取網頁源碼的正確打開方式(經過下面三種方式必定可以獲取到網頁的正確解碼以後的字符串)

    1. response.content.decode()
    1. response.content.decode("gbk")
    1. response.text

發送帶header的請求

  • 爲了模擬瀏覽器,獲取和瀏覽器如出一轍的內容
headers = {
"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1",
"Referer": "http://fanyi.baidu.com/?aldtype=16047"}

response = requests.get(url,headers=headers)

使用超時參數

  • requests.get(url,headers=headers,timeout=3) #3秒內必須返回響應,不然會報錯

retrying模塊的學習

  • pip install retrying
from retrying import retry

@retry(stop_max_attempt_number=3)
def fun1():
  print("this is func1")
  raise ValueError("this is test error")

處理cookie相關的請求

  • 人人網{"email":"mr_mao_hacker@163.com", "password":"alarmchime"}
  • 直接攜帶cookie請求url地址
      1. cookie放在headers中
        headers= {"User-Agent":"....","Cookie":"cookie 字符串"}
      1. cookie字典傳給cookies參數
      • requests.get(url,cookies=cookie_dict)
  • 先發送post請求,獲取cookie,帶上cookie請求登陸後的頁面
      1. seesion = requests.session()#session具備的方法和requests同樣
      1. session.post(url,data,headers) #服務器設置在本地的cookie會笨哦存在session
      1. session.get(url) #會帶上以前保存在session中的cookie,可以請求成功

數據提取方法

json

  • 數據交換格式,看起來像python類型(列表,字典)的字符串
  • 使用json以前須要導入json

  • 哪裏會返回json的數據
    • 流程器切換到手機版
    • 抓包app
  • json.loads
    • 把json字符串轉化爲python類型
    • json.loads(json字符串)
  • json.dumps
    • 把python類型轉化爲json字符串
    • json.dumps({})
    • json.dumps(ret1,ensure_ascii=False,indent=2)
      • ensure_ascii :讓中文顯示成中文
      • indent :可以讓下一行在上一行的基礎上空格
  • 豆瓣電視爬蟲案例瀏覽器

xpath和lxml

  • xpath
    • 一門從html中提取數據的語言
  • xpath語法
    • xpath helper插件:幫助咱們從elements中定位數據
      1. 選擇節點(標籤)
      • /html/head/meta :可以選中html下的head下的全部的meta標籤
      1. // :可以從任意節點開始選擇
      • //li :當前頁面上的全部的li標籤
      • /html/head//link :head下的全部的link標籤
      1. @符號的用途
      • 選擇具體某個元素://div[@class='feed']/ul/li
      • 選擇class='feed'的div下的ul下的li
      • a/@href :選擇a的href的值
      1. 獲取文本:
      • /a/text() :獲取a下的文本
      • /a//text() :獲取a下的全部的文本
      1. 點前
      • ./a 當前節點下的a標籤
  • lxml
    • 安裝:pip install lxml
    • 使用
        from lxml import etree
        element = etree.HTML("html字符串")
        element.xpath("")

基礎知識點的學習

  • format:字符串格式化的一種方式
"傳智{}播客".format(1)
  "傳智{}播客".format([1,2,3])
  "傳智{}播客".format({1,2,3})
  "傳智{}播客{}".format({1,2,3},[1,23,2])
  "傳智{}播客{}".format({1,2,3},1)
  • 列表推導式
    • 幫助咱們快速的生成包含一堆數據的列表
        [i+10 for i in range(10)]--->[10,11,12,...19]
        ["10月{}日".format(i) for i in range(1,10)] -->["10月1日","10月2日",..."10月9日"]
  • 字典推導式
    • 幫助咱們快速的生成包含一堆數據的字典
       
     {i+10:i for i in range(10)} #{10:0,11:1,12:2...19:9}
     {"a{}".format(i):10 for i in range(3)}#{"a0":10,"a1":10,"a2":10}
  • 三元運算符
    • if 後面的條件成立,就把if前面的結果賦值給a,不然把else後面的結果賦值給a
       
     a = 10 if 4>3 else 20 # a = 10
     a = 10 if 4<3 else 20 # a =20

    寫爬蟲的討論

    1. url
    • 知道url地址的規律和總得頁碼數:構造url地址的列表
    • start_url
  • 2.發送請求,獲取響應
    • requests
  • 3.提取數據
    • 返回json字符串:json模塊
    • 返回的是html字符串:lxml模塊配合xpath提取數據
  • 4.保存
相關文章
相關標籤/搜索