【python】爬蟲——爬取新浪國內新聞

文本爲學習筆記

python版本:python3

運行環境:win10

IDE:pycharm

爬蟲是什麼?

     網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱爲網頁追逐者),是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻,自動索引,模擬程序或者蠕蟲。(來自百度百科)

    作爲新手的我,猛地一看!好像什麼都沒看懂。然後研究了一個早上後發現,其實也就是通過代碼來獲取網上自己需要的信息和資源嘛。

    有一點需要說明的就是——前面也說了,我是一名新手,爲什麼要發博客萬一誤導別人呢?其實這個是我的期末作業而已,當然我也會盡力去寫好,萬一真的能幫到人呢?

擼起袖子開始幹!

    首先說一下大體思路就是獲取新浪網的內容,讓後就是使用python提取出每一則新聞的標題、發佈時間、網址、來源還有作者。

    建好項目,打開編輯器(pycharm)直接開工,這就開始遇到很多的問題了。一開始,我以爲是用正則表達式去獲取新聞標題等內容,後來在網上找了很多的資料後發現很多大牛們都不建議用正則表達式來匹配HTML(我也不會0.0)。然後經過一番波折之後找到了一個好東西——beautifulsoup,然後就開始了安裝這個好東西

    https://jingyan.baidu.com/article/e75aca851c7e59142edac6c7.html(安裝beautifulsoup傳送門)

    然後再安裝一個bs4

    https://www.cnblogs.com/lizm166/p/8128613.html(安裝bs4傳送門)

    安裝好上面的東西之後,就開始進入正題了!首先還沒試過爬蟲的我寫了一段小代碼測試一下看看是否能夠爬取到新浪網的新聞(代碼如下)

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

    跑了一遍之後發現沒問題(如下圖)

    

    然後開始我們真正的大工程了(提取出每一則新聞的標題、發佈時間、網址、來源還有作者),其實感覺上面那個就已經差不多我需要爬取的內容都基本有了,就是還沒有新聞來源和新聞作者。那麼我們就開始完善它!

    要獲得新聞的來源和新聞作者就要進入到每一則新聞的鏈接裏面纔有,不想上面獲取到的內容都是在同一個網頁就能獲取到,話不多說,直接上代碼:

import  requests
import json
import pandas
from datetime import  datetime
from bs4 import BeautifulSoup

def getNewsDetail(newsurl):
    result = {}
    result['編輯'] = newsurl
    res = requests.get(newsurl)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text,'html.parser')
    result['時間'] = soup.select('.date')[0].contents[0]  #獲取時間並且規範時間格式
    result['標題'] = soup.select('.main-title')[0].text #獲取標題
    result['來源'] = soup.select('.source')[0].text  #獲取來源
    result['編輯'] = soup.select('.show_author')[0].text.lstrip('責任編輯:')
    print(result['標題'],'\t',result['時間'],'\t',result['來源'],'\t',result['編輯'],'\t','[',newsurl,']')
    return  result

def parseListLinks(url):  #建立剖析清單鏈接函式
    newsdetails = []
    res = requests.get(url)
    jd = json.loads(res.text.lstrip('  newsloadercallback(').rstrip(');')) #剔除掉無關的代碼
    for ent in jd['result']['data']:
        newsdetails.append(getNewsDetail(ent['url']))
    return newsdetails

#抓取每頁新聞的內文
url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1528651929350'
news_total = []
for i in range(1,2):
    newsurl = url.format(i)
    newsary = parseListLinks(newsurl)
    news_total.extend(newsary)

    上面的就是我寫完的代碼了,運行一遍後就可以發現新聞來源和新聞作者都有了

    這個代碼裏面其實和第一個小測試的時候多了一個新的地方就是json,json可以將 JavaScript 對象中表示的一組數據轉換爲字符串,然後就可以在網絡或者程序之間輕鬆地傳遞這個字符串,並在需要的時候將它還原爲各編程語言所支持的數據格式。至於詳細的介紹內容:

    https://baike.baidu.com/item/JSON/2462549?fr=aladdin(json百度傳送門)

    那麼到這裏爲止,爬取新浪網新聞的任務也就完成了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章