爬蟲(chóng)筆記2019-08-07

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è)字符串)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容