第一週、學會爬取網頁資訊總結
目標:爬取網頁,獲得自己需要的資訊
步驟:
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)總結