組成部分
- url管理器
管理要爬取和將要爬取的url
關(guān)鍵在于唯一性暂殖,存儲(chǔ)的時(shí)候寓盗,不然會(huì)很浪費(fèi)效率
比如set()有唯一性的優(yōu)點(diǎn)
- html下載器
下載網(wǎng)頁內(nèi)容
基本語法:
from urllib import request
reponse = request.urlopen(url)#開始爬取
response.read()#網(wǎng)頁內(nèi)容
- html解析器
解析下載好的網(wǎng)頁內(nèi)容檐蚜,提取要的內(nèi)容
常用module-BeautifulSoup
基本語法:
from bs4 import BeautifulSoup
import urllib.parse
content = find_all('a',href='sss')#找到所有鏈接為sss的a標(biāo)簽
- 存儲(chǔ)器
存儲(chǔ)爬取好的內(nèi)容
關(guān)鍵在于與數(shù)據(jù)庫的鏈接
關(guān)于urllib的學(xué)習(xí)<p>
- urllib模擬瀏覽器訪問網(wǎng)址
- 攜帶User-Agent頭(里面包含瀏覽器、電腦的信息,添加這個(gè)頭以模擬更真實(shí)的訪問)
from urllib.request import Request
#注意Request的引入
req = request.Request(url)
req.add_header(key,value)#添加信息软驰,這只是添加一個(gè)頭部呻逆,如果有很多個(gè)要寫多個(gè)add_header
response = request.urlopen(req)#此時(shí)傳進(jìn)去的就不是url而是req了
- POST請(qǐng)求,比如說登陸的時(shí)候,得提交用戶名和密碼
from urllib import parse
#注意parse的引入
#使用urlencode生成post數(shù)據(jù)
postData = parse.urlencode([
(key1,val1),
(key2,val2)
])
request.urlopen(req,data=postData.encode('utf-8'))#在urlopen里面data參數(shù)攜帶要發(fā)送的數(shù)據(jù)空入,注意要編碼發(fā)送
- 得到請(qǐng)求狀態(tài)
response.status
- 得到服務(wù)器的類型
response.reason
關(guān)于Beautiful Soup的使用<p>
- 默認(rèn)使用unicode來接受一個(gè)文檔络它,并且以u(píng)tf-8返回,所以用BeautifulSoup的時(shí)候不用去解碼
- 引入
from bs4 import BeautifulSoup
,as
起別名->from bs4 import BeautifulSoup as bs
然后就可以用bs了歪赢,一般情況不要起別名化戳,會(huì)很混亂的,別人也不方便看 - beautifulsoup解析器埋凯,就是bs以何種方式來解析目標(biāo)對(duì)象点楼,一般用python自帶的
html.parser
<p>
soup = BeautifulSoup(html_doc,"html.parser")
- 簡(jiǎn)單的方法
soup.標(biāo)簽名 #獲取某個(gè)標(biāo)簽
soup.find('標(biāo)簽名')
soup.find(id="")根據(jù)id來找
soup.find(id="sidebar").string,獲取這個(gè)id標(biāo)簽內(nèi)的內(nèi)容,class不可以,class_可以白对,class是python關(guān)鍵字
soup.find_all('標(biāo)簽名‘)
soup.find("p",{“class”:"story"})根據(jù)屬性來找
#如果根據(jù)類名來找一組元素的話掠廓,要用 find_all并且要指定元素名
#獲取標(biāo)簽內(nèi)的文本內(nèi)容,string屬性或者get_text()方法
get_text()-> 獲得標(biāo)簽中包含的文本內(nèi)容甩恼,包括孫子的文本內(nèi)容
.string->如果標(biāo)簽只有一個(gè)NavigableString類型子節(jié)點(diǎn)或者僅有一個(gè)子節(jié)點(diǎn)蟀瞧,那么可以用.string得到子節(jié)點(diǎn),如果有多個(gè)子節(jié)點(diǎn)就不可以