爬蟲
- 前提知識:
- 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,爬蟲的常用手段
- 獲取代理服務器的地址:
- www.xicidaili.com
- www.goubanjian.com
- 代理用來隱藏真實訪問匯總,代理也不允許頻繁訪問某一個固定網站,所以代理一定要很多
- 基本使用代理的設置:
- 設置代理地址
- 創建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 = 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
- cookie的讀取
SSL
- SSL證書就是指 遵守SSL安全套結層協議的服務器數字證書
- CA(CertifacateAuthority)是數字認證中心
- 遇到不信任的SSL證書處理方法
- 案例V17
JS加密
http://tool.oschina.net
- 有的反爬蟲策略采用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的返回內容
- post
- rsp = resquest.post(url,data)
- 案例23
- data,headers要求是dict類型
- proxy 代理
- proxy = {
“http”:“地址”
“HTTPs”:‘地址’
}
rsp = requests.request(“get”,“http::…”,proxies=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)
- 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選擇器
- 正則
- 非結構數據:先有數據,再談結構
- 文本
- 電話號碼
- 郵箱地址
- 通常處理這種數據時使用正則表達式
- Html文件
正則表達式
- 一套股則,可以在字符串文本中搜查替換等等
- 案例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: 比較快
beautifulSoup
- 四大對象
- Tag
- NavigableString
- Beautifulsoup
- Comment
- Tag
- 對應HTML標簽
- 通過soup,tag_name()
- tag兩個重要
- 案例V33
- NavigableString
- Beautifulsoup
- comment
- 特殊的NavigableString對象
- 對其輸出,則內容不包括注釋符號
- 遍歷對象
- contents: tag的子節點列表的方式輸出
- children:子節點義迭代的形式返回
- descendants:所有孫節點、
- string
- 案例34
- 搜索文檔對象
- find_all(name,arrts,recursive,text,** kwaargs**)
- name:按照字符串搜索,可以收入的內容
- keywortd參數,表示屬性
- text :對應tag的文本值
- CSS選擇器