爬取instagram留言 - Selenium

这边我是打API爬的,所以先写了序列化:

class IgCommentsSerializer(serializers.Serializer):
    post = serializers.CharField(max_length=1000)
    poster = serializers.CharField(max_length=200)

一开始先写selenium的webserver基本设定,要抓取全部留言的话需先登入完ig,再跳转到要的post页面:

class IgComments(APIView):
    def __init__(self):
        self.path = 'chromedriver的路径'
        self.sbaccount = '帐号'
        self.sbpd = '密码'

    def post(self, request):
        options = Options()
        options.add_argument("--headless") # 执行时浏览器只在背景执行
        driver = webdriver.Chrome(self.path, options=options)
        driver.implicitly_wait(3)
        driver.get('https://www.instagram.com/') 
        time.sleep(2)
        account = driver.find_elements_by_name('username')[0]
        pd = driver.find_elements_by_name('password')[0]
        # 登入
        account.send_keys(self.sbaccount)
        pd.send_keys(self.sbpd)
        driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[3]/button').click()  
        time.sleep(3)
        driver.get('https://www.instagram.com/p/CYXqAMuBX0e/') # 直接跳转到post
        more_xpath = '//*[@id="react-root"]/section/main/div/div[1]/article/div/div[2]/div/div[2]/div[1]/ul/li/div/button/div'
        time.sleep(2)

ig一次只会载入12则留言(我没记错的话XD),这边需要借助selenium的力量,自动化点选更多留言按钮。而为了要抓取所有留言,这边透过while回圈直到没有更多留言按钮可点选,之後就可以一次性地抓取所有留言文字了:

...接下上部分程序码...
        while True:
            try:
                time.sleep(2)
                driver.find_element_by_xpath(more_xpath).click()
                print('下一页')
            except:
                print('最後一页')
                break
        crawl_comments = []
        comments = driver.find_element_by_class_name("XQXOT").find_elements_by_class_name("Mr508")
        n = 1
        for c in comments:
            poster = c.find_element_by_css_selector('h3._6lAjh span').text
            post_xpath = f'//*[@id="react-root"]/section/main/div/div[1]/article/div/div[2]/div/div[2]/div[1]/ul/ul[{n}]/div/li/div/div/div[2]/span'.format(n=n)
            time.sleep(2)
            post = c.find_element_by_xpath(post_xpath).text
            crawl_comments.append({'poster':poster, 'post':post})
            n+=1
        ser = IgCommentsSerializer(crawl_comments, many=True)
        return Response(ser.data)

<<:  【Git】 发 PR 是什麽?

>>:  Oracle Row to Column 函式介绍

Day 10 : 案例分享(3.3) 会计模组-调节、立冲帐、应收付与收支款

案例说明及适用场景 当我们有某一个科目,需要管理他是否还有余额未被处理,这个科目就是所谓的 调节科目...

App 在发布到play商店後 Firebase Authentication 无法登入问题解决

身为一个App的开发新手常常会遇到一些莫名其妙又难以解决的问题,直到找到问题答案才发现根本是自己愚蠢...

【2022 Mac必学】五 个方法救回 Word 当机未保存的文档

软件当机每次来得都是猝不及防,Word 也不例外。辛辛苦苦在 Word 编辑的文档因突然当机丢失了,...

MySQL 字串类型资料之基本操作

VARCHAR & CHAR VARCHAR(0-65535)/CHAR(0-255)差别於...

DAY 10 Big Data 5Vs – Velocity(多样性) DynamoDB

对於「半结构化」类型的资料可以存放至NoSQL 资料库*之中。NoSQL 资料库常见於需要较快写入速...