1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        爬蟲必備,案例對比 Requests、Selenium、Scrapy 爬蟲庫!

        共 7062字,需瀏覽 15分鐘

         ·

        2021-09-29 09:16

        經(jīng)常有讀者會爬蟲學(xué)哪個庫?其實(shí)常用的 Python 爬蟲庫無非是requestsseleniumscrapy,且每個庫都有他們的特點(diǎn),對于我來說沒有最推薦的庫只有最合適庫,本文就將基于一個簡單的爬蟲案例(Python爬取起點(diǎn)中文網(wǎng))來對比分析(從時間角度)三個庫

        目標(biāo)需求為批量采集排行榜書籍信息,如下圖所示:

        頁面結(jié)構(gòu)很容易分析出來,排行榜100條書籍信息,一個靜態(tài)頁面包含20條數(shù)據(jù)。使用不同的第三方庫進(jìn)行數(shù)據(jù)解析并提取數(shù)據(jù),分別是:

        • requests
        • selenium
        • Scrapy

        然后再邏輯代碼的開頭和結(jié)尾加上時間戳,得到程序運(yùn)行時間,進(jìn)行效率對比。

        這里由于都是使用xpath提取數(shù)據(jù),三種方式xpath語句大同小異,這里提前數(shù)據(jù)解析說明:

        1. imgLink: //div[@class='book-img-text']/ul/li/div[1]/a/@href
        2. title:  //div[@class='book-img-text']/ul/li//div[2]/h4/a/text()
        3. author:  //div[@class='book-img-text']/ul/li/div[2]/p[1]/a[1]/text()
        4. intro:  //div[@class='book-img-text']/ul/li/div[2]/p[2]/text()
        5. update://div[@class='book-img-text']/ul/li/div[2]/p[3]/a/text()

        一、requests

        首先導(dǎo)入相關(guān)庫

        from lxml import etree
        import requests
        import time

        邏輯代碼如下

        start = time.time()                 # 開始計(jì)時?

        url = 'https://www.qidian.com/rank/yuepiao?style=1&page=1'
        headers = {
        'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
        }

        page = requests.get(url,headers=headers)
        html = etree.HTML(page.content.decode('utf-8'))
        books = html.xpath("http://div[@class='book-img-text']/ul/li")

        for book in books:
            imglink = 'https:' + book.xpath("./div[1]/a/@href")[0]
         # 其它信息xpath提取,這里省略 ....
            update = book.xpath("./div[2]/p[3]/a/text()")[0]
            print(imglink,title,author,intro,update)

        end = time.time()                  #  結(jié)束計(jì)時?

        print(end-start)

        程序運(yùn)行結(jié)果如下

        可以看到用時 0.823s 將全部數(shù)據(jù)爬取下來。

        二、 selenium

        首先導(dǎo)入相關(guān)庫

        import time
        from selenium import webdriver

        代碼實(shí)現(xiàn)如下

        url = 'https://www.qidian.com/rank/yuepiao?style=1&page=1'

        start = time.time()                 # 開始計(jì)時?
        driver = webdriver.Chrome()
        driver.get(url)
        books = driver.find_elements_by_xpath("http://div[@class='book-img-text']/ul/li")

        for book in books:
            imglink = 'https:' + book.find_element_by_xpath("./div[1]/a").get_attribute('href')
         # 其它小說信息的定位提取語句,...
            update = book.find_element_by_xpath("./div[2]/p[3]/a").text
            print(imglink,title,author,intro,update)

        end = time.time()                   #  結(jié)束計(jì)時?

        print(end-start)
        # 18.564752340316772

        運(yùn)行結(jié)果如下

        可以看到時間是18.8174s

        三、Scrapy

        最后是 Scrapy 實(shí)現(xiàn),代碼如下

        import scrapy
        import time


        class QdSpider(scrapy.Spider):
            name = 'qd'
            allowed_domains = ['qidian.com']
            start_urls = ['https://www.qidian.com/rank/yuepiao?style=1&page=1']


            def parse(self, response):
                start = time.time()               # 開始計(jì)時?

                books = response.xpath("http://div[@class='book-img-text']/ul/li")

                for book in books:
                    imglink = 'https:' + book.xpath("./div[1]/a/@href").extract_first()
                    # 其它信息的xpath提取語句,......
                    update = book.xpath("./div[2]/p[3]/a/text()").extract_first()
                    print(imglink, title, author, intro, update)

                end = time.time()               #  結(jié)束計(jì)時?

                print(end - start)

        運(yùn)行結(jié)果如下

        可以看到運(yùn)行時間僅僅用了0.016s

        四、結(jié)果分析

        代碼量來看的話:其實(shí)代碼量相差不大,因?yàn)閷?shí)現(xiàn)邏輯比較簡單。

        但從運(yùn)行時間來看的話:scrapy 是最快的只花了0.02s不到,selenium 是最慢的,花了將近20s,運(yùn)行效率是 scrapy 的1/1000。不過scrapy開發(fā)、調(diào)試代碼的時間相比于 requests、selenium 回長一點(diǎn),

        在仔細(xì)研究一下原因

        requests:requests模擬瀏覽器的請求,將請求到的網(wǎng)頁內(nèi)容下載下來以后,并不會執(zhí)行js代碼。

        selenium為什么最慢:首先Selenium是一個用于Web應(yīng)用程序自動化測試工具,Selenium測試直接運(yùn)行在瀏覽器中(支持多種瀏覽器,谷歌,火狐等等),模擬用戶進(jìn)行操作,以得到網(wǎng)頁渲染之后的結(jié)果,selenium解析執(zhí)行了網(wǎng)頁CSS,js代碼,所以效率較低。

        scrapy框架爬取效率最高:首先同requests一樣,scrapy它也沒有執(zhí)行網(wǎng)頁js代碼,但是我們知道scrapy他說一個提取結(jié)構(gòu)性數(shù)據(jù)的應(yīng)用框架,Scrapy使用了Twisted異步網(wǎng)絡(luò)框架,可以加快我們的下載速度,并發(fā)性好,性能較高,所以它的效率最高。

        五、補(bǔ)充

        通過上面的簡單測試,我們可能會覺得selenium效率如此低下,是不是數(shù)據(jù)采集不太常用selenium?只能說在能夠爬取到數(shù)據(jù)的前提下,采集效率高的方式才會作為首選。

        所以本文的目的不是為了說明不要使用selenium,接下來我們看看招聘網(wǎng)站--拉勾招聘的頁面數(shù)據(jù)采集。隨機(jī)選擇一個崗位java,頁面如下:

        5.1 requests實(shí)現(xiàn)

        如果是用 requests 請求數(shù)據(jù)

        你會發(fā)現(xiàn)并沒有數(shù)據(jù),網(wǎng)頁做了反爬處理,這時候selenium就派上用場了,不用分析網(wǎng)站反爬方式,直接模擬用戶請求數(shù)據(jù)(大多數(shù)情況下,也有針對selenium的反爬手段)

        5.2 selenium實(shí)現(xiàn)

        如上文所說,如果是用 requests 或者 scrapy爬蟲發(fā)現(xiàn)有反爬措施,可以嘗試selenium,有時會異常簡單

        from selenium import webdriver

        url = 'https://www.lagou.com/zhaopin/Java/?labelWords=label'

        driver = webdriver.Chrome()
        driver.get(url)
        items = driver.find_elements_by_xpath("http://ul[@class='item_con_list']/li")
        print(len(items))
        for item in items:
            title = item.find_element_by_xpath("./div[1]/div[1]/div[1]/a/h3").text
            print(title)

        運(yùn)行結(jié)果如下:

        很輕松就提取到了頁面的數(shù)據(jù)!

        所以根據(jù)本文的案例分析,如果有爬蟲需求時,將方法定格在某一個方法并非是一個很好的選擇,大多情況下我們需要根據(jù)對應(yīng)網(wǎng)站/app的特點(diǎn)以及具體需求,來綜合判斷,挑選出最合適的爬蟲庫!


        萬水千山總是情,點(diǎn)個 ?? 行不行。




        推薦閱讀:

        入門: 最全的零基礎(chǔ)學(xué)Python的問題  | 零基礎(chǔ)學(xué)了8個月的Python  | 實(shí)戰(zhàn)項(xiàng)目 |學(xué)Python就是這條捷徑


        量化定投基金到底能賺多少錢?  | 我用Python對去年800只基金的數(shù)據(jù)分析  


        干貨:爬取豆瓣短評,電影《后來的我們》 | 38年NBA最佳球員分析 |   從萬眾期待到口碑撲街!唐探3令人失望  | 笑看新倚天屠龍記 | 燈謎答題王 |用Python做個海量小姐姐素描圖 |碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


        趣味:彈球游戲  | 九宮格  | 漂亮的花 | 兩百行Python《天天酷跑》游戲!


        AI: 會做詩的機(jī)器人 | 給圖片上色 | 預(yù)測收入 | 碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


        小工具: Pdf轉(zhuǎn)Word,輕松搞定表格和水??! | 一鍵把html網(wǎng)頁保存為pdf!|  再見PDF提取收費(fèi)! | 用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換 | 制作一款釘釘?shù)蛢r機(jī)票提示器! |60行代碼做了一個語音壁紙切換器天天看小姐姐!


        年度爆款文案


        點(diǎn)閱讀原文,領(lǐng)AI全套資料!

        瀏覽 29
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            午夜插午夜日 | 色呦呦一区二区三区 | 无码人妻一区二区三区99v | 日韩成人久久 | 黄色免费在线观看 | 91麻豆精产国品一二三产品 | 欧美三区四区 | 88国产精品视频一区二区三区 | 在线观看免费人成a片 | 大鸡吧影视 |