溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何通過Python爬蟲按關(guān)鍵詞抓取相關(guān)的新聞

發(fā)布時間:2021-11-25 14:38:58 來源:億速云 閱讀:716 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹了如何通過Python爬蟲按關(guān)鍵詞抓取相關(guān)的新聞,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

首先,如果從新聞直接進(jìn)行搜索,你會發(fā)現(xiàn)其內(nèi)容最多顯示20頁,因此我們要從新浪的首頁進(jìn)行搜索,這樣才沒有頁數(shù)的限制。

如何通過Python爬蟲按關(guān)鍵詞抓取相關(guān)的新聞

網(wǎng)頁結(jié)構(gòu)分析

<div class="pagebox">

進(jìn)入新浪網(wǎng)并進(jìn)行關(guān)鍵字搜索之后,發(fā)現(xiàn)無論如何翻頁網(wǎng)址都不會變,但是網(wǎng)頁的內(nèi)容卻更新了,經(jīng)驗告訴我這是通過ajax完成的,因此我把新浪的網(wǎng)頁代碼拿下來看了看。

顯而易見,每一次翻頁都是通過點擊a標(biāo)簽向一個地址發(fā)送請求,如果你直接將這個地址放入瀏覽器的地址欄并回車:

如何通過Python爬蟲按關(guān)鍵詞抓取相關(guān)的新聞

那么恭喜你,收到錯誤了

認(rèn)真看一下html的onclick,發(fā)現(xiàn)它是調(diào)用了一個叫g(shù)etNewsData的函數(shù),因此在相關(guān)的js文件中查找一下這個函數(shù),可以看出它是在每次ajax請求之前構(gòu)造了請求的url,并且使用get請求,返回的數(shù)據(jù)格式為jsonp(跨域)。

因此我們只要模仿它的請求格式就可以獲取數(shù)據(jù)了。

var loopnum = 0;
function getNewsData(url){
    var oldurl = url;
    if(!key){
        $("#result").html("<span>無搜索熱詞</span>");
        return false;
    }
    if(!url){
        url = 'https://interface.sina.cn/homepage/search.d.json?q='+encodeURIComponent(key);
    }
    var stime = getStartDay();
    var etime = getEndDay();
    url +='&stime='+stime+'&etime='+etime+'&sort=rel&highlight=1&num=10&ie=utf-8'; //'&from=sina_index_hot_words&sort=time&highlight=1&num=10&ie=utf-8';
    $.ajax({
        type: 'GET',
        dataType: 'jsonp',
        cache : false,
        url:url,
        success: //回調(diào)函數(shù)太長了就不寫了
    })

發(fā)送請求

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
}
params = {
    "t":"",
    "q":"旅游",
    "pf":"0",
    "ps":"0",
    "page":"1",
    "stime":"2019-03-30",
    "etime":"2020-03-31",
    "sort":"rel",
    "highlight":"1",
    "num":"10",
    "ie":"utf-8"
}

response = requests.get("https://interface.sina.cn/homepage/search.d.json?", params=params, headers=headers)
print(response)

這次使用的是requests庫,構(gòu)造相同的url,并發(fā)送請求。結(jié)果收到的結(jié)果是冷冰冰的403Forbidden:

因此重新回到網(wǎng)站看看到底哪里出現(xiàn)了問題

如何通過Python爬蟲按關(guān)鍵詞抓取相關(guān)的新聞

從開發(fā)者工具中找到返回的json文件,并查看請求頭,發(fā)現(xiàn)它的請求頭帶有cookie,因此在構(gòu)造headers時我們直接復(fù)制它的請求頭即可。再次運行,response200!剩下的就簡單了,只需要將返回的數(shù)據(jù)解析后寫入Excel。

如何通過Python爬蟲按關(guān)鍵詞抓取相關(guān)的新聞

完整代碼

import requests
import json
import xlwt

def getData(page, news):
    headers = {
        "Host": "interface.sina.cn",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
        "Accept": "*/*",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
        "Accept-Encoding": "gzip, deflate, br",
        "Connection": "keep-alive",
        "Referer": r"http://www.sina.com.cn/mid/search.shtml?range=all&c=news&q=%E6%97%85%E6%B8%B8&from=home&ie=utf-8",
        "Cookie": "ustat=__172.16.93.31_1580710312_0.68442000; genTime=1580710312; vt=99; Apache=9855012519393.69.1585552043971; SINAGLOBAL=9855012519393.69.1585552043971; ULV=1585552043972:1:1:1:9855012519393.69.1585552043971:; historyRecord={'href':'https://news.sina.cn/','refer':'https://sina.cn/'}; SMART=0; dfz_loc=gd-default",
        "TE": "Trailers"
    }

    params = {
        "t":"",
        "q":"旅游",
        "pf":"0",
        "ps":"0",
        "page":page,
        "stime":"2019-03-30",
        "etime":"2020-03-31",
        "sort":"rel",
        "highlight":"1",
        "num":"10",
        "ie":"utf-8"
    }

    response = requests.get("https://interface.sina.cn/homepage/search.d.json?", params=params, headers=headers)
    dic = json.loads(response.text)
    news += dic["result"]["list"]

    return news


def writeData(news):
    workbook = xlwt.Workbook(encoding = 'utf-8')
    worksheet = workbook.add_sheet('MySheet')

    worksheet.write(0, 0, "標(biāo)題")
    worksheet.write(0, 1, "時間")
    worksheet.write(0, 2, "媒體")
    worksheet.write(0, 3, "網(wǎng)址")

    for i in range(len(news)):
        print(news[i])
        worksheet.write(i+1, 0, news[i]["origin_title"])
        worksheet.write(i+1, 1, news[i]["datetime"])
        worksheet.write(i+1, 2, news[i]["media"])
        worksheet.write(i+1, 3, news[i]["url"])

    workbook.save('data.xls')


def main():
    news = []
    for i in range(1,501):
        news = getData(i, news)
    writeData(news)

if __name__ == '__main__':
    main()

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何通過Python爬蟲按關(guān)鍵詞抓取相關(guān)的新聞”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI