【保姆级教程】爬取网站上“气候变化”关键词新闻个数

文摘   教育   2024-05-05 11:39   广东  
大学关系很好的老师想获取新闻中带“气候变化”关键词的新闻个数,用于论文写作。
在空余时间研究了一下,解决了许多小bug后终于实现啦。

具体的实施步骤是:明确爬取目标网站——明确爬取关键词——单页新闻标题获取——批量新闻标题获取——把新闻标题存到list中统计数量。

本文以北京的千龙网为例进行说明,希望代码能帮到更多有需要的小伙伴。

本文目录
  1. 导入库

  2. 定义爬取的目标网站和关键词

  3. 获取单页新闻标题并点击下一页

  4. 批量获取所有标题


一、导入库

首先导入需要用到的库,具体如下

import timeimport randomfrom captcha import * from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import waitfrom selenium.webdriver.common.keys import Keysfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitfrom webdriver_manager.chrome import ChromeDriverManagerfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.support import expected_conditions as EC
如有未安装库的小伙伴,自行百度安装一下。


二、定义爬取的目标网站和关键词
应用selenium进行数据爬取时,最头疼的是很多时候都会提示Chrome版本不匹配报错,需要重新下载对应版本。
本文应用代码直接安装Chrome,可以避免上述情况。
接着登录北京的千龙网,输入关键词进行查询,具体代码如下
browser = webdriver.Chrome(ChromeDriverManager().install())#安装chromebrowser.maximize_window()#最大化窗口login_url = 'https://www.chinaso.com/'#网址browser.get(login_url)#登录网址input_name = browser.find_element_by_xpath('//*[@id="q"]')input_name.send_keys('气候变化')browser.find_element_by_xpath('//*[@id="flpage"]/div/input').click()#输入关键词并查询
登录并搜索“气候变化”关键词可看到如下页面:


三、获取单页新闻标题并点击下一页

接着点击浏览器中右上角红框中的三个点——点击更多工具——点击开发者工具来到开发者界面,具体如下:

如果想快捷进入该界面,可直接键盘按Ctrl+Shift+I即可。
接着想办法获取该界面的所有标题。
点击下图右上角红框中的箭头,把鼠标移动到左边红框中的标题上并点击,即可获取填到代码中的信息。

本来想通过Xpath的方式获取所有标题,但找规律时发现每个标题的Xpath路径存在混乱的情况。

故通过copy element看看有没有其他方法获取标题,复制后得到的信息如下:

<a href="https://www.chinaso.com/link?url=UOLknXBiUMJw5yewhSYbC1Hc1arTtsWoWs2OR1iC2Rbf5iygxfGCQddd6S79O%2BzWnlUck9v5htyUtQc4szfUlA%3D%3D&amp;pos=12&amp;wd=%E6%B0%94%E5%80%99%E5%8F%98%E5%8C%96" target="_blank" rel="noreferrer noopener" class="common-title">刘世锦:应对<em>气候变化</em>、实现碳中和的长期目标不能动摇或后退</a>

可以发现,通过find elements by class name的方式可以实现,具体代码如下:

text_list = browser.find_elements_by_class_name("common-title")for i in range(len(text_list)):    title_list.append(text_list[i].text)    #获取标题    print(text_list[i].text)

得到结果:

气候变化·百科资料世界气象组织报告:2023年气候变化和极端天气重创亚洲国际劳工组织:警惕气候变化危害劳动者健康为应对气候变化提供有力科技支撑南非议会上院通过《气候变化法案》中国气候变化领导力名单发布 助力可持续经济发展欧盟气候变化监测机构:今年3月全球气温创历史新高看宁夏农业 伊拉克气候变化和农业可持续发展研修班来宁研修考察新研究预测气候变化或将影响全球计时联合国:气候变化危及全球超过70%的劳动者健康中国新能源产品出口为应对气候变化作出积极贡献中国新能源产品出口为应对全球气候变化作出积极贡献(聚焦博鳌)聚焦气候变化,博鳌嘉宾呼吁加强国际合作刘世锦:应对气候变化、实现碳中和的长期目标不能动摇或后退去年全球多项气候变化指标创纪录 多国呼吁加快行动新研究预测气候变化可能导致蜜蜂数量下降

这时获取到了单页的所有标题,要想获取全量标题,需跳转到所有页面进行信息获取。

从浏览器中可以发现,可以通过点击下一页的方式获取所有页面信息,具体代码如下:

time.sleep(5)browser.implicitly_wait(5)browser.find_element_by_class_name('btn-next').click()#点击下一页


四、批量获取所有标题
最后写循环获取所有标题。
上文中介绍了获取单页标题和点击下一页的代码,所以获取全量标题的关键是:控制循环在获取到所有页面信息时自动退出。
要想实现该功能,可在代码中应用try函数,如果点击下一页没有报错,说明循环还未结束,如果报错,即到了最后一页,用break函数退出循环即可。
具体代码如下:
title_list = []num = 1while True:    text_list = browser.find_elements_by_class_name("common-title")    for i in range(len(text_list)):        title_list.append(text_list[i].text)        #获取标题        #print(text_list[i].text)    try:        time.sleep(5)        browser.implicitly_wait(5)        browser.find_element_by_class_name('btn-next').click()        #点击下一页      except:        print(num)        break    num += 1print(title_list)
得到结果:

打印一下标题数量,代码如下:
len(title_list)
得到结果:
273
由于每天都会更新新闻,故得到的标题会动态变化,具体和跑代码的时间有关。
至此,应用Python批量爬取网站上“气候变化”关键词新闻个数已讲解完毕,如想了解更多Python中的函数,可以翻看公众号中“学习Python”模块相关文章。

【部分群限时免费进分群讨论学习Python、玩转Python、风控建模【29.9元进】、人工智能、数据分析相关问题,还提供练习数据资料招聘推信息、优秀文章、学习视频、公众号文章答疑,也可交流工作中遇到的难题。如需添加微信号19967879837,加时备注想进的群,比如学习python。

往期回顾:
Python批量爬虫下载PDF文件代码实现

一文囊括Python中的函数,持续更新。。。

一文囊括Python中的有趣案例,持续更新。。。

【python爬虫】批量识别pdf中的英文,自动翻译成中文下

【Python】【爬虫】最近想买电脑,用Python爬取京东评论做个参考



限时免费进群

19967879837

添加微信号、手机号

阿黎逸阳的代码
阿黎逸阳,分享大数据和人工智能领域知识,提供风控建模干货经验。 博主履历:世界五百强公司、互联网上市公司、高校、外资银行,多年研究大数据分析、建模以及教学工作。
 最新文章