python3.6。爬蟲學習入門筆記
阿新 • • 發佈:2018-11-11
爬蟲
- 前提知識:
- URL
- HTTP協議
- web前端,html css js
- ajax
- re,Xpath
- XML
爬蟲的定義
- 百度上詳細的介紹
- 三大步驟:
- 下載資訊
- 提取正確的資訊
- 根據一定的規則自定跳到另外的網頁上執行的兩步內容
- 爬蟲分類
- 通用爬蟲
- 專用爬蟲
- pyhon網路包簡介
- 2.X ----
- 3.x----urllib,urllib3,httplib2,requests
urllib
- 包含模組
- urllib.request:開啟和讀取模組的urls
- urllib.error:包含urllib.request產生的常見錯誤,使用try捕捉
- urllib.parse: 包含即系url的方法
- urllib.robotparse:解析robots.txt檔案
- 案例V1
- 網頁編碼問題解決
- chardet 可以自動檢測網頁的編碼格式,但是可能有誤
- 需要安裝 conda install chardet
- 案列V2
- urlopen的返回項
- geturl:返回請求物件
- info:請求返回物件的meta物件
- getcode:返回物件的請求狀態碼
- request.code
- 訪問網路的兩種方法
- get:實際上利用引數給伺服器傳遞資訊,引數用dict,然後用parse編碼
- post:一般使用的伺服器傳遞引數的方式
- post是把資訊自動加密
- 如果使用post資訊需要用到data引數
- 使用post意味著Http的請求頭可以需要更改:
- Content-Type:applocation/x-www.from-urlencode
- Content-Length:資料長度
- 也就是說,一旦更改請求方法,需要注意其他請求頭部資訊相適應
- urllib.parse,urlencode可以將上字串改為網路協議的
- 案例V4
- 案例V4
- 為了更多的設定我們的請求資訊,單純的使用urlopen已經不是很好用了
- 需要利用request.Request()類
- 案例V6
- urllib.error:
- 產生原因:
- 沒網
- 伺服器連結失敗
- 不知道指定的伺服器
- 是osError的子類
- 案例V7
- 產生原因:
- HTTPError:是URLError的一個子類
- 案例V8
- UserAgent
- UserAgent:使用者代理簡稱UA,屬於Headers的一部分,伺服器通過UA來判斷訪問者的身份
- 設定UA可以使用
- heads
- add_heads
- 案例V9
- 訪問網路的兩種方法
- ProxyHandler 代理伺服器
- 使用代理IP,爬蟲的常用手段
- 獲取代理伺服器的地址:
- 代理用來隱藏真實訪問彙總,代理也不允許頻繁訪問某一個固定網站,所以代理一定要很多
- 基本使用代理的設定:
- 設定代理地址
- 建立ProxyHandler
- 建立Opener
- 安裝Opener
- 案例V10
cookie & session
- 由於http協議的無記憶性,人們為了彌補這個缺憾,所採用的一個補充協議
- cookie是傳送給使用者的一半資訊,session是儲存在伺服器的另一半的資訊,用來記錄資訊
- cookie和session的區別:
- 存放位置不同
- cookie不安全
- session會在伺服器上一段時間,會過期的
- 單個cookie儲存不超過4K,很多瀏覽器限制一個站點最多為20個
- session 存放位置
- 存放在伺服器
- 一般情況,session是存放在資料庫中
- cookie 登陸
- 模擬登陸人人網
- V11
- 使用Cookie登陸
- 直接把cookie複製下來,然後手動放入請求頭
- V12
- http模組包含我們可以使用的cookie的模組,自動使用cookie
- CookieJar
- 管理儲存Cookie,向傳出的http請求新增Cookie
- cookie儲存在記憶體裡,CookieJar例項回收後cookie將消失
- FileCookieJar
- 使用檔案管理cookie
- filename是儲存Cookie的檔案
- MozillaCookieJar
- 建立Mozilla瀏覽器Cookie.txt相容的FileCookieJar例項
- LwqCookieJar
- 創建於libwww-perla標準相容的Set-Cookie3格式的FileCookieJar
- 他們的關係是:Cookie Jar–>FileCookieJar–>MozillaCookieJar&LwqCookieJar
- 利用Cooke Ja訪問人網
- 案例13
- 自動使用Cookie登陸
- 開啟登陸介面後自動通過賬戶密碼登陸
- 自動提取反饋的Cookie
- 利用提取的Cookie登陸隱私頁面
- handler是Headler的例項
- 常用的有
- 建立cookie例項
- cookie = cookiejar.CookieJar()
- 生成cookie的管理器
- cookie_handler = request.HTTPCookieProcessor(cookie)
- 建立http請求管理器
- http_handler = request.HTTPHandler()
- 生成http管理器
- https_handler = request.HTTPSHandler()
- 建立請求管理器
- opener = request.build_opener(http_handler,https_handler,cookie_handler)
- 建立handler後,使用opener開啟,開啟後相應的handler進行使用
- cookie作為一個變數打印出來
- 案例V14
- cookie屬性
- name :名稱
- value:值
- domain :可以訪問此cookie的域名
- path:看可以訪問的cookie的頁面路經
- expirse:過期資訊
- size:大小
- http欄位
- cookie的儲存—FileCookieJar
- 案例15
- cookie的讀取
- 案例16
- CookieJar
SSL
- SSL證書就是指 遵守SSL安全套結層協議的伺服器數字證書
- CA(CertifacateAuthority)是數字認證中心
- 遇到不信任的SSL證書處理方法
- 案例V17
JS加密
- 有的反爬蟲策略採用js對於傳輸的資料進行加密通常是md5值
- 經過加密就是密文但是,加密函式或者過程一定是在瀏覽器完成,也就是將JS的程式碼暴露給使用人
- 通過閱讀加密演算法,就可以模擬出加密過程,從而進行破解
- 案例V18
- 使用V18和V19進行對比
- 記住JS一定被儲存在本地,然後去找加密演算法
AIAX
- 實質就是一段js程式碼,是我們的網頁進行非同步請求
- 一定會有url,請求方法
- 使用一般的json格式
- 案例20
- 一般GET方式使用的引數的形式傳送
- post使用的是form的方法,也方便於加密
Requests 模組憲哥人類的模組
- 繼承了urlllib的所有方法
- 底層使用了urllib3
- 開源
- 有中文的地址
- 安裝 pip install request
- get請求:
- request.get(url)
- request.request(‘get’,url)
- 可帶有headers和parmas引數
- 案例21
- get的返回內容
- 案例22
- post
- rsp = resquest.post(url,data)
- 案例23
- data,headers要求是dict型別
- proxy 代理
- proxy = {
“http”:“地址”
“HTTPs”:‘地址’
}
rsp = requests.request(“get”,“http::…”,proxies=proxy)
- proxy = {
- 使用者驗證
- 代理驗證
- 可能使用的HTTP basic Auth可以這樣
- 格式就是使用者名稱:密碼@代理地址:埠號
- proxy = {“http”:“china:[email protected]:8888”}
- res = request.get(“http://www.baidu.com”,proxies=proxy)
- 代理驗證
- web 客戶端驗證
- 如過遇到需要驗證就是新增auth=(使用者名稱,密碼)
- autu=(“使用者名稱”,‘’密碼"’)
- res = request.get(“http://www.baidu.com”,auth=autu)
- cookie
- request可以自動處理cookie資訊
- rsp = requests.get(url)
- 如果對方伺服器傳送過來cookie資訊,則可以考慮反饋的cookie屬性得到的,返回一個cookie的例項
- cookieJar = rsp.cookies
- 可以將cookie轉換成字典
- cookiedict = requests.utils.dict_from_cookiejar(cookieJar)
- request可以自動處理cookie資訊
- session
- 和伺服器上的session不一樣啦
- 模擬一次會話,從客戶端歷覽器開始連結伺服器,到客戶端斷開
- 能讓我我們跨請求時保持某些引數,比如說在同一個session例項發出的有的請求之間cookie
- 建立session物件時候,可以儲存cookie值
- ss = requests.session()
- headers = {“User-Agent”:“XXXXXXx”}
- data = {“name”:“XXXXXXx”}
- 此時有建立的session管理請求,負責發出請求
- ss.post(“http://www.baidu.com”, data=data,headers=headers)
- rsp = ss.get(“XXXXXX”)
- https驗證SSL證書
- 引數verify負責表示是否需要SSL 證書,預設需要TRUE
- 如果不需要SSL證書驗證,則false
- rsp = requests.get(“https:”,verify=false)
爬蟲資料的處理
- 結構資料:先有結構,再談資料
- json檔案
- json Path
- 轉換成相應的Python型別操作(json類)
- XML
- 轉換成python的型別(xmtodict)
- Xpath
- CSS選擇器
- 正則
- json檔案
- 非結構資料:先有資料,再談結構
- 文字
- 電話號碼
- 郵箱地址
- 通常處理這種資料時使用正則表示式
- Html檔案
- 正則
- Xpath
- CSS選擇器
正則表示式
- 一套股則,可以在字串文字中搜查替換等等
- 案例24,基本的正則的使用規則
- 案例match的基本使用
- 常用的方法:
- match :從開始位置查詢,只匹配一次
- search: 從任何位置開始查詢,一次匹配
- findall:全部查詢,返回列表
- finditer:全部匹配,返回迭代
- spilt:分割字元,返回列表
- sub:替換
- 匹配中文
- 匹配Unicode範圍主要在【u4e00-u9fa5]
- 案例V27
- 貪婪於非貪婪
- 貪婪模式:在整個表示式或者匹配成功的前提下,儘可能多的匹配
- 非貪婪模式:儘可能少的匹配
XML
- XML(ExtensibilityleMarkLanguage)
- http://www.w3cschool
- 案例V28
- 概念;父節點,子節點,先輩節點,兄弟節點,後代節點
Xpath
- Xpath(XML Path language)
- w3school
- 常用路徑表示式
lxml庫
- 案例29
- 解析html
- 檔案讀取 html
- etree和xpath配合使用
- 案例V31
CSS選擇器 beatifulsoup4
幾種工具的比較
- 正則:快,不好用不用安裝
- beatifulsoup 慢使用簡單
- lxml: 比較快
- 使用beatifulsoup的案例
- 案例V32
beautifulSoup
- 四大物件
- Tag
- NavigableString
- Beautifulsoup
- Comment
- Tag
- 對應HTML標籤
- 通過soup,tag_name()
- tag兩個重要
- name
- 屬性
- 案例V33
- NavigableString
- 對應內容值
- Beautifulsoup
- 表示一個文件的內容
- comment
- 特殊的NavigableString物件
- 對其輸出,則內容不包括註釋符號
- 遍歷物件
- contents: tag的子節點列表的方式輸出
- children:子節點義迭代的形式返回
- descendants:所有孫節點、
- string
- 案例34
- 搜尋文件物件
- find_all(name,arrts,recursive,text,** kwaargs**)
- name:按照字串搜尋,可以收入的內容
- 字串
- 正則表示式
- 列表
- keywortd引數,表示屬性
- text :對應tag的文字值
- CSS選擇器