Day 20:专案04 - Facebook爬虫01 | ChromeDriver、Selenium

图片来源:https://unsplash.com/photos/m_HRfLhgABo

安安,今天是第20天了哦,离结束只剩最後1/3了,感觉时间过得真快呢~ 而且今天又是新的专案了哦! 这次要教的是我自己觉得非常有趣的Selenium,让你的爬虫技巧再多一招!

前几天爬PTT八卦板的时候,都是先用requests套件取得网页的原始码再做分析,这样的方法之所以成立,是因为PTT八卦板是属於静态网页,意思是网页画面一次就全部渲染好了,之後不会再有更动。但有些网站不是这样(尤其是新的网站),比方说以Facebook为例,为了载入的效能,Facebook不会一口气就将所有的贴文都显示出来,而是你滚轮往下滑时,贴文才会一个个载入,这种网站就称之为动态网页

这下子前面教的方法就不管用了阿,没错,所以这时就出现了新的方法 -- Selenium

Selenium

Selenium 是用於自动化 Web 浏览器的工具,可以协助测试人员做自动化测试,也是可以抓网页内容的动态网页爬虫,常搭配 BeautifulSoup 解析 HTML 网页原始码。

换句话说,Selenium可以透过指令,模拟出使用者浏览网页的行为,包括:点击按钮、输入文字、滑动滚轮等。

Selenium主要有三项产品,分别是WebDriver、IDE和Grid,我们要用WebDriver来完成自动化的控制。

Selenium IDE也是满方便的工具,用於录制网页脚本,并提供回放功能,但我没有实际用过,有兴趣的人可以研究看看。

因为Anaconda预设没有Selenium套件,所以要先下载。

pip install selenium

WebDriver

为了让Selenium可以自动化控制浏览器,我们必须先安装浏览器的驱动程序(driver),这里提供两种方式,选一个自己习惯的方式就好。

我都以Chrome浏览器为例,其他浏览器麻烦自己Google找一下 ?。

自己下载

  1. 首先,到Chrome设定>>关於Chrome,记住自己的版本号码。

  1. 这里下载正确版本的ChromeDriver,只要版本开头的数字相同就好。

  1. 选择你的作业系统(Window只有32bits的版本,但也不影响使用)。

  1. 下载完後解压缩,将chromedriver.exe移到与程序相同的目录下。
  2. Python程序码。
from selenium import webdriver
import time

# 开启下载的chromedriver
driver = webdriver.Chrome("./chromedriver")

# 等待10秒
time.sleep(10)
# 关闭浏览器
driver.quit()
  1. 执行後如果出现这个画面,并显示"受到自动测试软件控制",就是成功了。

webdriver_manager自动下载

  1. 我们要用webdriver_manager这个套件,但Anaconda预设也没有,所以要先下载。
pip install webdriver-manager
  1. Python程序码
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

# 使用ChromeDriverManager自动下载chromedriver
driver = webdriver.Chrome(ChromeDriverManager().install())

# 等待10秒
time.sleep(10)
# 关闭浏览器
driver.quit()
  1. 成功後的结果和第一种是一样的。

webdriver_manager的优点在於它会自动根据你的Chrome下载正确的版本,就不必担心版本的问题了。两种方法大同小异,但我个人比较喜欢用第二种就是了。

登入Facebook

下一步就是要登入Facebook,还记得我说过爬虫就是要模拟真人的行为吗? 想想看我们平常登入的流程是怎样?

  1. 到脸书登入页
  2. 输入帐号、密码
  3. 按登入按钮

所以,我们只要让程序做一样的事就好了!

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

# 你的资讯
url = "https://www.facebook.com/"
email = "YOUR EMAIL"
password = "YOUT PASSWORD"

# 使用ChromeDriverManager自动下载chromedriver
driver = webdriver.Chrome(
    ChromeDriverManager().install())

# 最大化视窗
driver.maximize_window()
# 进入Facebook登入画面
driver.get(url)

# 填入帐号密码,并送出
driver.find_element_by_id("email").send_keys(email)
driver.find_element_by_id("pass").send_keys(password)
driver.find_element_by_name("login").click()

# 等待10秒
time.sleep(10)
# 关闭浏览器
driver.quit()

我来解释一下为何要这样写:

先用 get(URL) 进到Facebook登入画面,因为帐号和密码的输入框的id分别是"email"和"pass",所以用find_element_by_id()定位後,再用send_keys()模拟使用者输入帐密。

登入按钮的name属性为login,定位後再用click()模拟使用者点击。

但你可能会发现登入後会跳出一个通知,这会害你没办法做後续的爬虫,前面的部分加上以下的设定後,就不会再跳通知了。

# 防止跳出通知
chrome_options = webdriver.ChromeOptions()
prefs = {
    "profile.default_content_setting_values.notifications": 2
}
chrome_options.add_experimental_option("prefs", prefs)

# 使用ChromeDriverManager自动下载chromedriver
driver = webdriver.Chrome(
    ChromeDriverManager().install(), chrome_options=chrome_options)

小结

今天教了怎麽使用Selenium这个套件模拟使用者的行为,以及两种WebDriver的下载方式,最後利用这些技巧让浏览器自动登入Facebook。明天一样是Selenium的教学,就来讲怎麽爬取每篇贴文的标题吧!


如果喜欢这系列文章麻烦帮我按Like加订阅,你的支持是我创作最大的动力~

本系列文章以及范例程序码都同步更新在GitHub上,後续会持续的更新,如果喜欢也麻烦帮我按个星星吧~

有任何问题或建议,都欢迎在底下留言区提出,还请大家多多指教。


<<:  Day-14 线性时间演算法 : Radix sort

>>:  day 17 - 利用 interface 来mock外部回应

当心已死前,来看看这篇吧!

撰写这篇时,其实心情已经平复了不少 从 2014 年加入新创团队至今也超过七年了,过程中从未有过长假...

【D5】取得厨房钥匙:下载凭证

前言 当我们已经可以进入shioaji这个厨房,却发现用来烹饪的厨具都锁在架上,我们只能用一些简单的...

[Day27] - Django-REST-Framework API 期末专案实作 (二)

接续昨天的专案,创建好负责管理资料库的 model 之後,接着我们今天要来建立 Serializer...

Day12: 【TypeScript 学起来】只有 TS 才有的型别: Literal Types(字面值型别) / Tuple (元组)

工程师A: 觉得当工程师好累 想换一行怎麽办 工程师B: 按一下 enter 啊 工程师A:......

[Day11] 文本/词表示方式(二)-BOW与TFIDF

一. BOW BOW的全名为Bag-of-words,中文是'一袋文字',意思就是将词都丢进一个袋子...