作業來源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2881
1. 簡單說明爬蟲原理
1:向伺服器發起請求
通過HTTP庫向目标站點發起請求,即發送一個Request,請求可以包含額外的headers等資訊,等待伺服器的響應。
2:擷取響應内容
如果伺服器正常響應,會得到一個Response,Response的内容便是所要擷取的頁面内容,類型可能有HTML、JSON、二進制檔案(如圖檔、視訊等類型)。
3:解析内容
得到的内容可能是HTML,可以用正規表達式、網頁解析庫進行解析。可能是JSON,可以直接轉成JOSN對象進行解析,可能是二進制資料,可以儲存或者進一步處理
4:儲存内容
儲存形式多樣,可以儲存成文本,也可以儲存至資料庫,或者儲存成特定格式的檔案。
2. 了解爬蟲開發過程
1).簡要說明浏覽器工作原理;
浏覽器工作原理的實質就是實作http協定的通訊,具體過程如下:
HTTP通信的流程,大體分為三個階段:
1、 連接配接 伺服器通過一個ServerSocket類對象對8000端口進行監聽,監聽到之後建立連接配接,打開一個socket虛拟檔案。
2、 請求 建立與建立socket連接配接相關的流對象後,浏覽器擷取請求,為GET請求,則從請求資訊中擷取所通路的HTML檔案名,向伺服器發送請求。
3、 應答 服務收到請求後,搜尋相關目錄檔案,若不存在,傳回錯誤資訊。若存在,則想html檔案,進行加HTTP頭等處理後響應給浏覽器,浏覽器解析html檔案,若其中還包含圖檔,視訊等請求,則浏覽器再次通路web伺服器,異常擷取圖檔視訊等,并對其進行組裝顯示出來。
2).使用 requests 庫抓取網站資料;
requests.get(url) 擷取校園新聞首頁html代碼
運作代碼:
url='http://news.gzcc.cn/html/2019/xiaoyuanxinwen_0328/11086.html'
res = requests.get(url)
type(res)
res.encoding = 'utf-8'
res=res.text
res
運作結果:

3).了解網頁
寫一個簡單的html檔案,包含多個标簽,類,id
html_sample = ' \
<html> \
<body> \
<h1 id="title">Hello</h1> \
<a href="#" class="link"> This is link1</a>\
<a href="# link2" class="link" qao=123> This is link2</a>\
</body> \
</html> '
4).使用 Beautiful Soup 解析網頁;
通過BeautifulSoup(html_sample,'html.parser')把上述html檔案解析成DOM Tree
soups = BeautifulSoup(html_sample,'html.parser')
select(選擇器)定位資料
a1 =soups.a
a = soups.select('a')
找出含有特定标簽的html元素
h = soups.select('h1')
h
運作截圖:
找出含有特定類名的html元素
l = soups.select('.link')
l
找出含有特定id名的html元素
t = soups.select('#title')
t
3.提取一篇校園新聞的标題、釋出時間、釋出機關、作者、點選次數、内容等資訊
如url = 'http://news.gzcc.cn/html/2019/xiaoyuanxinwen_0320/11029.html'
要求釋出時間為datetime類型,點選次數為數值型,其它是字元串類型。
- 标題
soups = BeautifulSoup(res,'html.parser')
a1=soups.a
a=soups.select('.show-title')[0].text
a
- 釋出時間
dt =newsDate +' '+newsTime
dt
datetime.strptime(dt,'%Y-%m-%d %H:%M:%S')
- 作者
運作代碼
h=soups.select('.show-info')[0].text.split()[2]
h
- 釋出機關
h=soups.select('.show-info')[0].text.split()[4]
h
- 内容
t=soups.select('.show-content')[0].text
t
- 點選次數
url='http://oa.gzcc.cn/api.php?op=count&id=11086&modelid=80'
res = requests.get(url)
type(res)
res.text