使用指南

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

源码

import requests
import json
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, page):

    jsObj = json.loads(html)
    tempList = jsObj['data']

    newsList = []

    for item in tempList:

        if page == 1:
            # 第一页这么解析
            title = item['title']
            link = item['url']
            date = item['time']
        else:
            # 从第二页起这么解析
            title = tempList[item]['title']
            link = tempList[item]['url']
            date = tempList[item]['time']

        title = title.replace("\r", "")

        if "/" not in date:
            today = time.strftime("%Y/%m/%d ", time.localtime())
            date = today + date

        print([date, title, link])
        newsList.append([date, title, link])

    return newsList

def saveData(data, filename):

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

def spiderManager(TotalPage, filename):

    if TotalPage < 1:
        page = 1
        while True:
            url = "https://news.ltn.com.tw/ajax/breakingnews/all/%d" % page
            html = fetchUrl(url)
            data = parseHtml(html, page)
            saveData(data, filename)
            print("----" * 20)
            if len(data) < 20:
                break;
            page += 1

    else:
        for page in range(1, TotalPage + 1):
            url = "https://news.ltn.com.tw/ajax/breakingnews/all/%d" % page
            html = fetchUrl(url)
            data = parseHtml(html, page)
            saveData(data, filename)
            print("----"*20)


if __name__ == "__main__":

    # 保存的文件名
    filename = "自由时报.csv"

    # 要爬取的页数范围,爬取 1 - totalPage 页的内容,若 totalPage 为 0, 则爬取所有
    totalPage = 0

    spiderManager(totalPage, filename)
    print("结束")
最后修改:2021 年 01 月 27 日 12 : 55 PM
如果觉得我的文章对你有用,请随意赞赏