新聞中心
這篇文章主要講解了“Python爬蟲入門知識點有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python爬蟲入門知識點有哪些”吧!
10余年的鐵門關(guān)網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整鐵門關(guān)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“鐵門關(guān)網(wǎng)站設(shè)計”,“鐵門關(guān)網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
1、什么是爬蟲
“爬蟲”是一種形象的說法。互聯(lián)網(wǎng)比喻成一張大網(wǎng),爬蟲是一個程序或腳本在這種大網(wǎng)上爬走。碰到蟲子(資源),若是所需的資源就獲取或下載下來。這個資源通常是網(wǎng)頁、文件等等??梢酝ㄟ^該資源里面的url鏈接,順藤摸瓜繼續(xù)爬取這些鏈接的資源。
你也可以把爬蟲當(dāng)作模擬我們正常上網(wǎng)。打開網(wǎng)頁并分析網(wǎng)頁的內(nèi)容獲取我們想要的東西。
那么,這里就涉及到http傳輸協(xié)議等相關(guān)的知識。
我們通常打開一個網(wǎng)頁,基本上都是打開一個Url鏈接即可。在這個過程當(dāng)中,實際上發(fā)生了很多事情。
打開一個Url鏈接,瀏覽器自動向Url鏈接的服務(wù)器發(fā)送一個請求(Request),告訴服務(wù)器說我需要訪問這個Url鏈接的內(nèi)容,請返回數(shù)據(jù)給我。服務(wù)器就處理該請求,響應(yīng)該請求并返回結(jié)果給瀏覽器。
既然爬蟲需要模擬該過程。根據(jù)http協(xié)議,爬蟲需要構(gòu)造一個請求(Request),發(fā)到請求到目標(biāo)服務(wù)器(通常是Url鏈接)。然后等待服務(wù)器的響應(yīng)(Response)。
所有相關(guān)的數(shù)據(jù)都在這個響應(yīng)結(jié)果當(dāng)中,這個就是爬蟲實現(xiàn)的基本邏輯。
2、urllib2實現(xiàn)GET請求
GET和POST是請求中最常見的兩種方式。(一共有6種)
GET方式是通過Url鏈接的方式傳輸相關(guān)的參數(shù)或數(shù)據(jù)。一般打開網(wǎng)址是GET方式請求,例如打開百度首頁、谷歌首頁。
有時候,需要向這個鏈接傳輸一些參數(shù)。
例如我在百度搜索一個詞,發(fā)現(xiàn)鏈接變成 https://www.baidu.com/s?ie=UTF-8&wd=測試
這里有個?問號以及后面一堆數(shù)據(jù)。問號后面的數(shù)據(jù)是GET請求的參數(shù),這里一共有兩組參數(shù)。
1)ie = UTF-8
2)wd = 測試
每組參數(shù)用&符號鏈接。在參數(shù)中,等號前面的是參數(shù)名;等號后面的是參數(shù)值。
例如第2組參數(shù)的含義是百度搜索關(guān)鍵字為“測試”。第1組參數(shù)是設(shè)置返回ie瀏覽器的編碼格式,可有可無,作為說明加入進來。
那么,我使用urllib2模擬百度搜索代碼如下:
#coding:utf-8import urllib, urllib2 #前半部分的鏈接(注意是http,不是https)url_pre = 'http://www.baidu.com/s' #GET參數(shù)params = {}params['wd'] = u'測試'.encode('utf-8')url_params = urllib.urlencode(params) #GET請求完整鏈接url = '%s?%s' % (url_pre, url_params) #打開鏈接,獲取響應(yīng)response = urllib2.urlopen(url) #獲取響應(yīng)的htmlhtml = response.read() #將html保存到文件with open('test.txt', 'w') as f: f.write(html)
執(zhí)行代碼,可以看到爬取的內(nèi)容。
5、反爬蟲設(shè)置header
有些服務(wù)器為了避免被爬蟲,會檢查header。header是發(fā)送請求的時候,一起發(fā)送給服務(wù)器的數(shù)據(jù)。可以通過header得到瀏覽器的類型,手機端還是電腦端訪問,以及從什么地方進入該鏈接等等。
若發(fā)現(xiàn)不是正常瀏覽器訪問,服務(wù)器則直接拒絕。
so~ 我們需要進一步模擬瀏覽器的行為,需要模擬設(shè)置header。
#coding:utf-8import urllib, urllib2 #設(shè)置headeruser_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent':user_agent} #構(gòu)造Request請求,其中第二個參數(shù)是dataurl = 'http://www.server.com/login'request = urllib2.Request(url, None, headers) #響應(yīng)請求response = urllib2.urlopen(request) html = response.read()
同樣,若你不知道如何設(shè)置header,可以通過抓包軟件獲取,例如Fiddler。
6、解析html
前面說了這么多,都是為了獲取網(wǎng)頁內(nèi)容html。既然獲取到html之后,我們解析?從中提取我們需要的數(shù)據(jù)?
我們所獲取的html本質(zhì)是字符串。處理字符串最基本的方法是通過相關(guān)的字符串函數(shù),但效率很低,容易出錯。
還可以使用正則表達式處理字符串。這部分的知識也是很多,大家可以自行了解。
這里,我想給大家說的處理方式是使用BeautifulSoup。
BeautifulSoup是解析html/xml的庫。非Python自帶的庫,安裝如下:
pip install beautifulsoup4pip install lxml
安裝lxml庫是為了加快html解析效率。
先我們設(shè)置1個html內(nèi)容,使用BeautifulSoup解析方法如下:
#coding:utf-8from bs4 import BeautifulSoup #先隨便假設(shè)一個htmlhtml = '''test1
test2
''' #使用lxml解析htmlsoup = BeautifulSoup(html, 'lxml')
soup是解析得到的解析器。我們可以根據(jù)html的結(jié)構(gòu)獲取對應(yīng)的節(jié)點。例如我想獲取p標(biāo)簽:
p = soup.body.p
但該方法只能獲取到第1個節(jié)點。假如body標(biāo)簽下有很多p節(jié)點,該方法無法獲取全部。
這里,我們可以用find_all或select方法獲取。建議大家使用select方法,這個方法可以jQuery選擇器用法差不多。例如:
p1 = soup.select('p') #獲取p標(biāo)簽p2 = soup.select('#test_p') #獲取id為test_p的標(biāo)簽p3 = soup.select('.test') #獲取class為test的標(biāo)簽p4 = soup.select('body .test') #獲取body下的class為test的標(biāo)簽
來個完整的代碼,輸出結(jié)果:
#coding:utf-8from bs4 import BeautifulSoup #先隨便假設(shè)一個htmlhtml = '''test1
test2
''' #使用lxml解析htmlsoup = BeautifulSoup(html, 'lxml') #獲取全部p標(biāo)簽for p in soup.select('p'): print(p)
通過該方法,可以輸出全部p標(biāo)簽。
那假如我要獲取p標(biāo)簽的屬性和數(shù)據(jù)呢?方法如下:
for p in soup.select('p'): print(p.name) #標(biāo)簽名稱 #標(biāo)簽屬性,也可以用p['id']。若屬性不存在會報錯,和字典獲取鍵值類似 print(p.get('id')) print(p.string) #標(biāo)簽內(nèi)容
若一個標(biāo)簽里面有很多子標(biāo)簽,你可以再進一步繼續(xù)使用select。
若想獲取標(biāo)簽下全部子標(biāo)簽的文本內(nèi)容??梢杂胹trings屬性得到一個生成器,不過可能有很多回車和空格。若想屏蔽回車和空格,可以使用stripped_strings屬性。如下所示:
print(''.join(soup.body.strings))print(''.join(soup.body.stripped_strings))
將分別得到:
u'\ntest1\ntest2\n'u'test1test2'
感謝各位的閱讀,以上就是“Python爬蟲入門知識點有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python爬蟲入門知識點有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
本文名稱:Python爬蟲入門知識點有哪些
標(biāo)題路徑:http://www.dlmjj.cn/article/gephpc.html