爬蟲的比喻:css
互聯網就像一張蜘蛛網,爬蟲至關於蜘蛛,數據至關於獵物html
爬蟲的具體定義:python
模擬瀏覽器向後端發送請求,獲取數據,解析而且得到我想要的數據,而後存儲web
爬蟲的價值:數據庫
數據的價值json
發送請求--得到數據--解析數據--存儲數據後端
解析庫:bs4,pyquery,re瀏覽器
請求:服務器
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格式
安裝: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]
一、類選擇器
(「.類名」)
二、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標籤裏面全部的標籤和子節(不是列表,須要遍歷取出來)
安裝: 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.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是步長
.