黑馬爬蟲資料
目錄
爬蟲概念、工具和HTTP
1.什么爬蟲
-
爬蟲就是
模擬客戶端(瀏覽器)發送網絡請求
,獲取響應,按照規則提取數據的程序 -
模擬客戶端(瀏覽器)發送網絡請求
: 照着瀏覽器發送一模一樣的請求,獲取和瀏覽器一模一樣的數據
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地址對應的響應為准提取數據
-
當前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地址對應的響應
- 1.響應頭
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 #響應請求
獲取網頁源碼的正確打開方式(通過下面三種方式一定能夠獲取到網頁的正確解碼之后的字符串)
-
- response.content.decode()
-
- response.content.decode("gbk")
-
- 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地址
-
- cookie放在headers中
-
headers= {"User-Agent":"....","Cookie":"cookie 字符串"}
- 2. cookie字典傳給cookies參數
- requests.get(url,cookies=cookie_dict)
- 先發送post請求,獲取cookie,帶上cookie請求登錄后的頁面
-
- seesion = requests.session()#session具有的方法和requests一樣
-
- session.post(url,data,headers) #服務器設置在本地的cookie會笨哦存在session
-
- session.get(url) #會帶上之前保存在session中的cookie,能夠請求成功
-
數據提取方法
json
-
數據交換格式,看起來像python類型(列表,字典)的字符串
-
使用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
中定位數據 -
- 選擇節點(標簽)
/html/head/meta
:能夠選中html下的head下的所有的meta標簽
-
//
:能夠從任意節點開始選擇
//li
:當前頁面上的所有的li標簽/html/head//link
:head下的所有的link標簽
-
@符號的用途
- 選擇具體某個元素:
//div[@class='feed']/ul/li
- 選擇class='feed'的div下的ul下的li
a/@href
:選擇a的href的值
-
- 獲取文本:
/a/text()
:獲取a下的文本/a//text()
:獲取a下的所有的文本
-
- 點前
./a
當前節點下的a標簽
- xpath helper插件:幫助我們從
-
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
寫爬蟲的討論
-
- url
- 知道url地址的規律和總得頁碼數:構造url地址的列表
- start_url
-
2.發送請求,獲取響應
- requests
-
3.提取數據
- 返回json字符串:json模塊
- 返回的是html字符串:lxml模塊配合xpath提取數據
-
4.保存