1. 程式人生 > >python實戰之網路爬蟲(爬取網頁新聞資訊列表)

python實戰之網路爬蟲(爬取網頁新聞資訊列表)

關於大資料時代的資料探勘

(1)為什麼要進行資料探勘:有價值的資料並不在本地儲存,而是分佈在廣大的網路世界,我們需要將網路世界中的有價值資料探勘出來供自己使用

(2)非結構化資料:網路中的資料大多是非結構化資料,如網頁中的資料都沒有固定的格式

(3)非結構化資料的挖掘--ETL:即三個步驟,分別是抽取(extract)、轉換(transformation)、儲存(loading),經過這三個步驟後的資料才可以取用

關於網路爬蟲

(1)可以從各大網站爬取大量資料,並進行結構化,最後儲存在本地資料庫,供我們自己索引使用

(2)網路爬蟲構架:

比如自己電腦上的瀏覽器就是網頁聯結器,一個網站的網頁就是網頁適服器,在瀏覽器中輸入該網站的網址,就是向網頁適服器傳送請求,網頁適服器將頁面在瀏覽器中顯示就是給的迴應,網路爬蟲通過網頁適服器給出的迴應,找到相關資料進行爬取,並對這些資料進行剖析,得到結構化資料資料,最後儲存在資料中心以備使用

關於網路爬蟲的一個實戰(新聞資訊爬取)

專案描述:通過python網路爬蟲爬取新浪網上國內新聞欄中的所有新聞資訊,內容包括各大新聞的標題、新聞來源、時間、文章內容、編輯以及評論數,最後做成表格的形式存於excel表格中

專案工具:python,谷歌瀏覽器

所需模組:request、re、BeautifulSoup4、datetime、json

具體步驟:

(1)觀察網頁:開啟新浪網國內新聞頁面http://news.sina.com.cn/china/。在頁面空白處點選右鍵,點選最下方的“檢查”選項,出現當前網頁的開發人員工具檢視介面,其中的“network”欄可以當作我們的“監聽器”,可以檢視當前頁面中網頁適服器返回的迴應內容,迴應內容分為很多類,如JS是Javascripts做成的內容,CSS是網頁裝飾器,doc是網頁檔案內容等等,這裡我們要抓取的新聞資訊一般是放在doc中的,找到doc型別中的名為china的檔案就是我們要找的國內新聞所在,其內容在“response”迴應中可以找到。

(2)獲取網頁整體資源--request:request模組是用於獲取網路資源的模組,可以使用REST操作,即post、put、get、delete等操作對網路資源進行存取。讀取一個網頁的網路資源的簡單程式碼如下:

import requests
newsurl = 'http://news.sina.com.cn/china/'
res = requests.get(newsurl)
res.encoding = 'utf-8'
print(res.text)

其中res.encoding = 'utf-8'是將編碼格式轉變成中文格式,res.text是顯示所獲取的資源的內容

(3)獲取細節資源--BeautifulSoup4:BeautifulSoup4模組可以按照Document Object Model Tree對獲取的網路資源進行分層,然後通過select方法對各個層次中的細節資源進行獲取。Document Object Model Tree圖形如下:

使用BeautifulSoup4取出網路資源,以便於從中再取出細節內容:

import requests
from bs4 import BeautifulSoup
newsurl = 'http://news.sina.com.cn/c/2018-08-14/doc-ihhtfwqq9509421.shtml'
res = requests.get(newsurl)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text)
print(soup.text)

這裡說明一下res.text和soup.text的區別,前者中res是網頁迴應內容,text是取出這個網頁迴應的所用內容,而後者中soup是BeautifulSoup物件,這裡的text是去掉迴應內容中的標籤,如<html></html>

(4)BeautifulSoup的select方法:可以針對不同的標籤來取出標籤中的內容

1.找出含有h1標籤的元素:

soup = BeautifulSoup(html_sample)
header = soup.select('h1')
print(header)

2.找出含有a標籤的元素:

soup = BeautifulSoup(html_sample)
alink = soup.select('a')
print(alink)

3.找出id為title的元素:

soup = BeautifulSoup(html_sample)
title = soup.select('#title')
print(title)

4.找出class為link的元素:

soup = BeautifulSoup(html_sample)
link = soup.select('.link')
print(link)

5.獲取一個元素中的屬性--獲取一個超連結中的herf屬性的內容

soup = BeautifulSoup(html_sample)
alink = soup.select('a')

for link in alink:

       print(link['herf'])

BeautifulSoup的select方法獲取的內容是列表形式,如果要對其內容進行操作,必須要將列表元素拿出來,如要獲取class為link的元素中文字內容,則可以使用print(link[0].text)

(5)製作一個簡單的爬蟲

首先,進入新浪新聞網國內新聞頁面,進入該頁的開發人員介面,隨意檢視一條新聞的元素,可以發現這些新聞都是位於一個class為news-item的<div>內,所以選擇這個class,對其中的內容進行遍歷即可得到所有的新聞的內容

然後,檢視每一條新聞的具體內容,其中題目位於h2標籤中,時間有class='time'標記,網址在第一個a標籤中

最後,通過這些標籤對所有具體內容進行篩選。程式碼如下:

import requests
from bs4 import BeautifulSoup
url = 'http://news.sina.com.cn/china/'
res = requests.get(url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text)
# print(soup)
for new in soup.select('.news-item'):
    if len(new.select('h2')) > 0:
        h2 = new.select('h2')[0].text
        time = new.select('.time')[0].text
        a = new.select('a')[0]['href']
    print(h2, time, a)

得到的結果如下:

一圖讀懂:多方整治“天價片酬” 演員最高拿多少? 8月15日 09:12 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3527505.shtml
上海商店招牌脫落致3死 兩人被採取刑事強制措施 8月15日 08:56 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3419248.shtml
上海商店招牌脫落致3死 兩人被採取刑事強制措施 8月15日 08:56 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3419248.shtml
上海商店招牌脫落致3死 兩人被採取刑事強制措施 8月15日 08:56 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3419248.shtml
中國核潛艇極限長航背後:艇員出航前寫遺書拍遺像 8月15日 08:56 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3450991.shtml
天津村莊遭龍捲風侵襲 磚房被吹塌大樹攔腰折斷 8月15日 08:54 http://slide.news.sina.com.cn/c/slide_1_86058_311891.html
珍貴視訊:瀋陽審判日本戰犯全認罪 跪地痛哭謝罪 8月15日 08:40 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3366825.shtml
珍貴視訊:瀋陽審判日本戰犯全認罪 跪地痛哭謝罪 8月15日 08:40 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3366825.shtml
眾籌6萬治療費被平臺索5%“稅款”慈善應該繳費嗎 8月15日 08:23 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3227219.shtml
眾籌6萬治療費被平臺索5%“稅款”慈善應該繳費嗎 8月15日 08:23 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3227219.shtml
今天是日本戰敗投降紀念日:當年日本曾想靠它翻盤 8月15日 08:21 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3417423.shtml
港媒:若美臺不理“不得”警告 大陸將以行動說話 8月15日 08:19 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3399386.shtml
進口博覽會期間上海將對網約車實行臨時價格干預 8月15日 08:15 http://news.sina.com.cn/c/2018-08-15/doc-ihhtfwqr3178883.shtml
臺“皮帶大王”廈門公司倒閉拍賣 員工拿千萬欠薪 8月15日 08:11 http://news.sina.com.cn/o/2018-08-15/doc-ihhtfwqr3193973.shtml
張廣寧任廣東肇慶市委副書記(圖/簡歷) 8月15日 07:59 http://news.sina.com.cn/o/2018-08-15/doc-ihhtfwqr3193541.shtml