1. 程式人生 > >第一周、學會爬取網頁信息總結

第一周、學會爬取網頁信息總結

去除html標簽 data color 取出 ... 第一周 控制 代碼 .text


目標:爬取網頁,獲得自己需要的信息

步驟:

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)總結

第一周、學會爬取網頁信息總結