1 字符串和二進(jìn)制之間的相互轉(zhuǎn)換
? ? 字符串轉(zhuǎn)化為二進(jìn)制:encode() 默認(rèn)為utf8预鬓,若為gbk需要注明
? ? 二進(jìn)制轉(zhuǎn)化為字符串:decode() 默認(rèn)為utf8,若為gbk需要注明
2 url規(guī)范:
? ? 只能由特定字符組成撬陵,字母珊皿、數(shù)字网缝、下劃線,如果出現(xiàn)其他字符(中文蟋定、空格等)就要對(duì)其進(jìn)行編碼
3 urllib.response
? ? read()? ? ? 讀取相應(yīng)的內(nèi)容粉臊,內(nèi)容是字節(jié)類型
? ? geturl()? ? 讀取請(qǐng)求的url
? ? getheaders() 讀取頭部信息,列表中元素有元組
? ? getcode()? ? 獲取狀態(tài)碼
? ? readlines()? 按行讀取驶兜,返回列表扼仲,內(nèi)容為字節(jié)類型
4 urllib.parse
? ? quote()? ? ? url編碼函數(shù),將中文進(jìn)行轉(zhuǎn)化為%XXX
? ? unquote()? ? url解碼函數(shù)抄淑,將%XXX轉(zhuǎn)化為指定字符
? ? urlencode()? 給一個(gè)字典屠凶,將字典拼接為query_string,并且實(shí)現(xiàn)了編碼
5 UA(user agent)用戶代理
? ? 是Http協(xié)議中的一部分,屬于頭域的組成部分肆资,User Agent也簡(jiǎn)稱UA矗愧。
? ? 它是一個(gè)特殊字符串頭,是一種向訪問(wèn)網(wǎng)站提供你所使用的瀏覽器類型及版本郑原、操作系統(tǒng)及版本唉韭、瀏覽器內(nèi)核、等信息的標(biāo)識(shí)犯犁。
? ? 通過(guò)這個(gè)標(biāo)識(shí)属愤,用戶所訪問(wèn)的網(wǎng)站可以顯示不同的排版從而為用戶提供更好的體驗(yàn)或者進(jìn)行信息統(tǒng)計(jì);
? ? 例如用手機(jī)訪問(wèn)谷歌和電腦訪問(wèn)是不一樣的酸役,這些是谷歌根據(jù)訪問(wèn)者的UA來(lái)判斷的住诸。UA可以進(jìn)行偽裝。
6 構(gòu)建請(qǐng)求頭部信息(反爬蟲(chóng)第一步)
? ? 偽裝自己的UA.讓服務(wù)器認(rèn)為是瀏覽器在上網(wǎng)
? ? 構(gòu)建請(qǐng)求對(duì)象:urllib.request.Request(參數(shù)需要提供url和偽裝UA后的請(qǐng)求)
7 Ajax(Asynchronous Javascript And XML)
? ? 一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)涣澡,用于創(chuàng)建快速動(dòng)態(tài)網(wǎng)頁(yè)的技術(shù)
8 URLError\HTTPError異常處理 try-except
? ? URLError:
? ? ? ? (1):沒(méi)有網(wǎng)
? ? ? ? (2):服務(wù)器連接失敗
? ? ? ? (3):找不到指定的服務(wù)器
? ? HTTPError:
? ? ? ? 是URLError的子類
? ? 注:兩個(gè)同時(shí)捕獲的時(shí)候贱呐,需要將子類錯(cuò)誤放在前面
9 Handler處理器、自定義Opener
? ? urlopen()? 給定一個(gè)url暑塑,發(fā)送請(qǐng)求吼句,獲取響應(yīng)
? ? Request()? 定制請(qǐng)求頭锅必,創(chuàng)建請(qǐng)求對(duì)象
? ? 高級(jí)功能? ? 使用代理事格,使用cookie
10 代理:
? ? 生活中的代理:微商、代駕
? ? 程序中的代理
? ? ? ? 正向代理? ? 順著請(qǐng)求的方向去進(jìn)行的代理搞隐,替客戶端去請(qǐng)求目標(biāo)服務(wù)器地址(爬蟲(chóng)關(guān)注)獲取數(shù)據(jù)
? ? ? ? 反向代理? ? 代理目標(biāo)服務(wù)器提供數(shù)據(jù)
? ? 配置:
? ? ? ? 瀏覽器配置:設(shè)置-高級(jí)-系統(tǒng)-打開(kāi)代理設(shè)置-連接-局域網(wǎng)設(shè)置-代理服務(wù)器--輸入ip和端口號(hào)
? ? ? ? 代碼配置:handler = urllib.request.ProxyHandler({'http': '123.163.97.59:9999'})
? ? ? ? ? ? ? ? ? opener = urllib.request.build_opener(handler)
? ? ? ? ? ? ? ? ? 后續(xù)都使用opener.open方法去發(fā)送請(qǐng)求
11 cookie
? ? cookie是什么驹愚?
? ? ? ? http協(xié)議,無(wú)狀態(tài)
? ? ? ? 網(wǎng)站登錄時(shí)候的問(wèn)題劣纲,用來(lái)記錄用戶身份的
? ? 模擬登陸
12 cookie登錄
? ? # 創(chuàng)建一個(gè)cookiejar對(duì)象
? ? cj = http.cookiejar.CookieJar()
? ? # 通過(guò)cookiejar創(chuàng)建一個(gè)handler
? ? handler = urllib.request.HTTPCookieProcessor(cj)
? ? # 根據(jù)handler創(chuàng)建一個(gè)opener
? ? opener = urllib.request.build_opener(handler)
? ? 再往下所有操作都是用opener.open方法去發(fā)送請(qǐng)求逢捺,因?yàn)檫@里帶著cookie過(guò)去了
13 正則表達(dá)式解析
? ? 為什么引入正則表達(dá)式?
? ? ? ? 用來(lái)匹配一類具有相同規(guī)則的字符串(包含正則匹配和正則替換)
? ? 規(guī)則
? ? ? ? 單字符:
? ? ? ? ? ? . :除換行以外所有字符
? ? ? ? ? ? []:[a-w]匹配集合中任意一個(gè)字符
? ? ? ? ? ? \d:數(shù)字[0-9]
? ? ? ? ? ? \D:非數(shù)字
? ? ? ? ? ? \w:數(shù)字癞季、字母劫瞳、下劃線倘潜、中文
? ? ? ? ? ? \W:非w
? ? ? ? ? ? \S:非空白字符
? ? ? ? ? ? \s:所有的空白字符
? ? ? ? 數(shù)量修飾:
? ? ? ? ? ? *:任意多次 >=0
? ? ? ? ? ? +: 至少一次 >=1
? ? ? ? ? ? ?: 可有可無(wú) 0次或1次
? ? ? ? ? ? {m}:固定m次
? ? ? ? ? ? {m,n}:m-n次
? ? ? ? 邊界:
? ? ? ? ? ? \b
? ? ? ? ? ? \B
? ? ? ? ? ? $:以某某結(jié)尾
? ? ? ? ? ? ^:以某某開(kāi)頭
? ? ? ? 分組:
? ? ? ? ? ? () 視為一個(gè)整體(ab){3}
? ? ? ? ? ? () 子模式\組模式 \1 \2
? ? ? ? 貪婪模式
? ? ? ? ? ? .*? .+?(加個(gè)?反貪婪)
? ? ? ? re.I: 忽略大小寫(xiě)
? ? ? ? re,M:多行匹配
? ? ? ? re.S:單行匹配
? ? ? ? match\search\findall:從開(kāi)頭開(kāi)始\從任意位置開(kāi)始\匹配所有
? ? ? ? re.sub(正則表達(dá)式志于,替換內(nèi)容涮因,字符串)
? ? http://www.yikexun.cn/
? ? 需求:
? ? ? ? 爬取指定頁(yè)面的標(biāo)題和內(nèi)容
? ? ? ? 保存到html文件中,標(biāo)題用h1伺绽,內(nèi)容使用p即可
14 bs4
? ? BeautifulSoup
? ? 需要將pip源設(shè)置為國(guó)內(nèi)源养泡,阿里源、豆瓣源奈应、網(wǎng)易源等
? ? windows
? ? ? ? (1)打開(kāi)文件資源管理器
? ? ? ? (2)地址欄上面輸入%appdata%
? ? ? ? (3)在這里面新建一個(gè)文件夾 pip
? ? ? ? (4)在文件夾里面新建一個(gè)文件夾 pip.ini
? ? ? ? 寫(xiě)如下內(nèi)容
? ? ? ? [global]
? ? ? ? timeout = 6000
? ? ? ? index-url = https://mirrors.aliyun.com/pypi/simple/
? ? ? ? trusted-host = mirrors.aliyun.com
? ? 依賴庫(kù)bs4澜掩,lxml
? ? 簡(jiǎn)單使用:
? ? ? ? 說(shuō)明:選擇器,jquery
? ? ? ? from bs4 import BeautifulSoup
? ? ? ? 使用方式:可以將一個(gè)html文檔杖挣,轉(zhuǎn)化為指定的對(duì)象肩榕,然后通過(guò)對(duì)象的方法或者屬性去查找指定的內(nèi)容
? ? ? ? (1)轉(zhuǎn)化為本地文件:
? ? ? ? ? ? soup = BeautifulSoup(open('本地文件'),'lxml')
? ? ? ? (2)轉(zhuǎn)化為網(wǎng)絡(luò)文件:
? ? ? ? ? ? soup = BeautifulSoup('字符串類型或者字節(jié)類型','lxml')
? ? (1)根據(jù)標(biāo)簽名查找
? ? ? ? soup.a 只能找到第一個(gè)符合要求的標(biāo)簽(a代表連接)
? ? (2)獲取屬性
? ? ? ? soup.a.attrs 獲取所有屬性和值,返回一個(gè)字典
? ? ? ? soup.a.attrs['href'] 獲取href屬性 簡(jiǎn)寫(xiě)為soup.a['href']
? ? (3)獲取內(nèi)容
? ? ? ? soup.a.text
? ? ? ? soup.a.string
? ? ? ? soup.a.get_text
? ? ? ? ? ? 若標(biāo)簽里還有標(biāo)簽惩妇,string結(jié)果為none点把,其他兩個(gè)可以獲取內(nèi)容
? ? (4)find
? ? ? ? soup.find('a') 找到第一個(gè)符合條件的a
? ? ? ? soup.find('a', title='qing')
? ? ? ? soup.find('a', id='feng')
? ? ? ? soup.find('a', class_='du')(class為關(guān)鍵字,需加下劃線)
? ? ? ? find方法不僅soup可以調(diào)用屿附,普通的div對(duì)象也能調(diào)用郎逃,會(huì)去指定的div里面去查找符合要求的節(jié)點(diǎn)
? ? ? ? find找到第一個(gè)對(duì)象
? ? (5)find_all
? ? ? ? soup.find_all('a')
? ? ? ? soup.find_all(['a', 'b'])
? ? ? ? soup.find_all('a', limit=2) 限制前兩個(gè)
? ? (6)select(得到的是一個(gè)列表)
? ? ? ? 根據(jù)選擇器選擇指定的內(nèi)容、
? ? ? ? 常見(jiàn)的選擇器:標(biāo)簽選擇器挺份、類選擇器褒翰、id選擇器、組合選擇器匀泊、層級(jí)選擇器优训、偽類選擇器、屬性選擇器
? ? ? ? 標(biāo)簽選擇器? a
? ? ? ? 類選擇器? ? .dudu
? ? ? ? id選擇器? #lala
? ? ? ? 組合選擇器? a, .dudu, #lala, .meme
? ? ? ? 層級(jí)選擇器? div .dudu #lala .meme .xixi 下面好多級(jí)
? ? ? ? 偽類選擇器? div > p > a >.lala 只能是下面一級(jí)
? ? ? ? 屬性選擇器? input[name='lala']
? ? ? ? select選擇器返回的永遠(yuǎn)是列表各聘,需要通過(guò)下標(biāo)提取指定的對(duì)象揣非,然后獲取屬性和節(jié)點(diǎn)
? ? ? ? 該方法也可以通過(guò)普通對(duì)象調(diào)用,找到都是這個(gè)對(duì)象下面符合要求的所有節(jié)點(diǎn)
15 xpath
? ? pip install lxml
? ? xml 可擴(kuò)展標(biāo)記語(yǔ)言躲因,是用來(lái)存儲(chǔ)和傳輸數(shù)據(jù)使用的早敬。
? ? 和html的不同的主要有兩點(diǎn):
? ? ? ? (1)html用來(lái)顯示數(shù)據(jù),xml是用來(lái)傳輸數(shù)據(jù)
? ? ? ? (2)html標(biāo)簽是固定的大脉,xml標(biāo)簽是自定義的
? ? xpath用來(lái)在xml中查找指定的元素搞监,它是一種路徑表達(dá)式
? ? //: 不考慮位置的查找
? ? ./: 從當(dāng)前節(jié)點(diǎn)開(kāi)始往下查找
? ? ../: 從當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)查找
? ? @: 選擇屬性
? ? 實(shí)例:
? ? /bookstore/book 選擇根節(jié)點(diǎn)bookstore下面所有直接子節(jié)點(diǎn)book
? ? //book? 選取所有book
? ? bookstore//book 查找bookstores下面所有的book
? ? /bookstore/book[1]? bookstore下面的第一個(gè)book
? ? 安裝xpath插件
? ? 啟動(dòng)和關(guān)閉插件 ctrl + shift + x
? ? 屬性定位
? ? //input[@id="kw"]
? ? //input[@class="btn self-btn bg s_btn"]
? ? 層級(jí)定位
? ? 索引定位(索引從1開(kāi)始)
? ? //div[@id="head"]/div/div[2]/a[@class="toindex"]
? ? //div//a[@class="toindex"]? 雙斜杠代表下面所有的a節(jié)點(diǎn),不管位置
? ? 邏輯運(yùn)算
? ? //input[@name="wd" and @class="s_ipt"]
? ? 模糊匹配
? ? contains
? ? ? ? //input[contains(@class, "s_i")]? ? 所有的input镰矿,有class屬性琐驴,并且屬性中帶有s_i的節(jié)點(diǎn)
? ? ? ? //input[contains(text(), "測(cè)試")]
? ? starts-with
? ? ? ? //input[starts-with(@class, "s_i")] 所有的input,有class屬性,并且屬性中以s開(kāi)頭的節(jié)點(diǎn)
? ? 取文本
? ? ? ? //div[@id="u_sp"]/a[5]/text()? 獲取節(jié)點(diǎn)內(nèi)容
? ? ? ? //div[@id="u_sp"]//text()? 獲取節(jié)點(diǎn)里面不帶標(biāo)簽的所有內(nèi)容
? ? ? ? 直接將所有內(nèi)容拼接起來(lái)返回給你
? ? ? ? ret = tree.xpath('//div[@class="song"]')
? ? ? ? string = ret[0].xpath('string(.)')
? ? ? ? print(string.replace('\n', '').replace('\t', ''))
? ? 取屬性
? ? ? ? //div[@id="u_sp"]/a[5]/@href
? ? 代碼中使用xpath
? ? ? ? from lxml import etree
? ? ? ? 兩種方式使用:將html文檔變成一個(gè)對(duì)象绝淡,然后調(diào)用對(duì)象的方法去查找指定的節(jié)點(diǎn)
? ? ? ? (1)本地文件
? ? ? ? ? ? tree = etree.parse(文件名)
? ? ? ? (2)網(wǎng)絡(luò)文件
? ? ? ? ? ? tree = etree.HTML(網(wǎng)頁(yè)字符串)