当前位置: 首页 > news >正文

selenium 爬取今日头条

由于今日头条网页是动态渲染,再加上各种token再验证,因此直接通过API接口获取数据难度很大,本文使用selenium来实现新闻内容爬取。

selenium核心代码

知识点:

  • 代码中加了很多的异常处理,保证错误后重试,提高稳定性
  • EdgeChromiumDriverManager().install()自动下载浏览器驱动,避免浏览器更新后驱动版本不对的问题
  • 使用driver.refresh()driver.close()driver.quit()防止占用内存过多
  • 使用--disable-extensions禁用插件,避免插件可能带来的影响
  • 使用--inprivate打开无痕模式,这里遇到一个很烦的问题,用户登录同步问题,无痕模式可以避免
    在这里插入图片描述
from webdriver_manager.microsoft import EdgeChromiumDriverManagerdef get_html_by_selenium(url):print("开始:", url)options = webdriver.EdgeOptions()# 启用'禁用浏览器正在被自动化程序控制的提示'启动参数options.add_experimental_option("excludeSwitches", ["enable-automation"])# 禁用插件options.add_argument("--disable-extensions")# 无痕模式options.add_argument('--inprivate')count = 0driver = Nonewhile count < 10:try:driver = webdriver.Edge(service=Service(executable_path=EdgeChromiumDriverManager().install()),options=options)# 最小化driver.minimize_window()time.sleep(1)driver.get(url)breakexcept WebDriverException as e:print(e)count += 1time.sleep(3)continueexcept ConnectionError as e:print(e)count += 1time.sleep(3)continueif driver is None:returntime.sleep(10)try:html = driver.page_source# 防止内存泄露driver.refresh()try:driver.close()except WebDriverException:passdriver.quit()return htmlexcept NoSuchWindowException:return

新闻列表解析代码

URL示例:

https://www.toutiao.com/c/user/token/MS4wLjABAAAA6Ftyf-tftfbjp1u_TEz6kpY77ZlPaYRV0UsfXkF2UsM/?tab=article

这里比较简单,拿到了新闻标题和url,HTML解析过程中可能遇到浏览器中渲染的html结构和真实请求到的html结构不一样,要以真实拿到的html内容为准

url = f"https://www.toutiao.com/c/user/token/{USER_TOKEN}/?tab=article"
html = get_html_by_selenium(url)
soup = BeautifulSoup(html, "html.parser")for article in soup.find_all("div", attrs={"class": "profile-article-card-wrapper"}):a = article.find("a")news_title = a["title"]url = a["href"]content, news_time = parse_and_save_news(url)

新闻内容解析代码

相对比较简单,忽略了图片的解析,最终获得新闻的内容和新闻时间

def parse_and_save_news(url):html = get_html_by_selenium(url)if not html:returnsoup = BeautifulSoup(html, "html.parser")article_content = soup.find("div", attrs={"class": "article-content"})if article_content is None:returnarticle_meta = soup.find("div", attrs={"class": "article-meta"})time_string = article_meta.find("span", attrs=None).textnews_time = datetime.strptime(time_string, "%Y-%m-%d %H:%M")article = article_content.articlenew_soup = BeautifulSoup("<html><body></body></html>", "html.parser")body = new_soup.bodyfor p in article.find_all("p"):body.append(BeautifulSoup(f"<p>{p.text}</p>", "html.parser"))content = new_soup.prettify()return content, news_time
http://www.lryc.cn/news/351302.html

相关文章:

  • docker 安装 yapi
  • 【AI如何帮你编写测试用例并输出表格格式】
  • 九宫格转圈圈抽奖活动,有加速,减速效果
  • 利用阿里OSS服务给文件设置过期删除--简单版
  • LabVIEW控制Trio控制器
  • 02--大数据Hadoop集群实战
  • 【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】
  • @DateTimeFormat 和 @JsonFormat 的区别和使用方式
  • C++—结构体
  • 指针与引用
  • 使用 mysql-binlog-connector 监听处理 MySQLBinlog 文件
  • CF Div2 729 Plus and Multiply
  • Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境
  • Python高克勒-曼宁-斯特里克勒公式计算一维流量
  • 【GD32系列--基本定时器Timer + 定时1ms 灯光间隔1s闪烁例程】
  • 第11章 集合与迭代器
  • 探索Linux中的神奇工具:探秘tail命令的妙用
  • 1688商品API接口:电商数据自动化的新引擎
  • 路由器不能端口映射什么原因?如何设置内网映射?
  • 开源RAG,本地mac启动 dify源码服务
  • 【Linux取经路】基于信号量和环形队列的生产消费者模型
  • 计算机SCI期刊,中科院2区,收稿范围非常广泛!
  • JDK、JRE、编译指令和垃圾回收机制详解
  • 【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】
  • 使用 LlamaParse 进行 PDF 解析并创建知识图谱
  • Oracle行迁移解析
  • 【k8s】 busybox镜像、挂载volume卷
  • 文本三剑客之 sed 编辑器
  • 【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并
  • Linux中安装配置并使用samba服务(Centos以及Ubuntu)