關閉

                  寫爬蟲,到底是選scrapy還是selenium呢

                  發表于:2021-9-06 09:41

                  字體: | 上一篇 | 下一篇 | 我要投稿

                   作者:職說測試    來源:掘金

                    背景故事
                    那會兒,作者正在...冥想,微信突然彈出前領導的消息,頓時心里有點小激動,以為是要拉兄弟一把,升職加薪!!!
                    結果一看,嗯,原來是個活兒,發來一個視頻,類似爬蟲的桌面應用,從某音爬取數據,并找到對應評論的某人私信!
                    可以是說是批量給視頻評論的人私信推銷產品,如果他們找過來,然后完成交易,達成轉化!問我實現的成本有多大?
                    說干就干
                    第一點,對于爬蟲這類事情,作者是即開心又緊張,心理總有些小興奮。
                    騙人的!!!
                    其實腦海里面立即給出多個解決方案:使用什么技術呢?怎樣才能更出色的做好呢?
                    方案:
                    python熟知的scrapy爬蟲框架,使用起來真的很棒、很不錯!!!
                    但是作者是個測試工程師,不是爬蟲工程師,爬蟲只是偶爾的興趣愛好!!!
                    重點是作者僅僅粗略自學過一段scrapy框架,現在要用起來還得從零開始。
                    那么通過F12瀏覽器調試工具,可以使用接口來爬取數據嗎?結果大失所望!!!
                    因為直接requests.get(url)請求會提示錯誤,并沒有數據返回。
                    仔細一看發現請求參數中有個加密參數,所以每次瀏覽器請求都會不一樣,如果不知道規則,也就無法通過這種方式爬數據。
                    既然作者是枚測試人員,那么UI自動化測試中的selenium工具,是不是可以用呢?
                    是的,辦法總比困難多。
                    使用selenium來爬取某音的視頻數據
                    前提條件:使用者必須有python基礎及xpath語法且有自動化思想。
                    # 準備python+selenium環境;下載對應chrome瀏覽器的版本驅動;先準備一個demo測試一下,是否能正常使用!
                    from selenium import webdriver
                    driver=webdriver.Chrome(executable_path="../chromedriver.exe")
                    driver.implicitly_wait(30)
                    driver.maximize_window()
                    driver.get("http://www.baidu.com")
                    # do somethings
                    driver.quit()
                    如果是目標明確,直接在瀏覽器中打開官網,搜索關鍵字得到url<如下代碼演示>
                    '''
                    Created on 2021年7月22日
                    @author: qguan
                    '''
                    import re
                    from time import sleep
                    from selenium import webdriver
                    # 初始化驅動對象 
                    driver=webdriver.Chrome(executable_path="../chromedriver.exe")
                    driver.implicitly_wait(30)
                    driver.maximize_window()
                    # 打開目標網址 
                    url="https://www.xxxxyin.com/search/%E4%B8%8A%E6%B5%B7%E6%95%B4%E5%9E%8B"
                    driver.get(url)
                    # 可能是反扒的原因,有拼圖驗證
                    sleep(5) # 這里手動,用于測試
                    # 可以使用圖像處理,處理滑塊驗證 
                    # 最后當然是使用無頭模式
                    # 獲取當前句柄,后面頁面切換使用
                    # handler=driver.current_window_handle
                    # 獲取當前結果頁的所有元素集
                    video_pic=driver.find_elements_by_xpath("http://div[@style='display: block;']/ul/li/div/a[1]")
                    # 計數器
                    i=1
                    for video in video_pic:
                        # 遍歷點擊元素
                        video.click()
                        # 獲取瀏覽器所有句柄
                        handlers=driver.window_handles
                        # 切換最新的那一個
                        driver.switch_to_window(handlers[-1])
                        
                        # 獲取跳轉頁面元素:標題、點贊、評論、發布時間、用戶名
                        titles=driver.find_elements_by_xpath("http://div/div[2]/div[1]/div[1]/div[1]/div[2]/h1/span[2]/span/span/span/span")
                        if len(titles)>0:
                            title=""
                            for tit in titles:
                                title+=tit.text
                        else:
                            title="沒有獲取到完整的title"
                        
                        praise=driver.find_element_by_xpath("http://div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[1]/div[1]/span").text
                        comment=driver.find_element_by_xpath("http://div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[1]/div[2]/span").text
                        open_time=driver.find_element_by_xpath("http://div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[2]/span").text
                        
                        # 視頻作者名稱
                        username=driver.find_element_by_xpath("http://div/div[2]/div[1]/div[2]/div/div[1]/div[2]/a/div/span/span/span/span/span")
                        
                        # 點擊用戶名跳轉用戶詳情頁
                        username.click()
                        
                        # 獲取當前頁的url地址后,就關閉當前頁面
                        c_url=driver.current_url
                        driver.close() # 為什么關閉不了
                        
                        param_url=c_url.split("?")[1] # 拆分url地址?拼接的參數
                        # 正則匹配,提取用戶視頻id、用戶id
                        author_id=re.findall("(\d{11})",param_url)[0]
                        group_id=re.findall(r"(\d{19})",param_url)[0]
                        
                        # 控制臺輸出結果
                        print("第{}條,視頻title:{},作品id:{},用戶id:{},評論數:{},點贊數:{},發布時間:{}".format(i,title,group_id,author_id,comment,praise,open_time))
                        
                        # 切換第一頁
                        driver.switch_to_window(handlers[0])
                        
                        i+=1 # 計數器加1
                         
                    # 退出driver驅動
                    driver.quit()
                    將結果輸出在控制臺,爬取關鍵信息如下:
                    總結
                    從工具易用性來講爬蟲,selenium不如scrapy,主要體現在scrapy方便數據庫操作,功能更直接。
                    selenium需要熟知元素定位方案,還需要解決更多ui層的問題;連數據庫建表都需要親力親為;可能還需要搭配其他框架來解決某些問題。
                    從學習成本角度來說,只要能快速解決問題的工具就是好工具,歡迎讀者更多交流。

                    本文內容不用于商業目的,如涉及知識產權問題,請權利人聯系51Testing小編(021-64471599-8017),我們將立即處理
                  《2023軟件測試行業現狀調查報告》獨家發布~

                  關注51Testing

                  聯系我們

                  快捷面板 站點地圖 聯系我們 廣告服務 關于我們 站長統計 發展歷程

                  法律顧問:上海蘭迪律師事務所 項棋律師
                  版權所有 上海博為峰軟件技術股份有限公司 Copyright©51testing.com 2003-2024
                  投訴及意見反饋:webmaster@51testing.com; 業務聯系:service@51testing.com 021-64471599-8017

                  滬ICP備05003035號

                  滬公網安備 31010102002173號

                  亚洲欧洲自拍图片专区123_久久久精品人妻无码专区不卡_青青精品视频国产色天使_A免看的日黄亚洲