爬蟲

一、爬蟲是啥?

爬蟲的比喻:css

互聯網就像一張蜘蛛網,爬蟲至關於蜘蛛,數據至關於獵物html

爬蟲的具體定義:python

模擬瀏覽器向後端發送請求,獲取數據,解析而且得到我想要的數據,而後存儲web

爬蟲的價值:數據庫

數據的價值json

 

發送請求--得到數據--解析數據--存儲數據後端

解析庫:bs4,pyquery,re瀏覽器

二、http協議裏須要關注的

請求:服務器

URL:指明瞭我要取哪裏cookie

method:

GET:

傳遞數據:?&拼在url後面

post:

請求體:

formdata  數據

files   文件

json  json格式

請求頭:

Cookie:

Referer:告訴服務器你從哪裏來

User-Agent:告訴服務器你的身份

 

響應:

Status Code

2xx:成功

3xx:重定向

響應頭:

location:跳轉地址

set_cookie:設置cookie

響應體:

1.html代碼

2.二進制:圖片,視頻,音樂

3.json格式

 

三、 經常使用請求庫、解析庫、數據庫的用法

3.1 經常使用請求庫 測試網站:http://httpbin.org/get

requests庫

安裝:pip install requests

使用

請求

①get請求:

    響應對象 = requests.get(......)

**參數:**

url: 請求的路徑

headers = {}     請求頭數據,優先級高於cookie

cookies = {}   請求攜帶的cookies

params = {}   請求攜帶的參數

proxies = {'http':‘http://端口:ip’} #代理IP

timeout = 0.5 請求超時時間

allow_redirects = False 默認爲Ture容許重定向

 

②post請求:

    響應對象 = requests.post(......)

**參數:**

url: 請求的路徑

headers = {}     請求頭數據,裏面的Cookie優先級高於cookies

cookies = {}

data = {}   請求攜帶的參數

json = {} 請求攜帶的json參數

files = {‘file’:open(...,‘rb’)}   請求攜帶的二進制數據(音頻,視頻)

timeout = 0.5 請求超時時間

allow_redirects = False 默認爲Ture容許重定向

自動保存cookie的請求:

   session = requests.session()  

r = session.get(......)

r = session.post(......)

session.cookies會保存全部請求過的網頁的cookie,下次請求會攜帶過去

r.cookies保存當前請求瀏覽器的cookie


補充:(保存cookie到本地)
import http.cookiejar as cookielib
session.cookie = cookielib.LWPCookieJar()
session.cookie.save(filename='1.txt') #save存cookie

session.cookies.load(filename='1.txt') #load取cookie

響應:

import requests

session = requests.session()

r = session.get('https://www.baidu.com')

   r.url 獲取訪問地址:https://www.baidu.com

r.text 獲取響應的文本數據

r.encoding = 'gbk' 指定解碼碼格式,編碼格式是服務器決定,解碼必須知道編碼格式,獲取編碼格式:decument.charset

r.content 獲取響應體二進制數據,

r.json()將響應回來的數據轉化成python字典,本質:josn.loads(r.text)

r.status_code 獲取響應狀態碼

r.headers 獲取響應頭裏面的東西

r.cookies 獲取當前訪問瀏覽器的cookies

r.history [響應對象1,響應對象2]

 

3.2 經常使用解析語法

css選擇器

一、類選擇器

(「.類名」)

二、id選擇器

(「#ld名」)

三、標籤選擇器

(「標籤名」)

四、後代選擇器

div span{color:red} #用空格隔開--->div裏面的全部span標籤(span是後代)

五、兒子選擇器

div>span{color:red} #用>隔開--->div裏面全部的span標籤(span僅僅是兒子)

六、屬性選擇器

1.【屬性名】有這個屬性名的標籤

2.【屬性=值1】有這個屬性且值等於值1的標籤

3【屬性^ =值1】有這個屬性且以值1開頭的標籤

4.【屬性$=值1】有這個屬性且以值1屬性結尾的標籤

5.【屬性*=值1】有這個屬性且值包含值1的標籤

七、羣組選擇器

div,span,img{color:red} #用逗號隔開   or

意思是:div,span,img 三個標籤都給我變紅

八、多條件選擇器

        <p class="shuang">1</p>
      <p class="mc">2</p>
      <p class="mc">3</p>
       
      p.shuang {
color:red
}

選中的是1,首先全部p標籤,而後屬性是shuang的標籤 選擇器與選擇器之間是and關係

選擇器1選擇器2選擇器3 (選擇器之間沒有空格和逗號)     and關係

BS4

html = '''

<html><head><title>the Dormouse's story<title></head>

<body>

<p class='title'  name='dromouse'>The Dormouse's story</p>

'

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

# 獲取元素(有多個相同元素,返回第一個元素)

print(soup.title)  # <title>the Dormouse's story<title></head>

  print(soup.head) #<head><title>the Dormouse's story<title></head>

#獲取標籤名稱

print(soup.title.name) # title

#獲取屬性
print(soup.p.attrs['name']) # dromous
print(soup.p['name']) #dromous

#獲取內容

print(soup.p.string)  # the the Dormouse's story

#嵌套選擇

print(soup.head.title.string)  #   the the Dormouse's story

#子節點和子孫節點

print(soup.p.contents) #獲取p標籤裏面全部的標籤和子節點(列表的形式)

print(soup.p.children) 獲取p標籤裏面全部的標籤和子節(不是列表,須要遍歷取出來)

 

 

 

3.3 牛逼的requests-html

安裝: pip install requests-html

使用:

請求:

   from requests_html import HTMLSession

session = HTMLSession()

r = session.get(url = 'https://www.baidu.com)

響應對象 = session.request(url = 'https://www.baidu.com,method='get')

響應對象 = session.get(url = 'https://www.baidu.com/get)

響應對象 = session.post(url = 'https://www.baidu.com/post)

參數和requests模塊一毛同樣

響應:

r = session.get(url = 'https://www.baidu.com/get

   r.url 獲取訪問路徑:'https://www.baidu.com/get

**其餘屬性和requests模塊一毛同樣

**

解析:

html對象屬性:

r = session.get(url = 'https://www.baidu.com/get

   r.html.absolute_links 返回頁面全部的絕對連接(包含http的就是絕對路徑)

r.html.links   返回頁面包含的全部原樣連接(就是沒有作任何改變的連接)

  r = session.get(url = 'https://www.baidu.com/p-1-2077.html')

r.html.base_url --->返回網站根路徑 https://www.baidu.com

r.html.html 獲取頁面的Html內容

r.html.text 獲取頁面的文本內容

r.html.encoding = 'gbk' 指定解碼格式

r.html.raw_html 返回二進制流

r.html.pq 獲取pyQuery對象

html對象方法:

from requests_html import HTMLSession

session = HTMLSession()

url ='https://www.183xsw.com/6_6116/'

r = session.get(url = 'https://www.baidu.com/get

r.html.find('css選擇器') 【element對象,element對象,element對象】
​   r.html.find('css選擇器',first = True) element對象,只選取第一條數據   
​   r.html.xpath(‘xpath選擇器’)
​   r.html.xpath('‘xpath選擇器',first = True)
   
​   r.html.search(‘模板’) #匹配到一個resquest對象就中止匹配 【resquest對象】
​   列如:r.html.serach('(提示:{name},最新章節可能會{pwd},登陸書架便可查看)')
   
   會去查找(提示:{},最新章節可能會{},登陸書架便可查看)這樣的一句話,而後name=補全的字
​   r.html.search_all('模板') #匹配全部的resquest對象 【result對象,result對象】
​   
  element對象方法:
  
            a_element = r.html.find('a',first = True)
            a_element.absolute_links  獲取絕對路徑
           
           
            <div id="footer" name="egon">呵呵</div>
            a_element = r.html.find('#footer',first = True)
            a_element.attrs: {'id':'footer','class':'name'}返回一個字典獲取標籤屬性
           
   <a href='https://www.183xsw.com'>183小說網</a>
            a_element.text:  183小說網 獲取文本內容
            a_element.hetml:  <a href='https://www.183xsw.com'>183小說網</a> 獲取html內容
            a_element.raw_html: <a href='https://www.183xsw.com'>183\xd0\xa1\xcb\xb5\xcd\xf8</a> 得到二進制流
  
​     render()方法:       
   from requests_html import HTMLSession
​   session = HTMLSession()
   r = session.get(url='https://www.baidu.com')
   r.html.render() #驅動瀏覽器內核對頁面渲染,第一次用render會下載一個瀏覽器
   
   **參數:**
  
   設置瀏覽器啓動參數:
   
   session = HTMLSession(
   
    browser.args = [
​     '--no-sand',
     #--user-agent等號不能有空格
​     '--user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36’
'
​    ]
   
   )
   
   
  scripy參數:js注入  
   scripy= '''
           
           
            ( ) => {
​    
    大括號裏面寫js代碼,咱們稱之爲js注入
​       }
​      '''
   
   r.html.render(scripy=scripy)
   
​  sleep參數   
   r.html.render(scripy=scripy,sleep = 10) #渲染頁面後停10秒,關閉瀏覽器
  
   
   在瀏覽器控制檯輸入:navigator.webdriver
   
​   1.正常狀況  undefind
   2.render內核渲染瀏覽器 :ture
   
   結論:結果爲ture的是爬蟲
   
   3.在render內核渲染瀏覽器的狀況下寫這段代碼:
   
   scripy= ''' 
                 ()=>{
             Object.defineProperties(navigator,{
                    webdriver:{
                    get: () => undefined
                    }
                })
   ‘’‘
   r.html.render(scripy=scripy)
   
   再次在在瀏覽器控制檯輸入:navigator.webdriver
   
   顯示undefind;
​   keep_page:參數與瀏覽器交互
   瀏覽器關閉,r.html.page爲None,r.html.page沒法與瀏覽器交互,當keep_page爲Ture時
   r.html.page不爲None,保存page對象
   
   
   r.html.render(scripy=scripy,sleep = 10,keep_page=Ture)
   
​        

**與瀏覽器交互    r.html.page是瀏覽器對象

* 開攜程與瀏覽器交互:

from requests_html import HTMLSession

try:

r.html.render(scripy=scripy,sleep = 10,keep_page=Ture)

asynic def main():  #定義攜程函數

      await r.html.page.screenshot({'path':'1.png'}) #截屏操做

session.loop.run_until_complete(main())

finally:
session.close()



await r.html.page.screenshot({'path':路徑}) #截屏

await r.html.page.evaluate('''() =>{js代碼}’‘’})

await r.html.page.cookies() 獲取cookies

await r.html.page.type('css選擇器',’內容‘,{’delay‘:100}) 在輸入框中輸入內容,每0.1秒輸入一次

await r.html.page.click('css選擇器') #點擊事件

await r.html.page.focus('css選擇器') #聚焦事件

await r.html.page.hover('css選擇器') #懸浮事件

await r.html.page..waitForSelector('css選擇器')

await r.html.page.waitFor(1000) #等待幾秒

鍵盤事件 r.html.page.keyboard  事件只觸發一次

   r.html.page.keyboard.down('Shift') #按住shift鍵

r.html.page.keyboard.up('Shift')   #鬆開shift鍵

press是按下再鬆開,再按下在擡起來 = down,up組合

r.html.page.keyboard.press('ArrowLeft')

r.html.page.keyboard.type('喜歡你啊',{‘delay’:100})

鼠標事件 r.html.page.mouse

   r.html.page.mouse.click(x,y,{
              'button':'left',
              'click':1
              'delay':0
})
r.html.page.mouse.down({'button':'left'}) #按下左鍵
r.html.page.mouse.up({'button':'left'}) #鬆開左鍵
r.html.page.mouse.down({'button':'right'}) #按下右鍵
r.html.page.mouse.up({'button':'right'}) #按下右鍵
r.html.page.mouse.move(x,y,{'steps':1}) #鼠標移動 x,y是座標,steps是步長

.

相關文章
相關標籤/搜索