【Day 19】- 让 Selenium 去 Dcard 上爬文! (实战 Selenium 模拟使用者划手机 1/2)

前情提要

前一篇与大家介绍了 Selenium 的基本运用,并在补充资料中给予了语法的资源。

开始之前

今天要带各位写一只能够爬取 Dcard 上文章的爬虫,是透过 Selenium 去撰写。

预期效果

透过 Selenium 成功开启 Dcard 分页(浏览器分页)

用 Selenium 内建的锁定工具爬取目前的所有文章

将文章存於 JSON 档案中

实作

首先,先简单撰写一个 Selenium ,让 Selenium 去开 Dcard 网站 https://www.dcard.tw/f

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.dcard.tw/f')

接下来用开发工具观察一下文章元素是否有 class 让我们爬取。发现有 tgn9uw-0 bReysV 这个 class。

我们可以用 driver.find_elements_by_class_name 来定位该元素们,并用个 for-loop 将回传的 list 遍历过一遍後输出。

如果没有锁定到,有可能是还没有载入完成就爬取造成的,这时候我们能用 time 库里面的 sleep 来让整个程序暂停 0.5 秒让资源载入完成。

from selenium import webdriver
from time import sleep
if __name__ == '__main__':

    driver = webdriver.Chrome()
    driver.get('https://www.dcard.tw/f')

    sleep(2)
    eles = driver.find_elements_by_class_name('tgn9uw-0')
    for ele in eles:
        print(ele)
    driver.quit()

'''
<selenium.webdriver.remote.webelement.WebElement (session="753badfd9b587e097ab5e821cf9604eb", element="ee2da9f1-a5d0-41fc-80d7-63bf394e7267")>
<selenium.webdriver.remote.webelement.WebElement (session="753badfd9b587e097ab5e821cf9604eb", element="02573927-21b1-405c-9310-8a050aa6ec8f")>
<selenium.webdriver.remote.webelement.WebElement (session="753badfd9b587e097ab5e821cf9604eb", element="584200b4-5633-44f4-a048-e2bd3ebeb636")>
<selenium.webdriver.remote.webelement.WebElement (session="753badfd9b587e097ab5e821cf9604eb", element="aa05e5c6-defb-4087-84b3-a9d6dbe4131d")>
<selenium.webdriver.remote.webelement.WebElement (session="753badfd9b587e097ab5e821cf9604eb", element="85badbb3-7238-4b6e-9892-b7e71e8ac2f9")>
'''

将标题、连结、副标锁定後存到变数中。

from selenium import webdriver
from time import sleep
if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get('https://www.dcard.tw/f')
    sleep(2)
    eles = driver.find_elements_by_class_name('tgn9uw-0')
    for ele in eles:
        title = ele.find_element_by_class_name('tgn9uw-3').text
        href = ele.find_element_by_class_name('tgn9uw-3').get_attribute('href')
        subtitle = ele.find_element_by_class_name('tgn9uw-4').text
        print(title)
        print(href)
        print(subtitle)
    driver.quit()

将结果存於一个 dist 中,并 append 到总结果当中。

from selenium import webdriver
from time import sleep
if __name__ == '__main__':
    results = []
    driver = webdriver.Chrome()
    driver.get('https://www.dcard.tw/f')
    sleep(2)
    eles = driver.find_elements_by_class_name('tgn9uw-0')
    for ele in eles:
        result = {}
        title = ele.find_element_by_class_name('tgn9uw-3').text
        href = ele.find_element_by_class_name('tgn9uw-3').get_attribute('href')
        subtitle = ele.find_element_by_class_name('tgn9uw-4').text
        result = {
            'title': title,
            'href': href,
            'subtitle': subtitle
        }
        results.append(result)
    print(results)
    driver.quit()

接下来将结果存於 JSON 档案中。

from selenium import webdriver
from time import sleep
import json

if __name__ == '__main__':
    results = []
    driver = webdriver.Chrome()
    driver.get('https://www.dcard.tw/f')
    sleep(2)
    eles = driver.find_elements_by_class_name('tgn9uw-0')
    for ele in eles:
        result = {}
        title = ele.find_element_by_class_name('tgn9uw-3').text
        href = ele.find_element_by_class_name('tgn9uw-3').get_attribute('href')
        subtitle = ele.find_element_by_class_name('tgn9uw-4').text
        result = {
            'title': title,
            'href': href,
            'subtitle': subtitle
        }
        results.append(result)
    print(results)
    with open('Dcard-articles.json', 'w', encoding='utf-8') as f:
        json.dump(results, f, indent=2,
                  sort_keys=True, ensure_ascii=False)
    driver.quit()

结语

今天分析了文章的元素特徵,用了 Selenium 模拟使用者锁定所有文章的元素,之後操作锁定到的元素将其存在变数中,整理到一个字典,并塞入一个串列中,最後将串列存到 JSON 档案中。

明日内容

明天将用 Selenium 模拟使用者滚动页面(划手机 or 滚轮),并将文章爬取下来。

补充资料

Dcard : https://www.dcard.tw/f

Selenium with Python docs : https://selenium-python.readthedocs.io/

Selenium docs : https://readthedocs.org/projects/selenium-python/downloads/pdf/latest/


<<:  【Side Project】 订单清单 - 取得订单资讯

>>:  <Day19> Subscribe — 订阅及时Ticks逐笔成交资料

创建App-讨论区界面

踏入讨论区的界面,麻烦的事情开始出现啦,需要在每个主题上插入按键,再插入文字框来显示主题文字,况且跳...

Day 21 总要接受外部的刺激

人就像藤萝,他的生存靠别的东西支持,他拥抱别人,就从拥抱中得到了力量! 《iT邦帮忙铁人赛的观点》(...

Day24 Plugin 从零开始到上架 - FlutterPlugin与 MethodCallHandler

InstagramBasicDisplayApiPlugin class InstagramBasi...

[Day23] Flutter - Domain Error Handle (part7)

前言 Hi, 我是鱼板伯爵今天要把侦错的功能加上去,教学内容只会撷取片段程序码,建议大家搭配完整程序...

【day14】 Fab X 跳页Animation

好的! 我们今天主要要来设定Fab,以及跳页的动画! 1.先在我们的DashboardFragme...