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