python爬蟲案例:抓取網易新聞

此文屬於入門級級別的爬蟲,老司機們就不用看了。html

本次主要是爬取網易新聞,包括新聞標題、做者、來源、發佈時間、新聞正文python

首先咱們打開163的網站,咱們隨意選擇一個分類,這裏我選的分類是國內新聞。而後鼠標右鍵點擊查看源代碼,發現源代碼中並無頁面正中的新聞列表。這說明此網頁採用的是異步的方式。也就是經過api接口獲取的數據。面試

那麼確認了以後可使用F12打開谷歌瀏覽器的控制檯,點擊Network,咱們一直往下拉,發現右側出現了:"... special/00804KVA/cm_guonei_03.js? .... "之類的地址,點開Response發現正是咱們要找的api接口。json

在這裏插入圖片描述
能夠看到這些接口的地址都有必定的規律:「cm_guonei_03.js」、 「cm_guonei_04.js」,那麼就很明顯了:api

http://temp.163.com/special/0...*).js

上面的鏈接也就是咱們本次抓取所要請求的地址。
接下來只須要用到的python的兩個庫:瀏覽器

  1. requests
  2. json
  3. BeautifulSoup

requests庫就是用來進行網絡請求的,說白了就是模擬瀏覽器來獲取資源。
因爲咱們採集的是api接口,它的格式爲json,因此要用到json庫來解析。BeautifulSoup是用來解析html文檔的,能夠很方便的幫咱們獲取指定div的內容。網絡

下面開始編寫咱們爬蟲:app

第一步先導入以上三個包:異步

import json
import requests
from bs4 import BeautifulSoup

接着咱們定義一個獲取指定頁碼內數據的方法:post

def get_page(page):
    url_temp = 'http://temp.163.com/special/00804KVA/cm_guonei_0{}.js'
    return_list = []
    for i in range(page):
        url = url_temp.format(i)
        response = requests.get(url)
        if response.status_code != 200:
            continue
        content = response.text  # 獲取響應正文
        _content = formatContent(content)  # 格式化json字符串
        result = json.loads(_content)
        return_list.append(result)
    return return_list

這樣子就獲得每一個頁碼對應的內容列表:

在這裏插入圖片描述
以後經過分析數據可知下圖圈出來的則是須要抓取的標題、發佈時間以及新聞內容頁面。
在這裏插入圖片描述

既然如今已經獲取到了內容頁的url,那麼接下來開始抓取新聞正文。

在抓取正文以前要先分析一下正文的html頁面,找到正文、做者、來源在html文檔中的位置。

咱們看到文章來源在文檔中的位置爲:id = "ne_article_source" 的 a 標籤
做者位置爲:class = "ep-editor" 的 span 標籤
正文位置爲:class = "post_text" 的 div 標籤

下面試採集這三個內容的代碼:

def get_content(url):
    source = ''
    author = ''
    body = ''
    resp = requests.get(url)
    if resp.status_code == 200:
        body = resp.text
        bs4 = BeautifulSoup(body)
        source = bs4.find('a', id='ne_article_source').get_text()
        author = bs4.find('span', class_='ep-editor').get_text()
        body = bs4.find('div', class_='post_text').get_text()
    return source, author, body

到此爲止咱們所要抓取的全部數據都已經採集了。

那麼接下來固然是把它們保存下來,爲了方便我直接採起文本的形式來保存。下面是最終的結果:
在這裏插入圖片描述

格式爲json字符串,「標題」 : [ ‘日期’, ‘url’, ‘來源’, ‘做者’, ‘正文’ ]。

要注意的是目前實現的方式是徹底同步的,線性的方式,存在的問題就是採集會很是慢。主要延遲是在網絡IO上,下次能夠升級爲異步IO,異步採集,有興趣的能夠關注下次的文章。

相關文章
相關標籤/搜索