首页 > 编程语言 >Python爬虫实战系列2:虎嗅网24小时热门新闻采集

Python爬虫实战系列2:虎嗅网24小时热门新闻采集

时间:2024-03-14 11:57:33浏览次数:30  
标签:24 __ playwright Python datalist moment path 嗅网 page

一、分析页面

打开虎嗅网,点击【24小时】
在这里插入图片描述

本次采集,我们以这24小时的热门新闻为案例。

1.1、分析请求

F12打开开发者模式,然后点击Network后点击任意一个请求,Ctrl+F开启搜索,输入标题雷军回应 ,开始搜索
在这里插入图片描述
可以看到请求地址为https://www.huxiu.com/moment/ 但是返回的内容不是json格式,而是html源码,结合上次博客园采集经验我们需要解析html源码来获取数据,但是如果我们再细心一点,进一步搜索就会有惊喜。

通过直接在返回内容里搜索关键字,发现有一个js变量window.__INITIAL_STATE__; 存储了页面所需数据。
在这里插入图片描述

而这个变量里的['moment']['momentList']['moment_list']['datalist'][0]['datalist']内容则就是新闻具体数据
在这里插入图片描述

接下来就简单了,同样的套路,分析请求必需参数和cookie反爬策略,然后我们通过请求后获取js变量结果方式来进行爬取。

二、代码实现

本次技术实现使用如下库:

1.playwright:用来打开URL,执行JavaScript代码,获取js变量值

源码如下

# -*- coding: utf-8 -*-

import os
import sys
import time

from playwright.sync_api import sync_playwright

opd = os.path.dirname
curr_path = opd(os.path.realpath(__file__))
proj_path = opd(opd(opd(curr_path)))
sys.path.insert(0, proj_path)

# http请求默认agent
USERAGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'


spider_config = {
    "name_en": "https://www.huxiu.com/moment/",
    "name_cn": "虎嗅"
}


def extract_title(text):
    if text:
        first_sentence = str(text).split('。')[0]
        return first_sentence
    else:
        return text


class Huxiu:
    def __init__(self):
        self.headers = {
            'authority': 'www.huxiu.com',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
            'user-agent': USERAGENT
        }

    def get_news(self):
        results = []
        with sync_playwright() as playwright:
            browser = playwright.chromium.launch(
                headless=True,
                slow_mo=1000,
                args=['--start-maximized']
            )

            context = browser.new_context(
                no_viewport=True,
                accept_downloads=True
            )
            page = context.new_page()
            page.set_default_timeout(200000)
            page.goto('https://www.huxiu.com/moment/')
            page.wait_for_load_state('load')
            # 获取动态JavaScript内容
            initial_state = page.evaluate('(function() { return window.__INITIAL_STATE__; })()')
            datalist = initial_state['moment']['momentList']['moment_list']['datalist'][0]['datalist']
            for data in datalist:
                results.append(
                    {
                        "news_title": extract_title(data['content']) + "。",
                        "news_date": data['format_time'],
                        "source_en": spider_config['name_en'],
                        "source_cn": spider_config['name_cn'],
                    }
                )

            browser.close()

        return results

def main():
    huxiu = Huxiu()
    results = huxiu.get_news()
    print(results)


if __name__ == '__main__':
    main()

源码中核心内容:获取动态JavaScript内容

initial_state = page.evaluate('(function() { return window.__INITIAL_STATE__; })()')

总结

1.分析页面,有些页面请求返回的是html,但是也有可能会将数据拼接在js里来渲染页面
2.Python中执行JavaScript代码一种推荐的方式是使用playwright这种库,内置浏览器引擎,且很少被认为是暴力请求,并且自带等待机制

本文章代码只做学习交流使用,作者不负责任何由此引起的法律责任。

各位看官,如对你有帮助欢迎点赞,收藏,转发

关注公众号【Python魔法师】带你了解更多Python魔法

qrcode.jpg

标签:24,__,playwright,Python,datalist,moment,path,嗅网,page
From: https://www.cnblogs.com/meet/p/18068017

相关文章

  • 【2024-03-13】坚持清淡
    20:00花开了,就像花醒了似的。鸟飞了,就像鸟上天了似的。虫子叫了,就像虫子在说话似的。一切都活了。都有无限的本领,要做什么,就做什么。要怎么样,就怎么样。都是自由的。                                  ......
  • 亚洲唯一!京东荣获2024年度Gartner供应链技术创新奖背后的创新探索
    导语:2月14日晚间,Gartner公布了2024年度GartnerPoweroftheProfession供应链大奖,京东集团荣获供应链技术创新奖,成为获得该奖项的唯一亚洲企业。GartnerPoweroftheProfession供应链奖项已经举办十年,是衡量企业供应链创新能力的国际权威奖项。据悉,入围决赛的共有5家企业,另外4......
  • python--类与面向对象-2
    类与面向对象中一些重要函数讲解一、对象在文本中的输出classPerson:    def__init__(self,name,agg,live_value,money):        self.name=name        self.agg=agg        self.live_value=live_value ......
  • python装饰器
    一:什么是装饰器器:指的是工具,可以定义为函数装饰:指的是为其他事物添加额外的东西点缀装饰器:指的是定义一个函数,该函数是用来给其他函数添加额外的功能二、为什么要用装饰器开放封闭原则:开放:指的是对拓展功能是开放的封闭:指的......
  • Python的垃圾回收机制
    什么是垃圾回收机制垃圾回收(GarbageCollection)是一种自动内存管理机制,用于检测和释放不再被程序使用的内存资源,以避免内存泄漏和资源浪费。 在编程中,当对象被创建时,系统为其分配一块内存空间。但是,当对象不再被程序使用时,如果没有及时释放相关的内存空间,就会导致内存泄漏。垃......
  • 2024-03-07-Nodejs(1-Node基础)
    1.初识Nodejs1.1思考为什么js可以在浏览器中被执行?浏览器中具备js解析引擎,其中chrome浏览器的v8引擎最优。为什么js可以操作DOM和BOM?每个浏览器都内置了DOM和BOM这样的api函数,因此浏览器中的js才可以调用它们。js运行环境运行环境是指代码正常运行所必须的环境。......
  • 2024-03-11-Nodejs(3-数据库与身份验证)
    3.数据库与身份验证3.1数据库基本概念数据库是用来组织、存储和管理数据的仓库;传统数据库中,数据结构分为数据库(database)、数据表(table)、数据行(tow)、字段(field)四大部分。3.2配置mysql模块安装mysql模块npminstallmysql建立连接constmysql=require('mysql')......
  • 2024-03-08-Nodejs(2-Express)
    2.Express​ 基于Node.js平台,快速、开放、极简的Web开发框架,Express是用于快速创建服务器的第三方模块。2.1基本使用#安装expressnpminstallexpressconstexpress=require("express");//创建web服务器constapp=express();//监听客户端的GET和POST......
  • 2024-03-11-Nodejs(4-大事件项目)
    4.大事件项目4.1项目初始化项目整体架构图大事件项目 |--- db | |---index.js |---router | |---user.js |---router_handler | |---user.js |---schema | |---user.js |---app.js |---config.js4.1.1创建项目新建api_server文件夹作为项目......
  • Python特征选择技术总结
    本文还可以帮助你解答以下的面试问题:什么是特征选择?说出特性选择的一些好处你知道哪些特征选择技巧?区分单变量、双变量和多变量分析。我们能用PCA来进行特征选择吗?前向特征选择和后向特征选择的区别是什么?什么是特征选择,为什么它很重要?特性选择是选择与ML模型......