1. 程式人生 > >爬蟲基本介紹 && python3 爬蟲爬取網易新聞排行榜

爬蟲基本介紹 && python3 爬蟲爬取網易新聞排行榜

爬蟲基本介紹

1. 什麼是爬蟲?

爬蟲是請求⽹網站並提取資料的⾃自動化程式

2. 爬蟲的基本流程

  1. 發起請求
    通過HTTP庫向目標站點發起請求,即傳送一個Request,請求可以包含額外的headers等資訊,等待伺服器器響應。
  2. 解析內容
    如果服務器能正常響應,會得到一個Response,Response的內容便是所要獲取的頁面內容,型別可能有HTML,Json字元串,二進位制資料(如圖片視訊)等型別。
  3. 獲取響應內容
    得到的內容可能是HTML,可以用正則表示式、網頁解析庫進行解析。可能是Json,可以直接轉為Json物件解析,可能是二進位制資料,可以做儲存或者進一步的處理。
  4. 儲存資料
    儲存形式多樣,可以存為文字,也可以儲存至資料庫,或者儲存特定格式的檔案。

3. 什麼是Request和Response?

  • 瀏覽器就傳送訊息給該網址所在的服務器,這個過程叫做HTTP Request。
  • 服務器收到瀏覽器傳送的訊息後,能夠根據瀏覽器傳送訊息的內容,做相應處理,然後把訊息回傳給瀏覽器。這個過程叫做HTTP Response。
  • 瀏覽器收到服務器的Response資訊後,會對資訊進行相應處理,然後展示。

3.1 Request中包含什麼?

Request和Response

  • 請求方式:主要有GET、POST兩種型別,另外還有HEAD、PUT、DELETE、OPTIONS等。
  • 請求頭
    :包含請求時的頭部資訊,如User-Agent、Host、Cookies等資訊。
  • 請求URL:URL全稱統一資源定位符,如一個網頁文件、一張圖片、一個視訊等都可以用URL唯一來確定。
  • 請求體:請求時額外攜帶的資料如表單提交時的表單資料

3.2 Response中包含什麼?

  • 響應狀態:有多種響應狀態,如200代表成功、301跳轉、404找不到頁面、502服務器錯誤
  • 響應頭:如內容型別、內容長度、服務器資訊、設定Cookie等等。
  • 響應體:最主要的部分,包含了請求資源的內容,如網頁HTML、圖片二進位制資料等。

4. 爬蟲可以抓取怎樣的資料?

  • 網頁文字:如HTML文件、Json格式文字等。
  • 圖片:獲取到的是二進位制檔案,儲存為圖片格式。
  • 視訊:同為二進位制檔案,儲存為視訊格式即可。
  • 其它:只要是能請求到的,都能獲取。

5. 怎樣來解析?

  • 直接處理
  • Json解析
  • 正則表示式
  • BeautifulSoup
  • PyQuery
  • Xpath

6. 怎樣儲存資料?

  • 文字:純文字、Json、Xml等。
  • 關係型資料庫:如MySQL、Oracle、SQL Server等具有結構化表結構形式儲存。
  • 非關係型資料庫:如MongoDB、Redis等Key-Value形式儲存。
  • 二進位制檔案:如圖片、視訊、音訊等直接儲存成特定格式即可。

爬蟲爬取網易新聞排行榜。

1. 確定目標

經過討論,分析,對比各個新聞入口網站的排行榜,最終選取了內容正規、不良資訊少、廣告少的網易新聞排行榜。每個整點爬取一次,選取點選率最高的前20條熱門新聞。即紅框所選內容。
網易新聞排行榜

2. 分析目標網頁

目標網頁:http://news.163.com/special/0001386F/rank_news.html
通過分析網頁原始碼得知,這個網頁排行榜並不是通過JavaScript動態載入生成。所以網頁爬取後可以直接處理,簡單利用BeautifulSoup + requests庫即可實現。

3. 實現過程

3.1 請求目標網頁並存儲網頁原始檔

# 匯入相應的包
from bs4 import BeautifulSoup
import requests
import re
import datetime
from connect_mysql import *
# 獲取當前時間並指定格式為2018041018
time = datetime.datetime.now().strftime("%Y%m%d%H")
url = r'http://news.163.com/special/0001386F/rank_news.html'
# 模擬真實瀏覽器進行訪問
headers = {'User-Agent':
               'Mozilla/5.0 (Windows NT 10.0; WOW64) '
               'AppleWebKit/537.36 (KHTML, like Gecko) '
               'Chrome/55.0.2883.87 Safari/537.36'}
response = requests.get(url, headers=headers)
page_html = response.text

3.2 將獲取到的內容轉換成BeautifulSoup格式,並將html.parser作為解析器

soup = BeautifulSoup(page_html, 'html.parser')

3.3 對soup進行分析處理

首先通過分析網站結構得知,我們需要的資料在class = tabContents active的div下的所有a標籤中,而這個div又巢狀在class = area-half left的div中。所以我們寫如下程式碼,從網頁原始碼中找到所有符合要求的標題,限制20條。

titles = soup.find('div', 'area-half left').find('div', 'tabContents active').find_all('a', limit=20)

僅需一行程式碼,我們就已經獲取到了我們需要的部分資料。接下來繼續獲取新的對我們有用的資料,並存放到資料庫。

通過開發者除錯工具分析網頁原始碼

3.4 對3.3的結果進一步處理

由於網頁標題顯示不全,所以上一步爬取的標題,部分不完整。所以我們需要進一步爬取,步驟和上述幾個操作類似,爬取新聞連結,新聞內容,新聞完整標題。這三個內容,並呼叫自己寫的方法,將資料存放到資料庫。並用re庫對內容進行簡單處理(去除\n\t\r ),具體實現如下。

for title in titles:
    '''
    news_url:新聞連結
    news_html:新聞頁網頁原始碼 
    '''
    news_url = (str(title.get('href')))
    news_response = requests.get(news_url, headers=headers)
    news_html = news_response.text
    # 將獲取到的內容轉換成BeautifulSoup格式,並將html.parser作為解析器
    news_soup = BeautifulSoup(news_html, 'html.parser')
    # 從網頁原始碼中找到屬於post_text類的div,並將所有p標籤內容存入列表news_contents
    if news_soup.find('div', 'post_text') is None:  # 如果網頁丟失,跳出本次迴圈
        continue
    news_title = news_soup.find('h1')
    contents = news_soup.find('div', 'post_text').find_all('p')
    news_contents = []
    for content in contents:
        if content.string is not None:
            #去掉特殊字元
            news_contents.append(re.sub('[\r\n\t ]', '', str(content.string)))
    #字串拼接
    news_contents = ''.join(news_contents)
    # 將爬取到的資料存入資料庫
    insert_wangyinews_into_mysql(wangyi_news, str(news_title.string), news_url, news_contents, time)

這樣,一個簡單的爬蟲就完成了,不要小看這幾十行程式碼,它們在本專案中發揮了巨大的作用。

本文所用開發環境:
anaconda 5.1
pycharm

本文第一部分是崔慶才老師的python3網路爬蟲視訊教程的筆記:
課程連結:https://cuiqingcai.com/4320.html
崔老師的課程對我有很大的幫助,再次感謝。