大学关系很好的老师想获取新闻中带“气候变化”关键词的新闻个数,用于论文写作。
在空余时间研究了一下,解决了许多小bug后终于实现啦。
具体的实施步骤是:明确爬取目标网站——明确爬取关键词——单页新闻标题获取——批量新闻标题获取——把新闻标题存到list中统计数量。
本文以北京的千龙网为例进行说明,希望代码能帮到更多有需要的小伙伴。
一、导入库
首先导入需要用到的库,具体如下:
import time
import random
from captcha import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import wait
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
如有未安装库的小伙伴,自行百度安装一下。
二、定义爬取的目标网站和关键词
应用selenium进行数据爬取时,最头疼的是很多时候都会提示Chrome版本不匹配报错,需要重新下载对应版本。
本文应用代码直接安装Chrome,可以避免上述情况。
接着登录北京的千龙网,输入关键词进行查询,具体代码如下:
browser = webdriver.Chrome(ChromeDriverManager().install())
#安装chrome
browser.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&pos=12&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 = 1 while 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 += 1 print(title_list) 得到结果:
打印一下标题数量,代码如下: len(title_list) 得到结果: 273 由于每天都会更新新闻,故得到的标题会动态变化,具体和跑代码的时间有关。 至此,应用Python批量爬取网站上“气候变化”关键词新闻个数已讲解完毕,如想了解更多Python中的函数,可以翻看公众号中“学习Python”模块相关文章。