1. 程式人生 > >第一週、學會爬取網頁資訊總結

第一週、學會爬取網頁資訊總結


目標:爬取網頁,獲得自己需要的資訊

步驟:

1. 匯入需要的模組
2. 利用request向目標網站獲得網頁資訊
3. 用BeautifulSoup解析所獲得的網頁
3. 獲得需要的資訊所在的標籤內容
4. 精簡標籤獲得關鍵資訊
5. 獲得關鍵資訊之後,再處理(比如比大小)


1、匯入需要的模組

BeautifulSoup模組:

BeautifulSoup:是一個可以從HTML和XML中讀取資料的庫。庫也叫模組,在笨辦法學Python中叫做特徵,是其他程式設計師開發好的一些程式碼,可以拿來匯入(import),然後呼叫。

from bs4 import BeautifulSoup

request模組:
request庫:是Python中的一個HTTP網路請求庫,用來簡化網路請求!能夠讓你的Python程式向伺服器傳送HTTP請求,獲得網頁資料的庫。

import requests

 time庫:
如果我們太頻繁的向伺服器傳送請求,伺服器會察覺拒絕服務,導致IP被封,這個時候就需要time庫控制時間。

import time

 

2、利用request向目標網站獲得網頁資訊

客戶端(使用者)如果想瀏覽某個網頁首先是向目標URL傳送requests請求。

然後伺服器在收到請求之後,返回一個response迴應,如Response [200]表示收到,Response[404]表示伺服器無法迴應。如果返回的是200,則載入請求網頁的資訊。

如果目標網頁是登入之後的網頁,就需要用headers包含User-Agent和cookie等資訊,一起requests過去,才能獲得所需網頁資訊。

1 url = 'www.example.com' #目標網站url
2 headers = {
3     'User-Agent':'****',    #包含的瀏覽器資訊
4     'Cookie':'***'         
5     }
6 
7 wb_data = requests.get(url,headers = headers)


3、用BeautifulSoup解析所獲得的網頁

獲得網頁資訊之後,再用BeautifulSoup解析網頁。

1 soup = BeautifulSoup(wb_data.text,'lxml')


4、獲得需要的資訊所在的標籤內容



解析網頁之後,就需要定位所需資訊所在的標籤,這也是第一週的難點,也就是如何定位所需的資訊的位置。

一般方法是在Chrome中檢查網頁,然後copy selector,會獲得元素標籤的selector路徑。如果獲得的資訊是同一型別,那麼就需要對多條selector進行對比,然後找出最優的selector路徑,這些路徑需要測試看獲得的資訊對不對。

例子程式碼:

1 images = Soup.select('body > div.main-content > ul > li > img')
2 titles = Soup.select('body > div.main-content > ul > li > div.article-info > h3 > a')
3 descs = Soup.select('body > div.main-content > ul > li > div.article-info > p.description')
4 rates = Soup.select('body > div.main-content > ul > li > div.rate > span')
5 cates = Soup.select('body > div.main-content > ul > li > div.article-info > p.meta-info')

 

5、精簡標籤獲得關鍵資訊

獲得標籤之後,還需要去掉其他沒用的資訊,得到關鍵資訊。可以利用for... in...遍歷資訊,然後獲得關鍵資訊,裝入一個序列或者字典中待用。

例子程式碼:

 1 info = []
 2 
 3 
 4 #code
 5 
 6 
 7 for title,image,desc,rate,cate in zip(titles,images,descs,rates,cates):
 8     data = {
 9         'title': title.get_text(),      # get_text()去除html標籤,獲得文字資訊。
10         'rate': rate.get_text(),
11         'desc': desc.get_text(),
12         'cate': list(cate.stripped_strings),        # stripped_strings獲得一個父級標籤下所有子標籤的文字資訊
13         'image': image.get('src'),      # get()獲得某個標籤的屬性
14     }
15     info.append(data)   #append在列表末尾新增新的物件


6、獲得關鍵資訊之後,再處理

最後再從上一步中待用的序列或者字典中,取出資訊,操作,可以是比大小或者打印出來。也就是我們要爬取這些資訊的目的。

7、注意:

如果將以上程式碼封裝進一個函式裡面,然後在利用此函式爬取不同網頁的時候,需要在requests網頁之後,再加入一個等待時間,就是time模組的用處。

程式碼:

1 wb_data = requests.get(url,headers = headers)
2 time.sleep(5)

5代表5秒,這樣操作主要是為了防止伺服器接受requests請求太頻繁,拒絕服務,甚至封掉IP,是一個保護措施。

課時(9-17)總結