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

这篇具有很好参考价值的文章主要介绍了selenium爬虫——以爬取澎湃新闻某搜索结果为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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都可以直接复制

复制过程如下图所示,比自己写方便多了。
selenium爬虫——以爬取澎湃新闻某搜索结果为例,瞎搞,selenium,爬虫,测试工具

爬取多网页时记得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()

扩展

现将功能扩展如下:
(1)爬取分别以“反腐”,“从严治党”,“廉洁”,三个关键词搜索的文章内容并存储;
(2)只保留不重复的部分。
为实现该功能,需要一个字典,来判断该文章是否已经被搜索过:

dict={} #记录是否重复的字典
names=driver.find_elements(By.XPATH,x_path)
for name in names:
    if name.text not in dict:
        name_text.append(name.text)
        name_href.append(name.get_attribute("href"))
        num=num+1
        print(name.text)
        print(name.get_attribute("href"))
        dict[name.text]=1

另外发现,爬取过程中可能出现某网址已经失效的情况,在这种情况下需要跳过,否则程序也会因执行不下去而异常结束,此处使用try-except处理:

try:
    address=name_href[i]
    driver.get(address)
except:
    print("网址失效")

扩展之后的程序如下:

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():
    search_word=['反腐','从严治党','廉洁']
    search_word_len=search_word.__len__()
    dict={} #记录是否重复的字典
    num = -1    #记录标题数
    search_word_num=0   #搜索到第几个词
    name_text = []
    name_href = []
    for word in search_word:
        search_word_num=search_word_num+1
        driver = webdriver.Edge()
        driver.get("https://www.thepaper.cn/")
        time.sleep(1)
        search=driver.find_element(By.TAG_NAME,'input')
        #print(word)
        search.send_keys(word)
        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)
        for name in names:
            if name.text not in dict:
                name_text.append(name.text)
                name_href.append(name.get_attribute("href"))
                num=num+1
                print(name.text)
                print(name.get_attribute("href"))
                dict[name.text]=1
        if search_word_num == search_word_len:

            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])
                try:
                    address=name_href[i]
                    driver.get(address)
                except:
                    print("网址失效")
                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')
        else:
            driver.close()
    print(dict.keys())
if __name__=='__main__':
    main()

爬取效果

word共2203页324万字
selenium爬虫——以爬取澎湃新闻某搜索结果为例,瞎搞,selenium,爬虫,测试工具
excel共1768行(1767个文章标题,第一行为表头)
selenium爬虫——以爬取澎湃新闻某搜索结果为例,瞎搞,selenium,爬虫,测试工具文章来源地址https://www.toymoban.com/news/detail-741229.html

到了这里,关于selenium爬虫——以爬取澎湃新闻某搜索结果为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【爬虫实战】用python爬取微博任意关键词搜索结果、exe文件

    项目功能简介: 1.交互式配置; 2.两种任意来源(直接输入、本地文件); 3.自动翻页(无限爬取); 4.指定最大翻页页码; 5.数据保存到csv文件; 6.程序支持打包成exe文件; 7.项目操作说明文档; 一.最终效果 视频演示: 用python爬取微博搜索结果、exe文件

    2024年02月02日
    浏览(66)
  • (已解决)关键词爬取百度搜索结果,返回百度安全验证,网络不给力,请稍后重试,无法请求到正确数据的问题

    已解决,使用进行百度搜索,然后爬取搜索结果,请求数据后,返回的是百度安全验证,网络不给力,请稍后重试。无法请求到正确数据。且尝试在header中增加Accept参数还是不行。      在学习过程中,写了一小段练习用的爬取程序,获取百度搜索后的结果,代

    2024年02月08日
    浏览(62)
  • (已解决)关键词爬取百度搜索结果,返回百度安全验证,网络不给力,请稍后重试,无法请求到正确数据的问题(2023最新)

    已解决,使用进行百度搜索,然后爬取搜索结果,请求数据后,返回的是百度安全验证,网络不给力,请稍后重试。无法请求到正确数据。且尝试在header中增加Accept参数还是不行。      在学习过程中,写了一小段练习用的爬取程序,获取百度搜索后的结果,代

    2024年02月17日
    浏览(39)
  • 爬虫机试题-爬取新闻网站

    之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求,感觉挺有意思就写了这篇文章,感兴趣的朋友可以看看。 通过分析页面结构我们得以知道,这个页面本身没有新闻信息,是由js代码执行后才将信息插入到html中的,因

    2024年04月25日
    浏览(35)
  • Python爬虫实战——爬取新闻数据(简单的深度爬虫)

            又到了爬新闻的环节(好像学爬虫都要去爬爬新闻,没办法谁让新闻一般都很好爬呢XD,拿来练练手),只作为技术分享,这一次要的数据是分在了两个界面,所以试一下深度爬虫,不过是很简单的。  网页url 1.先看看网站网址的规律  发现这部分就是每一天的新闻

    2024年02月11日
    浏览(42)
  • python爬虫实战(1)--爬取新闻数据

    想要每天看到新闻数据又不想占用太多时间去整理,萌生自己抓取新闻网站的想法。 使用python语言可以快速实现,调用 BeautifulSoup 包里面的方法 安装BeautifulSoup 完成以后引入项目 定义请求头,方便把请求包装成正常的用户请求,防止被拒绝 定义被抓取的url,并请求加上请求

    2024年02月13日
    浏览(54)
  • selenium-java web自动化测试工具抓取百度搜索结果实例

     🔥 交流讨论: 欢迎加入我们一起学习! 🔥 资源分享 : 耗时200+小时精选的「软件测试」资料包 🔥  教程推荐: 火遍全网的《软件测试》教程   📢 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! selenium-java web自动化测试工具抓取百度搜索结果实例 这种方式抓百度

    2024年03月14日
    浏览(63)
  • 澎湃新闻对话腾讯丁珂:从“治已病”到“治未病”,企业需快速构建“安全免疫力”

    作者:澎湃新闻记者 周頔 随着数字化进程加快,企业数字化体系的边界在不断拓展,安全风险和挑战不断增加,传统被动防御的安全应对常显疲态,数字安全时代亟待建立全新的安全范式。 6月13日,腾讯安全联合IDC等多家机构在北京举办研讨论坛,并发布“数字安全免疫力

    2024年02月11日
    浏览(37)
  • 【爬虫】5.5 Selenium 爬取Ajax网页数据

    目录   AJAX 简介 任务目标 创建Ajax网站 创建服务器程序 编写爬虫程序         AJAX(Asynchronous JavaScript And XML,异步 JavaScript 及 XML) Asynchronous 一种创建 交互式 、 快速动态 网页应用的网页开发技术 通过在后台与服务器进行少量数据交换,无需重新加载整个网页的情况下

    2024年02月10日
    浏览(43)
  • selenium爬虫框架爬取某壁纸网站

    基础知识 环境配置 开始爬虫 简单分析目标网站 写函数 获取浏览器对象: 下载每一张图片: 获取每一页的源代码: 运行print_result_every_page python基础语法 面向对象基础 html基础 xpath基础 selenium框架的基本使用 request库 lxml库      3.安装浏览器xpath插件         打开谷歌浏览

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包