安安,今天是第20天了哦,离结束只剩最後1/3了,感觉时间过得真快呢~ 而且今天又是新的专案了哦! 这次要教的是我自己觉得非常有趣的Selenium,让你的爬虫技巧再多一招!
前几天爬PTT八卦板的时候,都是先用requests套件取得网页的原始码再做分析,这样的方法之所以成立,是因为PTT八卦板是属於静态网页,意思是网页画面一次就全部渲染好了,之後不会再有更动。但有些网站不是这样(尤其是新的网站),比方说以Facebook为例,为了载入的效能,Facebook不会一口气就将所有的贴文都显示出来,而是你滚轮往下滑时,贴文才会一个个载入,这种网站就称之为动态网页。
这下子前面教的方法就不管用了阿,没错,所以这时就出现了新的方法 -- Selenium。
Selenium 是用於自动化 Web 浏览器的工具,可以协助测试人员做自动化测试,也是可以抓网页内容的动态网页爬虫,常搭配 BeautifulSoup 解析 HTML 网页原始码。
换句话说,Selenium可以透过指令,模拟出使用者浏览网页的行为,包括:点击按钮、输入文字、滑动滚轮等。
Selenium主要有三项产品,分别是WebDriver、IDE和Grid,我们要用WebDriver来完成自动化的控制。
Selenium IDE也是满方便的工具,用於录制网页脚本,并提供回放功能,但我没有实际用过,有兴趣的人可以研究看看。
因为Anaconda预设没有Selenium套件,所以要先下载。
pip install selenium
为了让Selenium可以自动化控制浏览器,我们必须先安装浏览器的驱动程序(driver),这里提供两种方式,选一个自己习惯的方式就好。
我都以Chrome浏览器为例,其他浏览器麻烦自己Google找一下 ?。
chromedriver.exe
移到与程序相同的目录下。from selenium import webdriver
import time
# 开启下载的chromedriver
driver = webdriver.Chrome("./chromedriver")
# 等待10秒
time.sleep(10)
# 关闭浏览器
driver.quit()
pip install webdriver-manager
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()
webdriver_manager的优点在於它会自动根据你的Chrome下载正确的版本,就不必担心版本的问题了。两种方法大同小异,但我个人比较喜欢用第二种就是了。
下一步就是要登入Facebook,还记得我说过爬虫就是要模拟真人的行为吗? 想想看我们平常登入的流程是怎样?
所以,我们只要让程序做一样的事就好了!
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 年加入新创团队至今也超过七年了,过程中从未有过长假...
前言 当我们已经可以进入shioaji这个厨房,却发现用来烹饪的厨具都锁在架上,我们只能用一些简单的...
接续昨天的专案,创建好负责管理资料库的 model 之後,接着我们今天要来建立 Serializer...
工程师A: 觉得当工程师好累 想换一行怎麽办 工程师B: 按一下 enter 啊 工程师A:......
一. BOW BOW的全名为Bag-of-words,中文是'一袋文字',意思就是将词都丢进一个袋子...