昨天结束在Facebook登入之後,今天就接续昨天的内容,以木棉花的粉丝专页为例,来讲怎麽爬下来贴文的内容吧!
time.sleep(5)
# 进入木棉花专页
driver.get("https://www.facebook.com/emuse.com.tw")
time.sleep(5)
其实就跟昨天一样,使用get()
函数进到木棉花的粉专。
time.sleep()
设定延迟是为了让Facebook有处理资料的时间,这点在使用Selenium时很重要,如果你都不给延迟时间,就有可能因为资料还没载入而出错。
昨天已经讲过了Facebook必须往下滑动才会载入资料,所以现在就要让Selenium模拟出使用者滑鼠往下滑动的行为。
# 往下滑3次,让Facebook载入文章内容
for x in range(3):
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
print("scroll")
time.sleep(5)
这边是让Selenium执行JavaScript的程序,虽然我没有讲过JavaScript,但你只要知道这段程序就是控制浏览器向下滑1页。而且每次下滑後都要给一点延迟时间载入资料。
接下来,我们对贴文右键>>检查,发现到内容放在一个class="kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x c1et5uql ii04i59q"
的<div>
中。
再往下看,每一行文字都是放在dir="auto"
的<div>
中。
好,那麽程序码就是这样。
# 定位文章标题
titles = soup.find_all(
"div", class_="kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x c1et5uql ii04i59q")
for title in titles:
# 定位每一行标题
posts = title.find_all("div", dir="auto")
# 如果有文章标题才印出
if len(posts):
for post in posts:
print(post.text)
print("-" * 30)
执行结果:
呀咧呀咧,发现今天的内容有点太少了,再加码讲个下载图片好了。
首先,我们观察到Facebook的图片有两种,一种是单纯一张图片,另一种是相簿,然後这两种的class分别是"i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm bixrwtb6"
和"i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm"
。
所以就用find_all()
搜寻所有的图片吧! 将两种class放在list中就可以了。
images = root.find_all(
"img", class_=["i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm bixrwtb6", "i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm"])
下载图片前,我们要先取得图片的来源位置,就放在src
属性中,并且用requests将图片内容给抓下来。接着,我们要在我们的电脑中开启新档来存这个图片,因为我们知道图片其实就是由很多pixel所组成的二进位档案,所以模式要设为wb。最後,将图片内容写进档案就完成了!
因为档名如果相同的话会被覆盖过去,所以给每张图片一个流水号。另外,因为图片应该会满多的,所以将图片集中储存在images这个资料夹内。
# 下载图片
images = root.find_all(
"img", class_=["i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm bixrwtb6", "i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm"])
if len(images) != 0:
for index, image in enumerate(images):
img = requests.get(image["src"])
with open(f"images/img{index+1}.jpg", "wb") as file:
file.write(img.content)
print(f"第 {index+1} 张图片下载完成!")
成果展示:
今天继续昨天的Facebook爬虫,用更进阶的技巧模拟使用者下滑的动作,後来又回到熟悉的BeautifulSoup解析原始码,取得贴文的内容以及下载图片~
Selenium部分就介绍到这边,其实还有很多东西可以玩,不过就给大家自己去探索罗! 明天要来讲另外一种进阶的爬虫方式 -- AJAX,敬请期待~~
如果喜欢这系列文章麻烦帮我按Like加订阅,你的支持是我创作最大的动力~
本系列文章以及范例程序码都同步更新在GitHub上,後续会持续的更新,如果喜欢也麻烦帮我按个星星吧~
有任何问题或建议,都欢迎在底下留言区提出,还请大家多多指教。
>>: AI ninja project [day 26] QLattice -- 基础回归
今天,我们要来作Alpine Linux的initramfs bootstrapping。 在近代的...
资料型态 number 数字 number 就是数字。跟字串需要引号不同,直接输入数字就可以了。 v...
更新: 我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面...
箭头函式(arrow Function): 前提:需为函式表达式。 方法: function省略并在...
这是算是一个被我忽略的工具,赛程中时不时提起,直到铁人赛快结束我才想起来,这项工具也是该介绍的,他就...