前一篇与大家介绍了 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逐笔成交资料
踏入讨论区的界面,麻烦的事情开始出现啦,需要在每个主题上插入按键,再插入文字框来显示主题文字,况且跳...
人就像藤萝,他的生存靠别的东西支持,他拥抱别人,就从拥抱中得到了力量! 《iT邦帮忙铁人赛的观点》(...
InstagramBasicDisplayApiPlugin class InstagramBasi...
前言 Hi, 我是鱼板伯爵今天要把侦错的功能加上去,教学内容只会撷取片段程序码,建议大家搭配完整程序...
好的! 我们今天主要要来设定Fab,以及跳页的动画! 1.先在我们的DashboardFragme...