Python爬取今日头条热门文章

news2024/11/27 4:18:38

前言

今日头条文章收益是没有任何门槛,只要是你发布文章,每篇文章的阅读量超过1000就能有收益,阅读量越多收益越高。于是乎我就有了个大胆的想法。何不利用Python爬虫,爬取热门文章,然后完成自动化发布文章呢?这不就完成了我多年以来躺着赚钱的愿望了嘛。说干就干,于是乎就有了下面的操作。我的思路是这样的,因为娱乐版块的文章更容易上热门,于是我就以娱乐版块为突破口。

 

1. 获取今日头条文章列表接口

找到了获取文章列表的接口,今日头条的接口做了反爬虫处理,每次请求接口时都需要带上一组加密字符,否则接口报错,于是我通过百度,发现今日头条的加密字符串生成来自于acrawler.js文件,我将js文件下载到本地按照网友的方法发现代码跑起来了加密字符串生成了,然后我加成功拼接url成功获取到了文章列表。

 

将acrawler.js下载到本地,引入到自己的html文件中,并执行代码 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>getSig</title>
    <script src="./acrawler.js"></script>
</head>
<body>
    <p id="sigUrl"></p>
</body>
<script>

    var channel = "3189398972" // 娱乐
    // var channel = "3189398999" // 科技

    function getSSSS(){
        var time = new Date();
        var str = "https://www.toutiao.com/api/pc/list/feed?channel_id="+channel+"&max_behot_time="+time.getTime()+"&offset=0&category=pc_profile_channel&client_extra_params=%7B%22short_video_item%22:%22filter%22%7D&aid=24&app_name=toutiao_web"
        var sig = window.byted_acrawler.sign({url:str})
       
        var url = str+"&_signature="+sig;
        document.getElementById("sigUrl").innerText = url
        console.log(url);
    }

    getSSSS();

    setInterval(function(){
        getSSSS();
    },30000)

</script>
</html>

 html文件运行结果:

2. 使用selenium获取js脚本生成的url

Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。

因为js运行依靠window浏览器对象,所以Python无法直接运行js代码获取加密之后的url,这里我使用selenium运行浏览器,打开生成url的html文件,获取加密处理后的url

pip安装selenium

pip install selenium

 主要代码:

# 浏览器自动化工具
from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建一个浏览器实例
browser = webdriver.Firefox()

# 获取请求地址
browser.get("file:///E:/studyproject/python/toutiao/getSig.html")

# 自动化获取js代码计算的sig数据值
sigTag = browser.find_element(By.ID,"sigUrl")
url = sigTag.text

通过上面代码获取到请求的url了

3. 使用requests根据列表url获取文章列表数据

Requests是Python的一个第三方库,用于发送HTTP请求。Requests库可用于爬取数据、与API交互、测试Web服务等。Requests库的作用主要是向Web服务器发送请求,并获取响应结果。发送的请求可以是GET、POST、PUT、DELETE、HEAD、OPTIONS等HTTP方法,同时还可以设置请求参数、请求头、请求体、代理、超时时间等。获取的响应结果包含HTTP状态码、HTTP响应头、HTTP响应内容等信息,同时支持自动解析JSON格式的响应内容。

使用pip安装requests,请求刚才获取的url列表地址,设置请求头的cookie,否则每次请求连接返回的数据都是相同的

pip安装requests工具包

pip install requests

主要代码: 

# 网络请求工具
import requests

headers = {
         # 设置User-Agent,模拟浏览器发送请求
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
        # 设置Cookie,用于身份验证或其他需要的信息
        'Cookie': '__ac_signature=_02B4Z6wo00f01Lz3yHgAAIDB3.0IExdN.9i818zAAEpR33;tt_webid=7309719685489198604;ttcid=fb73866ceb7a44cdb848344abfc11b6364;s_v_web_id=verify_lpur8vrr_aKDsfWBn_AThk_4UlU_8RpK_Ci9lGCzIBKbb; _ga=GA1.1.1051493470.1701926754; local_city_cache=%E4%B8%B4%E6%B2%82; csrftoken=4561fa578aa7c7bc7d3ac8f87ac7fad1; __feed_out_channel_key=entertainment; passport_csrf_token=a296ea89de4f632e00534cd16812d593; passport_csrf_token_default=a296ea89de4f632e00534cd16812d593; msToken=Lhx7DAYTtQJiiCVIVmYNqtpQkUVKq8RzEzhUZAslgKw_w5gJ_vSlmCJKsQoQUyXXoJzHhluRQFpfceUoT2n2IoACypVJ-aD7RCuXC7iI; tt_scid=0lfkb7lPohYDsWmjDuFAe7L3oLDo0KsbKzlhKzl1CQ2im2TQypCzPCKr.jkBHxexd641; ttwid=1%7CVPO9aK7JwsvyYUFWA3MR5i_pw1b4nic0TD5-jp-zjVc%7C1702450449%7C067c9bd8be4c0a21dc4e60bc225ee29072184eeb24503d5d6cc26b9554d20d26; _ga_QEHZPBE5HH=GS1.1.1702455638.13.0.1702455638.0.0.0.0.0'
    }

# 请求接口获取json数据
res = requests.get(url,headers=headers)

上述代码中User-Agent和Cookit直接在浏览器请求接口中获取就行。

4. 使用json工具包,解析文章列数据

python可以通过json库,解析字符串或文件中的内容转为json字符串或python的字典或列表

获取返回的json数据,解析json数据,保留阅读量、点赞量等较高的文章信息。

# JSON解析工具
import json

# 请求接口获取json数据
res = requests.get(url,headers=headers)
json_obj = json.loads(res.text)


 # 通过遍历每条数据,过滤热门文章
for item in json_obj['data']:

    # 计算文章分享数量
    shareCount = item['share_info']['share_type']['pyq']+item['share_info']['share_type']['qq']+item['share_info']['share_type']['qzone']+item['share_info']['share_type']['wx']

    # 判断文章路径是否是站内文章路径
    if re.match(matchTemplate,item['article_url']):
       # 多条件判断是否是较新的热门文章
       if item['read_count'] >= 3000:
              

5. 使用pymysql工具包,将爬取的数据保存到MySQL数据库 

pymysql是从Python连接到MySQL数据库服务器的接口, 简单理解就是,Pymysql是python操作mysql数据库的三方模块。就是可以理解为可以在python中连接数据库写MySQL命令,实现的 MySQL 客户端操作库,支持事务、存储过程、批量执行等。 

pip安装pymysql

pip install pymysql

主要代码:

# 数据库链接工具
import pymysql

#链接MySQL
mysqlCon = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123456",
    database="toutiao"
)

# 通过遍历每条数据,过滤热门文章
    for item in json_obj['data']:

        # 计算文章分享数量
        shareCount = item['share_info']['share_type']['pyq']+item['share_info']['share_type']['qq']+item['share_info']['share_type']['qzone']+item['share_info']['share_type']['wx']

        imageList = ""
        
        # 判断文章路径是否是站内文章路径
        if re.match(matchTemplate,item['article_url']):
            # 多条件判断是否是较新的热门文章
            if item['read_count'] >= 3000:
                # 创建游标对象
                cursor = mysqlCon.cursor()
                # 执行 SQL 查询语句
                cursor.execute("select * from happy where item_id ="+item['item_id'])
                # 获取查询结果
                result = cursor.fetchall()
                
                # 判断是否已经插入
                if len(result) == 0:
                    # 将热门文章保存到数据库
                    sql = "insert into happy (id,item_id,title,abstract,publish_time,like_count,read_count,comment_count,share_count,image_list,article_url,gather_time,transport_time,source) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                    values = (None,item['item_id'],item['title'],item['Abstract'],item['publish_time'],item['like_count'],item['read_count'],item['comment_count'],shareCount,imageList,item['article_url'],time(),0,"toutiao")
                    cursor.execute(sql,values)
                    mysqlCon.commit()
                else:
                    print("已经存在")

6. 根据数据库爬取的热门文章列表,爬取文章文本和图片信息

今日头条对做了反爬虫处理,直接使用requests请求网页无法获取文章内容,所以只能使用selenium来模拟浏览器浏览网页内容通过上面获取的热门文章id,拼接 url地址从而获取文章内容

主要代码:

# 浏览器自动化工具
from selenium import webdriver
from selenium.webdriver.common.by import By
 
# MySQL数据库链接工具
import pymysql
# 文件操作类
import os
# 时间类
from time import sleep
 
from docx import Document
import pypandoc
 
#链接MySQL
mysqlCon = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123456",
    database="toutiao"
)
 
 
 
while True:
    cursor = mysqlCon.cursor()
    # 执行 SQL 查询语句
    cursor.execute("select id,item_id,article_url,title from happy where state = 0 order by read_count asc limit 0,1")
    # 获取查询结果
    result = cursor.fetchall()
 
    sql = "update happy set state = 1 where id = %s"
    id = result[0][0]
    cursor.execute(sql,id)
    mysqlCon.commit()
 
 
    articleId = result[0][1]
    articleTitle = result[0][3]
    # articleId = "7279996073686123068"
 
    # 通过查询列表获取未发布的热门文章信息,根据获取的文章URL 打开URL链接地址
    # articleId = "7291869777788666407"
    # 创建一个浏览器实例
    browser = webdriver.Firefox()
    # # 获取请求地址
    browser.get("https://toutiao.com/group/"+articleId)
 
    sleep(30)
 
    # 根据元素名称获取元素内容
    textContainer = browser.find_element(By.CLASS_NAME,"syl-article-base")
    articleHtml = textContainer.get_attribute("innerHTML")
 
    # 根据解析的HTML内容,获取文章文本信息和图片信息,并将文本信息和图片保存到Word文档中
    # file = open("E:\\studyproject\\python\\toutiao\data\\"+articleId+"\\"+articleId+".html", "r",encoding='utf-8')
    os.mkdir("E:\\studyproject\\python\\toutiao\data\\happy\\"+articleId)
 
    output = pypandoc.convert_text(articleHtml, 'docx','html',outputfile="E:\\studyproject\\python\\toutiao\data\\happy\\"+articleId+"\\"+articleTitle+".docx")
 
 
 
    sleep(30)
    browser.quit()
 

 上述代码实现了,打开浏览器,获取浏览器标签和标签内内容,并将内容保存到word文档中。至此热门文章的爬取就实现了。

之后想用selenium实现自动登录,发布文章,这个时候我直接在头条平台中发布了我爬取的文章,两篇文章阅读量都在几K, 但是好景不长,文章是上午发布的,号是下午封的!!!nainai的,抄袭违规,因此只能暂时中断,下一步的计划是利用ChatGTP改写爬取的文章内容,然后再发布。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1342547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立容器 Rancher Server 证书过期解决

问题 Rancher无法登录 容器报错X509&#xff1a;certificate has expired or is not ye valid 在某天需要发布新版本的时候&#xff0c;发现rancher无法登录&#xff0c;于是到服务器上查看rancher日志&#xff0c;发现以下内容&#xff1a; docker logs -f rancher --since10…

Large-Precision Sign using PBS

参考文献&#xff1a; [CLOT21] Chillotti I, Ligier D, Orfila J B, et al. Improved programmable bootstrapping with larger precision and efficient arithmetic circuits for TFHE[C]//Advances in Cryptology–ASIACRYPT 2021: 27th International Conference on the T…

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

JavaSE基础50题:25. 查找数组中指定元素(顺序查找)

概述 给定一个数组&#xff0c;再给定一个元素&#xff0c;找出该元素在数组中的位置。 for循环遍历 【概述】 一个一个找&#xff0c;比较慢。 想要快一点的方法&#xff0c;可以使用二分查找&#xff0c;在后续《JavaSE基础50题》专栏中27题中详细讲解。 【代码】 public …

MySql篇——MySql使用常见问题及解决办法

这里汇总MySql使用常见问题及解决办法&#xff0c;会持续更新。 问题1.ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。 含义&#xff1a;你设置的密码不符合当前的密码等级。 可使用 SHOW VARIABLES LIKE validate_password%; 查看…

C#中的Attribute详解(上)

C#中的Attribute详解&#xff08;上&#xff09; 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute&#xff0c;为了区分这四类静态方法&#xff0c;我们只能通过注释来说明&#xff0c;但这样做会给系统带来很多…

计算机图形学光线追踪大作业C++基于Optix为框架实现的光线追踪算法合集,含直射光阴影效果、漫反射阴影效果、镜面反射效果等示例

MineRay 使用Optix为框架实现的光线追踪算法。 包含4个示例&#xff0c;直射光阴影效果、漫反射阴影效果、镜面反射效果、折射效果 环境需求 本项目在Windows 10中测试&#xff0c;以下环境为Windows中的环境 CUDA 10.1 OptiX 7 SDK cmake 编译方式 使用cmake编译 打开Mi…

分布式、CAP 和 BASE 理论

在计算机科学领域&#xff0c;分布式系统是一门极具挑战性的研究方向&#xff0c;也是互联网应用中必不可少的优化实践&#xff0c;而 CAP 理论和 BASE 理论则是分布式系统中的两个关键的概念。 什么是分布式系统 首先&#xff0c;让我们来谈谈分布式系统。你可以将分布式系统…

C++进阶--继承和多态常见题目

继承和多态常见题目 概念考查问答题 概念考查 下面哪种面向对象的方法可以让你变得富有( A) A: 继承   B: 封装   C: 多态   D: 抽象 这道题说哪种面向对象的方法可以让我们更富有&#xff0c;也就是东西更多&#xff0c;那么一定是继承无疑了&#xff0c;因为继承可以让…

ArcGIS高程点生成等高线

基本步骤&#xff1a;数据清洗→创建TIN→TIN转栅格→等值线→平滑线。 1.&#xff08;重要&#xff09;数据清理&#xff1a;删除高程点中的高程异常值数据。 2.创建TIN:系统工具→3D Analyst Tools→数据管理→TIN→创建TIN&#xff08;可直接搜索工具TIN&#xff09;。 单击…

移动机器人规划、控制算法初识

规划与控制PNC(PlanningandControl) 1 路径规划算法&#xff1a; 移动机器人路径规划算法总结_机器人运动轨迹算法-CSDN博客 2 控制算法&#xff1a; 机器人控制算法综述_机器人控制技术综述-CSDN博客 机器人控制算法简要概述_智能控制算法-CSDN博客 学习资源&#xff1a; …

VSCode 未装插件

EditorConfig for VS Code&#xff1a;自定义代码规范&#xff0c;按照自己指定的规则而不是编辑器默认的格式化。 ES7 React/Redux/React-Native snippets&#xff1a;款苏插入React代码片段。 Material Icon Theme&#xff1a;文件图标主题。 Prettier - Code formatte…

自然语言处理(第16课 机器翻译4、5/5)

一、学习目标 1.学习各种粒度的系统融合方法 2.学习两类译文评估标准 3.学习语音翻译和文本翻译的不同 4.学习语音翻译实现方法 二、系统融合 以一个最简单的例子来说明系统融合&#xff0c;就是相当于用多个翻译引擎得到不同的翻译结果&#xff0c;然后选择其中最好的作为…

在VMware安装CentOS 7:详细教程

安装准备工作 本地虚拟机&#xff1a;我这里使用的是VMware Workstation 17 Pro centos7系统ISO镜像&#xff1a;我这里使用的是CentOS-7-x86_64-DVD-2009.iso&#xff0c;具体的下载地址是在阿里云官方镜像站&#xff1a;centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿…

k8s的资源管理

命令行: kubectl命令行工具优点: 90%以上的场景都可以满足 对资源的增&#xff0c;删&#xff0c;查比较方便&#xff0c;对改不是很友好缺点:命令比较冗长&#xff0c;复杂难记 声明方式&#xff1a;k8s当中的yaml文件实现资源管理----声明式GUI:图形化工具的管理。 查看k8s的…

AIGC时代下,结合ChatGPT谈谈儿童教育

引言 都2024年了&#xff0c;谈到儿童教育&#xff0c;各位有什么新奇的想法嘛 我觉得第一要务&#xff0c;要注重习惯养成&#xff0c;我觉得聊习惯养成这件事情范围有点太大了&#xff0c;我想把习惯归纳于底层逻辑&#xff0c;我们大家都知道&#xff0c;在中国式教育下&a…

SAP缓存 表缓存( Table Buffering)

本文主要介绍SAP中的表缓存在查询数据&#xff0c;更新数据时的工作情况以及对应概念。 SAP表缓存的工作 查询数据 更新数据 删除数据 表缓存的概念 表缓存技术设置属性 不允许缓冲&#xff1a; 允许缓冲&#xff0c;但已关闭&#xff1a; 缓冲已激活&#xff1a; 已…

腾讯云价格计算器,一键计算精准报价,好用!

腾讯云价格计算器&#xff1a;可以计算腾讯云服务器不同CVM实例规格、CPU内存、公网带宽和系统盘费用明细表&#xff0c;可以一键计算出精准报价明细表&#xff0c;腾讯云服务器网txyfwq.com分享大家腾讯云服务器价格计算器入口链接、使用方法及限制说明&#xff1a; 腾讯云服…

KSO-SAP,ABAP创建远程RFC函数

文章目录 概要创建rfc函数创建函数修改函数处理类型小结 概要 &#xff08;这是创建rfc &#xff0c;远程调用rfc请到 KSO-SAP ABAP调用远程RFC函数详细过程&#xff09; SAP RFC&#xff08;Remote Function Call&#xff09;是一种用于处理系统间通信的协议&#xff0c;允…

融汇贯通 —— 2023年技术与心灵的双重成长旅程

当我们站在2023年的岁末&#xff0c;回望这一年赋予我们的经历和挑战&#xff0c;心中涌动的感慨与启示像朝日初升的光芒&#xff0c;照亮脚下的路&#xff0c;亦照见心中的路。在此&#xff0c;我想分享几个方面的感悟和成长&#xff0c;愿它们能有所触动&#xff0c;成为您前…