Python使用Selenium动态爬取CSDN社区帖子的URL链接

前几天读了一篇CSDN社区的帖子,发现文章内容写得极好,值得借鉴学习。于是我想将那个社区的帖子都爬下来,但是那个社区发布的贴子挺多的,一直往下拉才到2022年5月的发布。于是我就只将5月份之前的爬下来就行,但是帖子是动态加载的,需要用Selenium来模拟用户下拉。但如何比较日期呢?我首先想的是匹配,输入一个字符串为'2022-05-21'的参数,然后抓取每一个最新加载出来的帖子的日期,用来和我的参数进行比较,如果等于的话就不再模拟下拉。但是发现它却继续下拉到四月份的了,原因很简单,5月21号那天没有人发帖子。于是我就只能将参数的类型转换,用日期date类型,这在python中是可以比较大小的。

Python 的 datetime 模块提供了方便的功能来处理日期和时间,包括日期的比较。下面是一个简单的示例,展示如何比较两个日期。在这个例子中,我们使用 datetime.strptime 方法将字符串转换为 datetime 对象,然后可以直接比较这两个对象。

复制代码
from datetime import datetime
# 定义两个日期
date1 = datetime.strptime('2022-05-01', '%Y-%m-%d')
date2 = datetime.strptime('2023-05-01', '%Y-%m-%d')

# 比较日期
if date1 < date2:
    print("date1 在 date2 之前")
elif date1 > date2:
    print("date1 在 date2 之后")
else:
    print("date1 和 date2 是同一天")

注意CSDN社区帖子的页面有三个可以拉动的div容器,我们要抓取的帖子在第二个div容器里,这个div容器用body标签是滚动不了的,所以我写了一篇解决body标签无法滚动的文章。以下程序我将抓取的URL地址打印在屏幕上了,如果感兴趣大家可以自行输出到文件或数据库的表中。

完整代码:

复制代码
import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://bbs.csdn.net/forums/se-learning?category=10001'

driver  = webdriver.Edge()
driver.get(url)
# 目标日期
date = datetime.strptime('2022-05-01', '%Y-%m-%d')
def scroll_to_bottom(driver,date):
    
    SCROLL_PAUSE_TIME = 1

    scrollable_div = driver.find_elements(By.CSS_SELECTOR, 'div.__panel')[1]  # 选择第二个可滚动的div容器
    date1 = datetime.strptime('2022-07-01', '%Y-%m-%d')  # 随便选个日期,比目标日期大就行
    while date1 > date:
        driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scrollable_div)
        divs = driver.find_elements(By.CLASS_NAME, 'tab-list-item')
        div = divs[-1]
        time.sleep(SCROLL_PAUSE_TIME)
        date1 = div.find_element(By.CSS_SELECTOR, 'span.cop-p.time').text
        date1 = datetime.strptime(date1, '%Y-%m-%d')  # 数据类型可变,从字符串到日期类型
        time.sleep(SCROLL_PAUSE_TIME)
    return divs

divs = scroll_to_bottom(driver,date)
for div in divs:
    tag = div.find_element(By.CLASS_NAME,'content')
    url = tag.find_element(By.TAG_NAME,'a').get_attribute('href')
    print(url)

如果有需要,还可以使用以下方法对Edge进行初始化,这样就不会打开浏览器界面。

from selenium.webdriver.edge.options import Options as EdgeOptions

配置 Edge 浏览器选项,如果不需要打开浏览器界面,可以使用无头模式

edge_options = EdgeOptions()

edge_options.use_chromium = True

edge_options.add_argument('--disable-gpu')

edge_options.add_argument('--headless')

初始化 Edge 浏览器

driver = webdriver.Edge(options=edge_options)

相关推荐
DevilSeagull4 小时前
电脑上安装的服务会自动消失? 推荐项目: localhostSCmanager. 更好管理你的服务!
测试工具·安全·react·vite·localhost·hono·trpc
Python大数据分析@9 小时前
浏览器自动化工具 Selenium,Playwright,Puppeteer 做爬虫有哪些弊病?
爬虫·selenium·自动化
剑神一笑10 小时前
从零开始理解 robots.txt:搜索引擎爬虫的“门禁系统“
爬虫·搜索引擎
弹简特12 小时前
【精通Postman接口测试】01-基础理论+安装使用+项目实战+接口关联(万字图文,零基础保姆级)
测试工具·postman·接口关联
武帝为此1 天前
【Selenium 屏幕截图】
python·selenium·测试工具
捉鸭子1 天前
某音a_bogus vmp逆向
爬虫·python·web安全·node.js·js
武帝为此1 天前
【Selenium 执行 JavaScript】
javascript·selenium·测试工具
llilian_161 天前
晶体频率测试仪 破解晶振品控核心难题:晶体频率网络测试仪深度解析 晶体网络分析仪
网络·功能测试·单片机·嵌入式硬件·测试工具·51单片机
深念Y1 天前
从 Playwright/Selenium 到指纹浏览器:浏览器自动化技术的进阶之路
selenium·测试工具·自动化·浏览器·账号·无头浏览器·指纹浏览器
Johnstons2 天前
Wireshark ExpertInfo是什么?一文讲透异常分级、适用场景、和传统抓包阅读的区别与排查标准
网络·测试工具·wireshark·es