python爬虫实战:爬取巴伦周刊网站首页新闻

219 阅读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")
    scripts = bsObj.find_all("script")[29]
    content = scripts.text.lstrip().rstrip().replace("window.__STATE__ = ", "").split(";")[0]

    retData = []

    jsObj = json.loads(content)
    headlines = jsObj['data']
    for item in headlines:
        if "article" in item:
            dataObj = headlines[item]['data']['data']
            timestamp = dataObj['timestamp'] / 1000
            date = time.strftime("%Y-%m-%d", time.localtime(timestamp))
            link = dataObj['url']
            title = dataObj['headline']
            print(date, title, link)
            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)


if __name__ == "__main__":

    # 巴伦周刊

    url = "https://www.barrons.com/"
    html = fetchUrl(url)
    data = parseHtml(html)
    saveData(data, "巴伦周刊.csv")