溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python爬蟲(chóng)入門知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2021-12-27 10:03:33 來(lái)源:億速云 閱讀:115 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“Python爬蟲(chóng)入門知識(shí)點(diǎn)有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python爬蟲(chóng)入門知識(shí)點(diǎn)有哪些”吧!

1、什么是爬蟲(chóng)

“爬蟲(chóng)”是一種形象的說(shuō)法?;ヂ?lián)網(wǎng)比喻成一張大網(wǎng),爬蟲(chóng)是一個(gè)程序或腳本在這種大網(wǎng)上爬走。碰到蟲(chóng)子(資源),若是所需的資源就獲取或下載下來(lái)。這個(gè)資源通常是網(wǎng)頁(yè)、文件等等??梢酝ㄟ^(guò)該資源里面的url鏈接,順藤摸瓜繼續(xù)爬取這些鏈接的資源。

你也可以把爬蟲(chóng)當(dāng)作模擬我們正常上網(wǎng)。打開(kāi)網(wǎng)頁(yè)并分析網(wǎng)頁(yè)的內(nèi)容獲取我們想要的東西。

那么,這里就涉及到http傳輸協(xié)議等相關(guān)的知識(shí)。

我們通常打開(kāi)一個(gè)網(wǎng)頁(yè),基本上都是打開(kāi)一個(gè)Url鏈接即可。在這個(gè)過(guò)程當(dāng)中,實(shí)際上發(fā)生了很多事情。

打開(kāi)一個(gè)Url鏈接,瀏覽器自動(dòng)向Url鏈接的服務(wù)器發(fā)送一個(gè)請(qǐng)求(Request),告訴服務(wù)器說(shuō)我需要訪問(wèn)這個(gè)Url鏈接的內(nèi)容,請(qǐng)返回?cái)?shù)據(jù)給我。服務(wù)器就處理該請(qǐng)求,響應(yīng)該請(qǐng)求并返回結(jié)果給瀏覽器。

既然爬蟲(chóng)需要模擬該過(guò)程。根據(jù)http協(xié)議,爬蟲(chóng)需要構(gòu)造一個(gè)請(qǐng)求(Request),發(fā)到請(qǐng)求到目標(biāo)服務(wù)器(通常是Url鏈接)。然后等待服務(wù)器的響應(yīng)(Response)。

所有相關(guān)的數(shù)據(jù)都在這個(gè)響應(yīng)結(jié)果當(dāng)中,這個(gè)就是爬蟲(chóng)實(shí)現(xiàn)的基本邏輯。

2、urllib2實(shí)現(xiàn)GET請(qǐng)求

GET和POST是請(qǐng)求中最常見(jiàn)的兩種方式。(一共有6種)

GET方式是通過(guò)Url鏈接的方式傳輸相關(guān)的參數(shù)或數(shù)據(jù)。一般打開(kāi)網(wǎng)址是GET方式請(qǐng)求,例如打開(kāi)百度首頁(yè)、谷歌首頁(yè)。

有時(shí)候,需要向這個(gè)鏈接傳輸一些參數(shù)。

例如我在百度搜索一個(gè)詞,發(fā)現(xiàn)鏈接變成 https://www.baidu.com/s?ie=UTF-8&wd=測(cè)試

這里有個(gè)?問(wèn)號(hào)以及后面一堆數(shù)據(jù)。問(wèn)號(hào)后面的數(shù)據(jù)是GET請(qǐng)求的參數(shù),這里一共有兩組參數(shù)。

1)ie = UTF-8

2)wd = 測(cè)試

每組參數(shù)用&符號(hào)鏈接。在參數(shù)中,等號(hào)前面的是參數(shù)名;等號(hào)后面的是參數(shù)值。

例如第2組參數(shù)的含義是百度搜索關(guān)鍵字為“測(cè)試”。第1組參數(shù)是設(shè)置返回ie瀏覽器的編碼格式,可有可無(wú),作為說(shuō)明加入進(jìn)來(lái)。

那么,我使用urllib2模擬百度搜索代碼如下:

  
  
  #coding:utf-8import urllib, urllib2 #前半部分的鏈接(注意是http,不是https)url_pre = 'http://www.baidu.com/s' #GET參數(shù)params = {}params['wd'] = u'測(cè)試'.encode('utf-8')url_params = urllib.urlencode(params) #GET請(qǐng)求完整鏈接url = '%s?%s' % (url_pre, url_params) #打開(kāi)鏈接,獲取響應(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、反爬蟲(chóng)設(shè)置header

有些服務(wù)器為了避免被爬蟲(chóng),會(huì)檢查header。header是發(fā)送請(qǐng)求的時(shí)候,一起發(fā)送給服務(wù)器的數(shù)據(jù)??梢酝ㄟ^(guò)header得到瀏覽器的類型,手機(jī)端還是電腦端訪問(wèn),以及從什么地方進(jìn)入該鏈接等等。

若發(fā)現(xiàn)不是正常瀏覽器訪問(wèn),服務(wù)器則直接拒絕。

so~ 我們需要進(jìn)一步模擬瀏覽器的行為,需要模擬設(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請(qǐng)求,其中第二個(gè)參數(shù)是dataurl = 'http://www.server.com/login'request = urllib2.Request(url, None, headers) #響應(yīng)請(qǐng)求response = urllib2.urlopen(request)  html = response.read()

同樣,若你不知道如何設(shè)置header,可以通過(guò)抓包軟件獲取,例如Fiddler。

6、解析html

前面說(shuō)了這么多,都是為了獲取網(wǎng)頁(yè)內(nèi)容html。既然獲取到html之后,我們解析?從中提取我們需要的數(shù)據(jù)?

我們所獲取的html本質(zhì)是字符串。處理字符串最基本的方法是通過(guò)相關(guān)的字符串函數(shù),但效率很低,容易出錯(cuò)。

還可以使用正則表達(dá)式處理字符串。這部分的知識(shí)也是很多,大家可以自行了解。

這里,我想給大家說(shuō)的處理方式是使用BeautifulSoup。

BeautifulSoup是解析html/xml的庫(kù)。非Python自帶的庫(kù),安裝如下:

  
  
  pip install beautifulsoup4pip install lxml

安裝lxml庫(kù)是為了加快html解析效率。

先我們?cè)O(shè)置1個(gè)html內(nèi)容,使用BeautifulSoup解析方法如下:

  
  
  #coding:utf-8from bs4 import BeautifulSoup #先隨便假設(shè)一個(gè)htmlhtml = '''<html><head></head><body>    <p id="test_p">test1</p>    <p>test2</p></body><html>''' #使用lxml解析htmlsoup = BeautifulSoup(html, 'lxml')

soup是解析得到的解析器。我們可以根據(jù)html的結(jié)構(gòu)獲取對(duì)應(yīng)的節(jié)點(diǎn)。例如我想獲取p標(biāo)簽:

  
  
  p = soup.body.p

但該方法只能獲取到第1個(gè)節(jié)點(diǎn)。假如body標(biāo)簽下有很多p節(jié)點(diǎn),該方法無(wú)法獲取全部。

這里,我們可以用find_all或select方法獲取。建議大家使用select方法,這個(gè)方法可以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)簽

來(lái)個(gè)完整的代碼,輸出結(jié)果:

  
  
  #coding:utf-8from bs4 import BeautifulSoup #先隨便假設(shè)一個(gè)htmlhtml = '''<html><head></head><body>    <p id="test_p">test1</p>    <p>test2</p></body><html>''' #使用lxml解析htmlsoup = BeautifulSoup(html, 'lxml') #獲取全部p標(biāo)簽for p in soup.select('p'):    print(p)

通過(guò)該方法,可以輸出全部p標(biāo)簽。

那假如我要獲取p標(biāo)簽的屬性和數(shù)據(jù)呢?方法如下:

  
  
  for p in soup.select('p'):    print(p.name) #標(biāo)簽名稱        #標(biāo)簽屬性,也可以用p['id']。若屬性不存在會(huì)報(bào)錯(cuò),和字典獲取鍵值類似    print(p.get('id'))     print(p.string) #標(biāo)簽內(nèi)容

若一個(gè)標(biāo)簽里面有很多子標(biāo)簽,你可以再進(jìn)一步繼續(xù)使用select。

若想獲取標(biāo)簽下全部子標(biāo)簽的文本內(nèi)容??梢杂胹trings屬性得到一個(gè)生成器,不過(guò)可能有很多回車和空格。若想屏蔽回車和空格,可以使用stripped_strings屬性。如下所示:

  
  
  print(''.join(soup.body.strings))print(''.join(soup.body.stripped_strings))

將分別得到:

  
  
  u'\ntest1\ntest2\n'u'test1test2'

感謝各位的閱讀,以上就是“Python爬蟲(chóng)入門知識(shí)點(diǎn)有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Python爬蟲(chóng)入門知識(shí)點(diǎn)有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI