Day 21:专案04 - Facebook爬虫02 | Selenium

昨天结束在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 Porting (一点三?)

今天,我们要来作Alpine Linux的initramfs bootstrapping。 在近代的...

[想试试看JavaScript ] 资料型态 数字 布林 undefined null

资料型态 number 数字 number 就是数字。跟字串需要引号不同,直接输入数字就可以了。 v...

Day 02 :zsh 与 shell script

更新: 我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面...

为了转生而点技能-JavaScript,day22(Arrow Function介绍

箭头函式(arrow Function): 前提:需为函式表达式。 方法: function省略并在...

命令提示字元--CMD那麽好用你不学一下吗?

这是算是一个被我忽略的工具,赛程中时不时提起,直到铁人赛快结束我才想起来,这项工具也是该介绍的,他就...