python爬虫实战:爬取星岛日报网站各板块新闻

169 阅读1分钟

使用指南

  1. 本代码用于爬取 星岛日报 新闻网站中 两岸国际娱乐 等板块的新闻文章(包括新闻标题,新闻链接,和发布日期三个数据)
  2. Python3 环境下运行本代码,同时保证运行环境中安装有 requestspandas 库。
  3. 运行结果保存为 "星岛日报-两岸.csv" 等文件中,路径位于脚本同路径下(如有需要可以修改代码中 filename 的值,设置文件名和存储路径)
  4. 使用此爬虫前,请确保您的网络可以正常访问 星岛日报 网站,否则爬虫运行会报错失败。
  5. 本爬虫仅供学习交流使用,请勿用于商业用途。

源码

import requests
import json
from bs4 import BeautifulSoup
import pandas as pd
import time

def fetchUrl(url):

    header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
    }

    r = requests.get(url, headers = header)
    r.encoding = r.apparent_encoding
    return r.text

def parseHtml(html):

    bsObj = BeautifulSoup(html, "lxml")
    temp = bsObj.find_all("div", attrs={"class": "news-wrap"})

    retData = []

    for item in temp:
        link = item.a["href"]
        title = item.find("div", attrs={"class": "title"}).text
        date = item.find("div", attrs={"class": "time"}).text

        retData.append([date, title, link])

    return retData

def saveData(data, filename):

    dataframe = pd.DataFrame(data)
    dataframe.to_csv(filename, mode='a', index=False, sep=',', header=False)

def spiderManager(id, totalPage):

    print("正在爬取", id, "板块")
    for page in range(1, totalPage + 1):
        url = "https://www.singtaousa.com/home/{0}/?pageNum={1}".format(id, page)

        html = fetchUrl(url)
        data = parseHtml(html)
        saveData(data, "星岛日报-%s.csv"%id)
        print("--第", page, "页爬取完成")

    print(id, "板块爬取完成")

if __name__ == "__main__":

    # 星岛日报

    spiderManager("9-兩岸", 3)
    spiderManager("11-國際", 3)
    spiderManager("12-娛樂", 3)
    spiderManager("13-香港", 3)