1 URL(統(tǒng)一資源定位符)
1.1 一般格式
protocol://hostname[:port]/path/[;parameters][?query]#fragment
1.2 組成
- 第一部分是協(xié)議:http, https, ftp, file, ed2k...
- 第二部分是存放資源的服務(wù)器的域名系統(tǒng)或IP地址(有時(shí)候包含端口號(hào),各種傳輸協(xié)議都有默認(rèn)的端口號(hào))
- 第三部分是資源的具體地址,如目錄或文件名等
1.3 與URI的區(qū)別
URI是統(tǒng)一資源標(biāo)識(shí)符,用字符串來標(biāo)識(shí)某一互聯(lián)網(wǎng)資源
URL是統(tǒng)一資源定位符,表示資源的地址
因此URI屬于父類,而URL屬于URI的子類
2 設(shè)計(jì)中的特別注意
不要重讀爬取同一個(gè)URL的內(nèi)容,如果沒做這方面的預(yù)防,如果一個(gè)URL的內(nèi)容中包含該URL本身,那么就會(huì)陷入無限遞歸
3 修改headers
- 通過Request的headers參數(shù)修改
- 通過Request.add_header()方法修改
4 代理
4.1 步驟
- 參數(shù)是一個(gè)字典{‘類型’:‘代理ip:端口號(hào)’}
proxy_support = urllib.request.ProxyHandler({}) - 定制、創(chuàng)建一個(gè)opener
opener = urllib.request.build_opener(proxy_support) - a.安裝opener(一直在電腦中)
urllib.request.install_opener(opener) - b.調(diào)用opener
opener.open(url)
5 獲取Request對象具體使用哪種方法訪問服務(wù)器
get_method()
6 服務(wù)器如何確定你是否登錄
服務(wù)器通過判斷你提交的cookie來確定。
6.1 cookie分類:
- 即時(shí)過期的cookie,稱為‘會(huì)話’cookies,當(dāng)瀏覽器關(guān)閉時(shí)(這里是python的請求程序)自動(dòng)清除
- 有期限的cookie,由瀏覽器進(jìn)行存儲(chǔ),并在下一次請求該網(wǎng)站時(shí)自動(dòng)附帶(如果沒過期或清理的話)
7 Beautiful Soup
7.1 對象
- Tag標(biāo)簽
--tag中包含的字符串不能編輯,但可通過函數(shù)replace_with()替換。
--find_all()方法搜索當(dāng)前tag的所有tag子節(jié)點(diǎn),并判斷是否符合過濾器的條件
--find_all() 方法的返回結(jié)果是值包含一個(gè)元素的列表,而 find() 方法直接返回結(jié)果;find_all() 方法沒有找到目標(biāo)是返回空列表, find() 方法找不到目標(biāo)時(shí),返回 None
--tag的 .contents 屬性可以將tag的子節(jié)點(diǎn)以列表的方式輸出
--通過tag的 .children 生成器,可以對tag的子節(jié)點(diǎn)進(jìn)行循環(huán),同樣 .descendants 屬性可以對所有tag的子孫節(jié)點(diǎn)進(jìn)行遞歸循環(huán)
--通過 .parent 屬性來獲取某個(gè)元素的父節(jié)點(diǎn)
-- 兄弟節(jié)點(diǎn):在文檔樹中,使用 .next_sibling 和 .previous_sibling 屬性來查詢兄弟節(jié)點(diǎn);通過 .next_siblings 和 .previous_siblings 屬性可以對當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)迭代輸出 - NavigableString
- BeautifulSoup
- Comment
8 生成器(generator)
作用:一次產(chǎn)生一個(gè)數(shù)據(jù)項(xiàng),并把數(shù)據(jù)項(xiàng)輸出
格式:
def 函數(shù)名(參數(shù)):
...
yield 表達(dá)式
用法
generator函數(shù)的定義和普通函數(shù)的定義沒什么區(qū)別,只要在函數(shù)體內(nèi)使用yield生成數(shù)據(jù)項(xiàng)即可
generator函數(shù)可以被for循環(huán)遍歷,并且可以通過next()方法獲得yield生成的數(shù)據(jù)項(xiàng)
與return的區(qū)別
yield生成值并不會(huì)中止程序的執(zhí)行,返回值后程序繼續(xù)往后執(zhí)行,return返回值后,程序?qū)⒅兄箞?zhí)行