爬蟲(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)系作者
  • 序言:七十年代末宙刘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牢酵,更是在濱河造成了極大的恐慌荐类,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茁帽,死亡現(xiàn)場(chǎng)離奇詭異玉罐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)潘拨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)吊输,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人铁追,你說(shuō)我怎么就攤上這事季蚂。” “怎么了琅束?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵扭屁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我涩禀,道長(zhǎng)料滥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任艾船,我火速辦了婚禮葵腹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屿岂。我一直安慰自己践宴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布爷怀。 她就那樣靜靜地躺著阻肩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪运授。 梳的紋絲不亂的頭發(fā)上烤惊,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音徒坡,去河邊找鬼撕氧。 笑死瘤缩,一個(gè)胖子當(dāng)著我的面吹牛喇完,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锦溪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼不脯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刻诊,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤防楷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后则涯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體复局,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年粟判,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亿昏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡档礁,死狀恐怖角钩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呻澜,我是刑警寧澤递礼,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站羹幸,受9級(jí)特大地震影響脊髓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栅受,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一供炼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窘疮,春花似錦袋哼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蔚出,卻和暖如春弟翘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骄酗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工稀余, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趋翻。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓睛琳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子师骗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容